![SNAT 和 DNAT 端口转发到链接子网](https://linux22.com/image/791594/SNAT%20%E5%92%8C%20DNAT%20%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%88%B0%E9%93%BE%E6%8E%A5%E5%AD%90%E7%BD%91.png)
我对经典版本有些疑问DNAT/SNAT 端口转发问题,由于涉及多个网络和子网,因此增加了复杂性。我想将端口从我的 VPS 服务器转发到我家庭网络上的系统。VPS 通过 OpenVPN 连接到此网络,并静态路由我的家庭子网,此 VPS 本身通过 OpenVPN 提供这些子网,但这并不那么重要。
我正在尝试将这两个 iptables 规则添加到 VPS 服务器以实现这一点......
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.4:2222
# iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.4 --dport 2222 -j SNAT --to-source 10.8.0.1
(我尝试了上述几种变化)
但是,我似乎无法通过此端口 SSH 连接到我的 VPS。在某些情况下,我的家庭网络路由器地址相对于 VPS 是,10.8.0.1
并且仅在 VPS 服务器接口上打开端口也很重要eth0
。
我发现这解释了这里的概念,从 VPS 服务器运行......
# ping -c1 192.168.1.4
PING 192.168.1.4 (192.168.1.4) 56(84) bytes of data.
64 bytes from 192.168.1.4: icmp_seq=1 ttl=63 time=5.60 ms
--- 192.168.1.4 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.601/5.601/5.601/0.000 ms
# traceroute 192.168.1.4
traceroute to 192.168.1.4 (192.168.1.4), 30 hops max, 60 byte packets
1 10.8.0.1 (10.8.0.1) 6.644 ms 6.597 ms 7.511 ms
2 192.168.1.4 (192.168.1.4) 7.473 ms 7.446 ms 7.415 ms
如果您好奇的话,事情就是这样的,因为我的手机通过 OpenVPN 连接到这个 VPS,它不仅可以上网,还可以无缝访问家里的 LAN。我这样做已经有一段时间了,因为它允许我在旅途中轻松访问我的 CCTV 系统和家庭自动化工具。
这显示了我的 VPS 到家庭网络的 OpenVPN 客户端隧道接口 IPv4 配置...
# ip -4 addr show dev tun1
9: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
inet 10.8.0.3/24 scope global tun1
valid_lft forever preferred_lft forever
以及 VPS 服务器的 IPv4 路由表...
# ip -4 route
default via 203.57.114.1 dev eth0 onlink
10.7.0.0/24 dev tun0 proto kernel scope link src 10.7.0.1
10.8.0.0/24 dev tun1 proto kernel scope link src 10.8.0.3
192.168.1.0/24 via 10.8.0.1 dev tun1
192.168.4.0/24 via 10.8.0.1 dev tun1
192.168.84.0/24 via 10.8.0.1 dev tun1
673.557.514.0/24 dev eth0 proto kernel scope link src 673.557.514.231
(为了保护我的隐私,我把上面最后一行改成了不可能的 IPv4 地址)
我有点困惑,不知道在这种更复杂的设置中该如何处理这个简单的端口转发。不幸的是,在普通的 NAT 端口转发上搜索只会一遍又一遍地找到相同的内容。
答案1
我已经解决了自己的问题,我通过摸索和寻找找到了答案。在测试过程中,我也未能从 nat 表中正确删除 POSTROUTING 规则。
这就是解决方案...
# iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.4 --dport 2222 -j SNAT --to-source 10.8.0.3
对于我的家庭 LAN 网络,此 VPS 服务器的 IP 地址是10.8.0.3
,LAN 上的系统是192.168.1.4
,这样才能正常工作。我通常会删除此类问题,但我相信很多人会像我一样在这种情况下被疑惑所困扰,这将对这些人有所帮助。