路由器:k2p+gocloud
内网暴露一台主机作为 DMZ 主机,tcp 协议都正常
几个 udp 协议如果不特别设置端口转发,就表现不太对了
外网用 nc 能连接 udp 的端口,但是数据发不过来
想问下从网络的角度解释下是为啥呢
1
ipwx 2019-10-16 15:15:16 +08:00 1
介绍一些背景知识吧。
设有两台主机,A 和 B。即使 A 发起 TCP 链接到 B,A 也要本地打开一个 TCP 监听端口,并且告知 B 回信数据包发到这个端口。一般而言,如果是客户端应用,A 上面跑的程序不需要指定这个监听端口是什么,由操作系统分配一个空闲的端口。这样的临时分配端口,可以参见 https://en.wikipedia.org/wiki/Ephemeral_port 在你的例子里面,链路是 A -> R -> B,其中 R 是路由器。由 A 发起的 TCP 链接携带了这个 A 的临时端口信息,被 R 看到。R 重写了发给 B 的包,重新分配了它自己的一个临时端口,把 R 的外部临时端口告诉 B,并在状态表里面把这个外部临时端口和 A 的回路端口进行关联,那么 B 发回给 R 的数据包会原路返回 A。直到这个 TCP 链接被关闭,这个 R 的临时端口和 A 的临时端口才会被关闭,状态表项被删除。这就是 NAT 技术。 DMZ 就是把所有不在这个状态表里面的端口接收到的数据,统一发给某个 R 下面的局域网主机。这台主机就是 DMZ 主机。 ==== 回到你的问题。理论上,UDP 和 TCP 类似,也可以采用相同的 NAT 技术。然而,UDP 没有链接状态。所以 R 无法根据 TCP 链接断开这个信息及时删除状态表,而只能靠猜(比如超时)。因此实现难度比 TCP NAT 要高。因为这些原因,也许一些廉价路由对 UDP NAT 的支持不是很好。。。 |
2
FrankAdler 2023-02-17 20:53:56 +08:00 via iPhone
同样遇到这个问题,一开始以为是联通限制了,现在感觉是光猫的 dmz 有问题
|