linux / netfilter / iptables 如何“知道”一个数据包是否适合自己转发

linux / netfilter / iptables 如何“知道”一个数据包是否适合自己转发

我已经使用 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

相关内容