我有以下情况:
+---------------+ +-------------+ +-------------------------+
| PC | | Linux | | Router |
| 192.168.1.162 | <---------> | 192.168.1.2 | <---------> | 192.168.1.1 WAN_IP | <------ WAN
+---------------+ A +-------------+ +-------------------------+ B
Server on TCP Have full Have no access
port 9876 access (multiple TCP ports
forwarded to "Linux")
我的局域网中有一台 PC(在 下192.168.1.162
),其端口上有 HTTP 服务器9876
。在同一个局域网中,我有一台 Linux 机器(在 下192.168.1.2
),我可以完全访问它。然后是连接到互联网的路由器(在 下192.168.1.1
),除了给提供商发送电子邮件并要求他们将 X 端口转发到 Y IP 地址外,我无法控制它。因此,我提前要求他们将一系列 TCP 端口转发到我的 Linux 机器,这样我就可以决定如何处理它们,而不必等待。
我现在试图实现的是从 WAN TCP 端口1234
到我的 PC TCP 端口的简单 TCP 端口转发9876
。我的 iptables 规则:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 1234 -j DNAT --to-destination 192.168.1.162:9876
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.162 --dport 9876 -j SNAT --to-source 192.168.1.2
这些规则只起到部分作用,也就是说,只有 PC 发送的第一个响应数据包会被重定向到 WAN,后面的数据包则不会。具体来说,我在 A 点嗅探流量时看到的内容如下:
Point A:
Source Destination Packet
192.168.1.2 192.168.1.162 SYN
192.168.1.162 192.168.1.2 SYN+ACK
192.168.1.2 192.168.1.162 ACK
192.168.1.2 192.168.1.162 PSH+ACK (HTTP GET request)
192.168.1.162 192.168.1.2 PSH+ACK (first part of HTTP response, routed)
192.168.1.162 192.168.1.2 ACK (remainder of HTTP response, not routed)
192.168.1.162 192.168.1.2 ACK (remainder of HTTP response, not routed)
192.168.1.162 192.168.1.2 ACK (remainder of HTTP response, not routed)
我通过嗅探“点 B”处的数据包来确定哪些数据包会被路由,哪些不会被路由。
IP 转发已启用(cat /proc/sys/net/ipv4/conf/eth0/forwarding
和cat /proc/sys/net/ipv4/ip_forward
)。