12

我试图了解如何在 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

1 回答 1

17

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

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

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

于 2013-06-20T11:57:43.397 回答