V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
phpfpm
V2EX  ›  问与答

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

  •  
  •   phpfpm · 2019-10-16 12:11:49 +08:00 · 1692 次点击
    这是一个创建于 1866 天前的主题,其中的信息可能已经有所发展或是发生改变。

    路由器:k2p+gocloud

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

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

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

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

    2 条回复    2023-02-17 20:53:56 +08:00
    ipwx
        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 的支持不是很好。。。
    FrankAdler
        2
    FrankAdler  
       2023-02-17 20:53:56 +08:00 via iPhone
    同样遇到这个问题,一开始以为是联通限制了,现在感觉是光猫的 dmz 有问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2804 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:50 · PVG 19:50 · LAX 03:50 · JFK 06:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.