我已经使用 iptables + NAT 手动将 ubuntu 盒设置为路由器。
但我想知道,“中间路由器”如何知道数据包是否是发给它的或者需要转发的?
我测试了这个场景:
SYN SYN
src:192.168.3.3.8080 src:12.12.12.12:8080
+--------------+dst:5.5.5.5:443 +-----------------+ dst:5.5.5.5:443
| | | Linux Router |
| Client +--------------------->| +------------------>
| | |LAN: 192.168.3.1 |
| 192.168.3.3 | | |
| |<---------------------+WAN: 12.12.12.12 |<------------------
+--------------+SYN-ACK +-----------------+ SYN-ACK
src:5.5.5.5:443 src:5.5.5.5:443
dst:192.168.3.3:8080 (HOW???) dst:12.12.12.12:8080
Webserver listening
on 0.0.0.0:8080
它在客户端上按预期工作。但是当路由器收到 DST 为 12.12.12.12:8080(它正在监听)的数据包时,它如何知道要转发它?我也用 UDP 手动尝试了这一点(因此没有 TCP 状态),它似乎有效。
为什么同一个端口,却没有端口冲突呢?
我的路由器上的 iptables NAT 规则:
-A POSTROUTING -o enp6s0 -j MASQUERADE