标签:
工作使用到iptables的NAT地址转换功能;目前找到最好的帮助理解的图:
要实现的功能是,PC1通过Server访问内网PC2的8180端口提供的服务:
一、开启Server的ip_forward功能
sudo vim /etc/sysctl.conf
开启 net.ipv4.ip_forward=1 配置项
启用配置 sysctl -p
验证之 cat /proc/sys/net/ipv4/ip_forward (1为启用,0为关闭)
二、规则
iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp -m tcp --dport 81 -j DNAT --to-destination 192.168.0.2:8180
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.2 -p tcp -m tcp --dport 8180 -j SNAT --to-source 192.168.0.1
三、规则解释
PC1的IP地址为6.7.8.9,它使用本机的1080端口连接Server 1.2.3.4的81端口;发出的IP包源地址为6.7.8.9,源端口为1080,目的地址为1.2.3.4,目的端口为81;
Server 1.2.3.4接收到这个包后,根据NAT表的第一条规则,将该IP包的目的地址更该为192.168.0.2,目的端口更该为8180,同时在“连接跟踪表”(/proc/net/ip_conntrack)中创建一个条目,然后发送到路由模块,通过查路由表,确定该IP包应发送到eth1接口;在向eth1接口发送该IP包之前,根据NAT表的第二条规则,如果该IP包来自同一子网,则将该IP包的源地址更该为 192.168.0.1,同时更新该“连接跟踪表”中的相应条目,然后送到eth1接口发出到PC2;
此时“连接跟踪表”中有:
连接进入: src=6.7.8.9 dst=1.2.3.4 sport=1080 dport=81
连接返回: src=192.168.0.2 dst=6.7.8.9 sport=8180 dport=1080
是否使用: use=1
从PC2 192.168.0.2发回的IP包,源端口为8180,目的地址为6.7.8.9,目的端口为1080,主机1.2.3.4的TCP/IP协议栈接收到该IP包后,查找“连接跟踪表”中的连接返回栏目中是否有同样源和目的地址和端口的匹配项,找到后,根据条目中的记录将IP包的源地址由192.168.0.2更该为1.2.3.4, 源端口由8180更该为81,保持目的端口号1080不变;这样服务器的返回包就可以正确的返回发起连接的客户机,至此通信建立。
标签:
原文地址:http://my.oschina.net/zangzy/blog/394451