图1
如图1所示,有A,B两台计算机,其中A配置成普通PC,B是网关。
实现由A向一个不存在的IP 发起tcp连接,并能向这个不存在的ip发送数据。
同时响应这个tcp连接的是B中的一个应用程序。
图2
如图2所示,A为普通PC,系统为32位WIN7,内装WireShark,CM网络调试助手。
B也是普通PC,系统为32位 Ubuntu14.04,内置WireShark,mNetAssist 网络调试助手。
A,B使用普通网线直连,网络配置如图2。
图3
iptables防火墙可以用于创建过滤(filter)与NAT规则。
所有Linux发行版都能使用iptables,因此理解如何配置iptables将会帮助你更有效地管理Linux防火墙。
Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
- INPUT链 – 处理来自外部的数据。
- OUTPUT链 – 处理向外发送的数据。
- FORWARD链 – 将数据转发到本机的其他网卡设备上。
NAT表有三种内建链:
- PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。
它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
- POSTROUTING链 – 处理即将离开本机的数据包。
它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
- OUTPUT链 – 处理本机产生的数据包。
Mangle表用于指定如何处理数据包。
它能改变TCP头中的QoS位。
Mangle表具有5个内建链:
- PREROUTING
- OUTPUT
- FORWARD
- INPUT
- POSTROUTING
Raw表用于处理异常,它具有2个内建链:
- PREROUTING chain
- OUTPUT chain
- Rules包括一个条件和一个目标(target)
- 如果满足条件,就执行目标(target)中的规则或者特定值。
- 如果不满足条件,就判断下一条Rules。
iptables –list查看当前系统存在的规则
iptables –flush 或者iptables –F 删除现有的所有iptables规则
iptables -t NAT –F 删除 NAT表内的规则3.3.1 iptables语法
-t 表示table,代表iptable的哪种内建表。
如iptables -t NAT(指 *** 作NAT内建表)
-A 表示Append,代表新的规则将追加到链的名称, 如iptables -t nat -A PREROUTING(在NAT内建表中的PREROUTING链添加规则)
-d 表示Destination 标地址或者网络地址,如-d 192.168.2.3(ip数据报的目的地址是192.168.2.3的帧),-d 192.168.2.1/24(ip数据报的目标地址为192.168.2.X的所有帧)
-s 表示source 源地址或者网络地址 同-d配置一样
-p 表示protocol 议, 如-p udp(udp协议)
--dport 表示目标端口,只有使用了-p 才可以使用—dport或者—sport(源端口) 如
-p udp --sport 20008(upd协议的数据报并且 源端口是20008的帧)
--sport 源端口
-j 表示 jump to target 执行目标,-j之前都属于包的过滤条件,-j后是指对指定的数据报的 *** 作,如-j SNAT(对过滤后的指定包 进行源地址替换)
--to 替换后的目标值 如-j SNAT --to 192.168.2.3:20008(把源地址的ip地址替换为192.168.2.3,端口替换为20008)-j DNAT --to 192.168.2.3(把过滤后的数据报的目的地址替换为192.168.2.3)
4. 实验图4
4.1 DNAT实验1,在B计算机的终端中 执行
sudo iptables -t nat -A PREROUTING -d 192.168.2.3 -j DNAT --to 192.168.1.1
(对所有目标地址是192.168.2.3的数据报的目标地址改为192.168.1.1) 也就是说 所有B计算机网卡收到的数据报中,有目标地址为192.168.2.3的ip数据报 全部变成了目标地址为192.168.1.1的ip数据报,然后再过路由。
2, 在A中打开CM网络调试助手,选择TCP Client ,目标地址为192.168.2.3,端口随便填,这里填写20003, 如图A-1。
在B中打开 mNetAssist 网络调试助手, 选择TCP服务器。
如图B-1
3,在B中打开服务器,A中连接,并发送aaa。
B中接收到后发送bbbb。
图A-1
图B-1
4,图A-1,B-1是实验结果图,在图B-1中我们可以看到 192.168.1.1确实收到了aaaaaa,同时wireshark中显示的是192.168.1.109向192.168.2.3发送的数据aaaa。
同时A中也可以接收到192.168.2.3回复的bbbb。
但是这个bbbb在程序的逻辑上是由192.168.1.1发出去的。
所以我猜想在做DNAT的实验的时候,192.168.1.1在回复数据时,必然被DNAT重新把ip改成了192.168.2.3。
1,在B中终端执行
sudo iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT --to 192.168.2.3
(对所有源地址为192.168.1.1的ip数据包,使其源地址为192.168.2.3),也就是说从B从发出去的ip数据报,没有一帧的源地址为192.168.1.1
2,把B配置成tcp 客户端,目标地址192.168.1.109 端口为20004。
把A机配置成TCP 服务器,端口为20004.
3,B机发送bbbb,可以在图A-2中发现A机收到了bbb ,但是收到的是192.168.2.3发过来的数据。
同时A机向192.168.2.3发送aaaa,A机收到数据。
图A-2
图B-2
4.3 UDP 指定端口 SNAT实验1,上面两个实验是针对对ip数据报。
这里我们对udp做SNAT。
在B机终端中执行
sudo iptables -t nat -A POSTROUTING -s 192.168.1.1 -p udp --sport 20008 -j SNAT --to 192.168.2.3:20008(所有从B机发出去的源地址为192.168.1.1的upd数据报,并且发送数据的端口为20008, 发出去之前源地址被改成192.168.2.3 端口同样为20008)
2,A机配置成udp,本机ip地址192.168.1.109,端口20006。
目标主机192.168.2.3,端口20008,B机配置成udp,本机ip地址192.168.1.1,端口20008。
目标主机192.168.1.109,端口20006,
3,B机发送bbbb,A机接收到192.168.2.3 的bbbb,A机发送aaaa,B机同样可以接受到aaaa
图A-3
图B-3
4.4 UDP 指定端口 DNAT实验1,在B机终端中执行
sudo iptables -t nat -A PREROUTING -d 192.168.2.3 -p udp --dport 20008 -j DNAT --to
192.168.1.1:20008
(所有发向B机的目的地址为192.168.2.3 并且端口为20008的upd,全部把目标地址改成192.168.1.1)
2,A机配置成udp,本机ip地址192.168.1.109,端口20006。
目标主机192.168.2.3,端口20008,B机配置成udp,本机ip地址192.168.1.1,端口20008。
目标主机192.168.1.109,端口20006,
3, A机发送aaaa,B机可以接受到192.168.2.3的aaaa。
同样B机发送bbbb,A机也可以收到bbb。
图A-4
图B-4
5. 结论Iptables的 DNAT,SNAT是既可以针对IP数据报,也可以针对udp协议(或者tcp协议)做NAT。
功能非常强大,详细功能可以参考图3。
但是要注意一点,SNAT,DNAT都是双向的。
也就是说你对B机做了SNAT,sudo iptables -t nat -A POSTROUTING -s 192.168.1.1 -p udp --sport 20008 -j SNAT --to 192.168.2.3:20008。
如果这时你用A机向192.168.2.3:20008发送udp数据包时,B机收不到数据。
如果你先用B机的192.168.1.1:20008向192.168.1.109:20006发送udp,然后再用A机机向192.168.2.3:20008发送udp数据包 B机才可以接受到数据。
这是因为无论SNAT,还是DNAT,要先由一段把数据链路打通,另一端才可以沿着这个链路把数据返回。
http://www.cnblogs.com/wangkangluo1/archive/2012/04/19/2457072.html
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)