多个进程监听同一个端口?

Posted

技术标签:

【中文标题】多个进程监听同一个端口?【英文标题】:Multiple processes listening on the same port? 【发布时间】:2013-06-17 06:13:52 【问题描述】:

我试图了解如何在 Windows XP 上启动多个进程侦听同一 TCP IP, Port 对。

例如,我可以启动两个ncat.exe 程序在端口 371 上侦听。第二个程序启动时没有任何问题,并接收传入的连接,而第一个则没有。一旦最后启动的进程终止,第一个进程就会收到它们。

netstat -a -n | find "LISTENING"
   TCP    0.0.0.0:371            0.0.0.0:0              LISTENING
   TCP    0.0.0.0:371            0.0.0.0:0              LISTENING

假设这是一种 Windows (XP) 行为,它怎么可能是一种安全可靠的行为?这意味着可以“重载”任何已经在监听的端口,而不是得到通常的“地址已在使用”错误消息,并且只需使用“允许端口 371 上的任何传入 TCP 连接”的规则绕过防火墙。

【问题讨论】:

这不是一种“安全可靠的行为”。这是一个奇怪的 Windows 奇怪之处,它允许进程窃取彼此的连接。 【参考方案1】:

SO_REUSEADDR 套接字选项在 Windows 中的解释不同,即在 Linux 中,它允许您重用相同的套接字,除非所有五个元组(src/dst 端口/ip 和协议完全相同)。

但是,Windows 实际上允许您窃取套接字。我会在这里引用一个更好的written answer 来详细说明两者。

Windows 只知道 SO_REUSEADDR 选项,没有 SO_REUSEPORT。 在 Windows 中的套接字上设置 SO_REUSEADDR 的行为类似于设置 BSD 中套接字上的 SO_REUSEPORT 和 SO_REUSEADDR,有一个例外: 具有 SO_REUSEADDR 的套接字始终可以绑定到完全相同的源 地址和端口作为已经绑定的套接字,即使另一个套接字 绑定时没有设置此选项。这种行为是 有点危险,因为它允许*应用程序“窃取” 另一个应用程序的连接端口。不用说,这可以有 重大安全隐患。

【讨论】:

以上是关于多个进程监听同一个端口?的主要内容,如果未能解决你的问题,请参考以下文章

linux系统实现多个进程监听同一个端口

golang 可以监听多个端口吗

[Linux] 多进程网络编程监听一个端口

node.js集群模块如何允许多个子进程监听同一个端口?

确定监听某个端口的进程pid

网络:多个进程能否监听同一个端口号?