SNAT&DNAT
在配置某神奇小软件时,有时候需要使用国内服务器进行中继。为了实现拓扑:
你家PC — SERV_A —> | WTF | — SERV_B —> Internet'
很多教程上会告诉你在SERV_A的iptables里添加如下规则:
iptables -t nat -A PREROUTING -p tcp --dport <PORT_A> -j DNAT --to-destination <IP_B>
iptables -t nat -A POSTROUTING -p tcp -d <IP_B> --dport <PORT_A> -j SNAT --to-source <IP_A>
从你家PC发出来的包原本应该是发往IP_A:PORT_A的。而上述规则实现了网络访问从“你家→SERV_B”到“SERV_A→SERV_B”的转变。具体来说:
- 对发往{PORT_A}的包,将收信地址通过DNAT改为{IP_B}(原本为IP_A)
- 对发往{PORT_A},且收信地址为{IP_B}的包(↑刚改完),将发信地址通过SNAT改为{IP_A}(原本为你家PC的IP)
由此观之,DNAT用来改收信地址,不改的话不知道转发给谁,SERV_A只能自己消化;SNAT用来改发信地址,不改的话SERV_B以为给自己发包的还是你家PC,给你家PC的IP(内网地址)回消息只能回个寂寞。
夹带私货
BIG-IP的“SNAT”全称叫“Secure Network Address Translation”……