现有需求在不切换root的前提下使用102端口。 虽然方法有很多,但由于内核版本,系统限制等因素,决定使用iptables实现。 已知: 客户端A的ip地址:192.168.49.128 服务器B的ip地址:192.168.49.4 要求A与B建立tcp连接,且双方端口都为102。 linux规定普通用户下无法bind1024以下端口。于是使用iptables将B主机102端口转发至9102端口。 于B主机配置规则:
iptables -t nat -I PREROUTING -p tcp --dport 102 -j DNAT --to-destination 192.168.49.4:9102DNAT:Destination Network Address Translation目的地址转换
对于所有远程发送至或经过B主机的数据包,如果其目标端口为102,则转发至192.168.49.4:9102,即转发至B主机9102端口。
让B主机监听9102端口,A主机102端口连接至B主机的102端口,发现tcp成功连接。 疑问: 1.A主机是与B主机的102端口还是9102端口建立的tcp连接? 2.B主机对于发出的数据包没有配置NAT规则,发出的数据包源端口是什么,为什么还可以建立连接?
使用tcpdump在A主机抓包分析
tcpdump -n host 192.168.49.4得到如下报文:
IP 192.168.49.128.102 > 192.168.49.4.102: Flags [S], seq 4108063512 IP 192.168.49.4.102 > 192.168.49.128.102: Flags [S.], seq 2098908917, ack 4108063513 IP 192.168.49.128.102 > 192.168.49.4.102: Flags [.], ack 1分析可知这是tcp三次握手,第三记录使用了相对值。 发现B主机传出的数据包端口为102。
得知: 1.A主机与B主机的102端口建立tcp连接。 2.发出的数据包源端口为102,在A主机的视角看来,没有问题。
疑问: 为什么B主机发出的数据包源端口是102。
查找资料得知防火墙会对返回来的包做一次Un-DNAT,即将源端口9102改为102。且如果一个包被匹配了,那么和它属于同一个流的所有的包都会被自动转换。