公共和私有接口之间的端口转发

公共和私有接口之间的端口转发

这个问题已经被问过无数次了。几周前,我设法让这个工作在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。

相关内容