用一个例子说明:
服务器:192.168.0.121:27896
中转机:192.168.0.163:27896
在192.168.0.121
的端口27896上开启了一个服务器,我希望访问中转机192.168.0.163
的27896也可以访问到192.168.0.121:27896
。
需要在163
这台机器上配置两条iptables规则:
iptables -t nat -A PREROUTING -p tcp -d 192.168.0.163 --dport 27896 -j DNAT --to-destination 192.168.0.121:27896
iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.121 --dport 27896 -j SNAT --to-source 192.168.0.163
第一条规则是,对于目的地址是192.168.0.163
并且目的端口是27896的数据包,将其目的地址改为192.168.0.121:27896
,然后再路由转发出去。
第二条规则是,对于目的地址是192.168.0.121
并且目标端口是27896的数据包,将其源地址改为192.168.0.163
。
这两条规则的原理是:
对于到达192.168.0.163:27896
的数据包,在被路由转发之前,更改目的地址,让它从网卡转发出去,而不是留在本地。此时,它的目的地址已经改了,但是源地址还是远程地址。
这个数据包随后到达POSTROUTING链,将其源地址改成192.168.0.163,发送给192.168.0.121。不然,原来是个远程地址,会导致服务器回应的包被发送到远程地址,而不是中转机。