运维服务小笔记

If not now,when?If not me,who?

一月 14th, 2015

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

1,970 views, linux, Server, by 川望.

通过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->访客本地公网

完成通讯,试试看。

 



Back Top

发表评论

电子邮件地址不会被公开。 必填项已用*标注

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。

无觅相关文章插件,快速提升流量