同一端口上有多个进程在监听?

13

我正在尝试理解如何在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连接进入"的防火墙规则。


4
这不是“安全行为”。这是Windows的一个奇怪问题,允许进程窃取彼此的连接。 - user207421
1个回答

18

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

但是,在Windows中,它实际上允许您窃取套接字。我会引用一个更好的答案来详细阐述两者的区别。

Windows只知道SO_REUSEADDR选项,没有SO_REUSEPORT ,在Windows上对套接字设置SO_REUSEADDR的行为就像在BSD上对套接字设置SO_REUSEADDR和SO_REUSEPORT一样,有一个例外:带有SO_REUSEADDR选项的套接字始终可以绑定到与已绑定套接字完全相同的源地址和端口,即使其他套接字在绑定时未设置此选项。这种行为有点危险,因为它允许应用程序“窃取”另一个应用程序的连接端口。不用说,这可能会产生重大的安全影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接