+86 135 410 16684Mon. - Fri. 10:00-22:00

Dnat教程&阿里云服务器如何配置端口映射

Dnat教程&阿里云服务器如何配置端口映射

Dnat教程&阿里云服务器如何配置端口映射

通过iptables配置Dnat是一个比较常见的操作,阿里云的服务在classic网络下无法支持snat,但是dnat实际是没问题的,这里罗列一下操作过程:
实验环境两台阿里云ECS服务器 ,一台公网,一台内网。内网安装nginx,希望访问公网服务器的时候,能够访问到内网的nginx站点。

内网服务器操作过程如下:
首先安装nginx和启动

[root@内网 ~]# yum install nginx -y >>/dev/null

[root@内网 ~]# /etc/init.d/nginx start

Starting nginx: [ OK ] [root@内网 ~]# lsof -i:80

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

nginx 1742 root 6u IPv4 5570 0t0 TCP *:http (LISTEN)
测试nginx安装正常,可以访问。

[root@内网 ~]# curl -I localhost

HTTP/1.1 200 OK

Server: nginx/0.8.55

Date: Wed, 14 Jan 2015 07:29:05 GMT

Content-Type: text/html

Content-Length: 3698

Last-Modified: Tue, 11 Nov 2014 16:30:06 GMT

Connection: keep-alive

Accept-Ranges: bytes
公网服务器操作如下:
首先修改内核参数,开启ip转发

[root@公网 ~]# sed -i ‘s/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g’ /etc/sysctl.conf

应用生效

[root@公网 ~]# sysctl -p

net.ipv4.ip_forward = 1
配置iptables,将访问公网服务器80端口的请求,转发到内网服务器的80

[root@公网 ~]# iptables -t nat -I PREROUTING -d 115.29.96.246 -p tcp –dport 80 -j DNAT –to 10.144.26.11:80
这时候我们访问公网服务器IP测试一下,同时抓包看转发后的数据包情况:

15:35:46.602240 IP 42.120.74.108.8864 > 115.29.96.246.80: S 765781831:765781831(0) win 8192

15:35:46.602272 IP 42.120.74.108.8864 > 10.144.26.11.80: S 765781831:765781831(0) win 8192
这样原地址是访客的公网IP,目标是内网服务器的内网地址,这样也没办法双向通讯啊,所以,需要让这个数据包的原地址,也变成内网地址,这样才能和内网服务器建立通讯。
修改原地址就是SNAT
我们继续在公网服务器配置:

[root@公网 ~]# iptables -t nat -I POSTROUTING -d 10.144.26.11 -p tcp –dport 80 -j SNAT –to 10.163.209.59
抓包分析:

15:38:14.846955 IP 42.120.74.108.10839 > 115.29.96.246.80: P 433:858(425) ack 159 win 16385

15:38:14.846985 IP 10.163.209.59.10839 > 10.144.26.11.80: P 433:858(425) ack 159 win 16385

15:38:14.847759 IP 10.144.26.11.80 > 10.163.209.59.10839: P 159:317(158) ack 858 win 317

15:38:14.847772 IP 115.29.96.246.80 > 42.120.74.108.10839: P 159:317(158) ack 858 win 317
访客本地公网->公网服务器公网IP
修改目标地址
公网服务器内网IP->内网服务器IP
修改原地址
内网服务器IP->公网服务器内网IP
公网服务器公网IP->访客本地公网

完成通讯,试试看。

北京 上海 天津 重庆 河北 山东 辽宁 黑龙江 吉林 甘肃 青海 河南 江苏 湖北 湖南 江西 浙江 广东 云南 福建 海南 山西 四川 陕西 贵州 安徽 广西 内蒙古 西藏 新疆 宁夏 澳门 香港 台湾