![公共和私有接口之间的端口转发](https://linux22.com/image/103917/%E5%85%AC%E5%85%B1%E5%92%8C%E7%A7%81%E6%9C%89%E6%8E%A5%E5%8F%A3%E4%B9%8B%E9%97%B4%E7%9A%84%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91.png)
这个问题已经被问过无数次了。几周前,我设法让这个工作在这ServerFault 发布和这数字海洋博客文章。我一定错过了一些简单的东西。
我的目标是简单地在两个执行 NAT 的接口之间转发数据包。具体来说,我想在公共接口和外部 USB NIC 之间转发数据包。
我确保内核配置为允许端口转发:
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
以及特定于接口的转发配置:
net.ipv4.conf.enp0s20u4u3.forwarding = 1
net.ipv4.conf.eno1.forwarding = 1
我创建的规则iptables
是:
iptables -t nat -A PREROUTING -i eno1 --protocol tcp --destination-port 10000 -j DNAT --to-destination 192.168.10.2:1234
iptables -A FORWARD -i eno1 -o enp0s20u4u3 --protocol tcp --destination-port 1234 -j ACCEPT
iptables -t nat -A POSTROUTING -o enp0s20u4u3 --protocol tcp --source 192.168.10.2 --source-port 1234 -j SNAT --to-source 192.168.10.1
然后,我尝试通过端口 10000 建立 TCP 连接(如果我的外部 IP 为 192.168.2.50)来测试此配置。
$ nc -v 192.168.2.50 10000
nc: connect to 192.168.2.50 port 10000 (tcp) failed: Connection refused
如果我的规则条目不正确,则此行为是有意义的。所以,我转储了规则统计数据
$ iptables -t nat -L -v
Chain PREROUTING (policy ACCEPT 15 packets, 2885 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- eno1 any anywhere anywhere tcp dpt:ndmp to:192.168.10.2:1234
Chain INPUT (policy ACCEPT 15 packets, 2885 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT tcp -- any enp0s20u4u3 192.168.10.2 anywhere tcp spt:search-agent to:192.168.10.1
因此,入站 TCP 数据包与第一条链规则不匹配PREROUTING
。我不确定错误在哪里;第一条规则是如此简单。这个想法是:
192.168.2.50:10000 的入站流量在专用接口上通过 NAT 转换为 192.168.10.2:1234。