Linux / 网络工程 · 1 3 月, 2021 0

从某中继服务器学习SNAT与DNAT

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”……