DMZ 主机对于 UDP 的端口转发仍然支持的不好?

2019-10-16 12:11:49 +08:00
 phpfpm

路由器:k2p+gocloud

内网暴露一台主机作为 DMZ 主机,tcp 协议都正常

几个 udp 协议如果不特别设置端口转发,就表现不太对了

外网用 nc 能连接 udp 的端口,但是数据发不过来

想问下从网络的角度解释下是为啥呢

1625 次点击
所在节点    问与答
2 条回复
ipwx
2019-10-16 15:15:16 +08:00
介绍一些背景知识吧。

设有两台主机,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 的支持不是很好。。。
FrankAdler
2023-02-17 20:53:56 +08:00
同样遇到这个问题,一开始以为是联通限制了,现在感觉是光猫的 dmz 有问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/609850

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX