侦听应用程序(winsock2)对端口扫描的行为(Syn Scan)

时间:2015-04-23 02:09:37

标签: tcp server behavior winsock2 difference

服务器应用程序是否应该侦听端口,能够检测并记录Syn Scanning完成的任何连接尝试?

测试场景

我编写了一个Windows程序,我简称为“simpleServer.exe”。 该程序只是一个非常基本的服务器应用程序的模拟。 它侦听端口,并等待传入​​的消息。 侦听Socket被定义为TCP流套接字。 就是这个程序正在做的一切。

我一直在两台不同的机器上部署这个完全相同的程序,两台机器都运行在Windows 7 professional 64bit上。 这台机器将充当主机。 他们驻扎在同一个网络区域。

然后,使用程序“nmap”, 我在同一个网络上使用另一台机器,充当客户端。 使用“nmap”上的“-sS”参数,我对两台机器上的监听simpleServer的IP和端口进行同步扫描(一次尝试一次)。

(请注意,2个主机已经启动了“wireshark”,并且正在监视来自客户端IP和侦听端口的tcp数据包。)

在“wireshark”条目中,在两台机器上,我看到了Syn Scan的预期tcp数据包:

client ----(SYN)----> host

client <--(SYN/ACK)-- host

client ----(RST)----> host

上述数据包交换表明连接未建立。

但是在“simpleServer.exe”中,只有一个在日志中打印了“新传入连接”,而另一个实例没有收到任何新传入连接的警报,因此根本没有日志。

代码段

// socket bind and listen was done above this loop 
while(TRUE)
{
    sClient=accept(sListen,(SOCKADDR*)&remoteAddr,&nAddrLen);
    if(sClient == INVALID_SOCKET)
    {
        printf("Failed accept()");
        continue;
    }
    dwSockOpt (sListen);
    printf ("recv a connection: %s\n", inet_ntoa(remoteAddr.sin_addr));

    closesocket(sClient);
}

旁注: 是的,因为它只是一个简单的程序,流程可能有点滑稽,例如 while 循环中没有 break 。所以请不要介意这个简单而有缺陷的设计。

进一步调查

我还在“simpleServer”中将 getsockopt()放入侦听状态后,检查侦听套接字SOL_SOCKET选项的差异。

我在两台主机之间发现了一个值得注意的差异,就是SO_MAX_MSG_SIZE。 检测传入连接的主机的Hex值为0x3FFFFFFF(1073741823),而另一个没有日志的主机为0xFFFFFFFF(-1)。不确定这是否相关,但我只是在垃圾邮件中发现我在测试环境中可能发现的任何差异。 SOL_SOCKET的另一个值或多或少相同。

旁注:我在其他一些机器上测试过,其中包括另一台Windows 7专业版,Windows Server 2008 r2,Windows Server 2003.我不确定它是否巧合,但机器有SO_MAX_MSG_SIZE == -1,他们都没有检测到Syn Scanning的连接。但也许这只是一个巧合。我没有什么可以证明的。

帮助我需要

  • 为什么在具有相同操作系统的不同机器上,相同应用程序的2个相同行为会有不同的行为?
  • 什么决定了SO_MAX_MSG_SIZE的价值?考虑两个相同的操作系统,但有两个不同的值。

1 个答案:

答案 0 :(得分:0)

如果从未建立连接,accept()将永远不会返回。这占了你问题的90%。

“新传入连接”(或“收回连接”或其他任何内容)消息的唯一解释是连接其他内容。

SO_MAX_MSG_SIZE对TCP套接字没有意义,更不用说侦听TCP套接字了。所以你经历的任何变化都是毫无意义的。