关于iptables NAT的一个问题

考虑这样一个情况:

某台设备拥有公网IP A.B.C.D,同时作为OpenVPN客户端连接到IP为E.F.G.H的OpenVPN服务器,并且设置route将OpenVPN服务器作为本机的默认网关(本地设备和OpenVPN服务器上都配置了ip forwarding和iptables MASQUERADE/SNAT)。

当这台设备主动连接Internet上的某个IP I.J.K.M时,I.J.K.M所看到的访问请求来源是E.F.G.H,而它发送给E.F.G.H的响应reverse SNAT后被转发给A.B.C.D,完成了一次双向通信。

而如果是I.J.K.M主动连接A.B.C.D的某个开放的端口昵?A.B.C.D响应的数据包,根据route规则,会通过OpenVPN的tun设备发送。问题是,这个响应的数据包是否会做SNAT(将source地址由A.B.C.D改为本机分配到的OpenVPN客户端私有地址)?

如果有做DNAT,那么I.J.K.M就不可能收到“A.B.C.D”发来的响应,会话建立失败。如果没有DNAT,那么I.J.K.M可以正确地收到A.B.C.D的响应并且建立会话,只是整个过程中A.B.C.D发给I.J.K.M方向的数据包会经过E.F.G.H中转一次。

I.J.K.M主动连接A.B.C.D的数据包connection state是NEW;而A.B.C.D响应的数据包state应该是ESTABLISHED。我不知道iptables对这种情况是否会做NAT。

Update: 只有会话中的第一个数据包会通过iptables nat表。所以这种connection已经建立的情况下应该不会再对响应数据包NAT,我做了一个实验,证实了这点。

如果A.B.C.D是一个家庭网关上的路由器,而I.J.K.M是通过A.B.C.D主动连接家庭内网某台机器(路由器上开启了端口映射),那么情况会有所不同。这时I.K.J.M发送的数据包在A.B.C.D上已经做了DNAT,则内网机器响应的数据包在A.B.C.D上自动reverse DNAT并通过OpenVPN的tun接口发送,不会再进行SNAT。

0 Responses to “关于iptables NAT的一个问题”


Comments are currently closed.