无法捕获端口23上的TCP流量 - C#

时间:2016-03-28 18:19:45

标签: c# windows sockets tcp telnet

我有一个'蜜罐'我正在用C#开发,它监听一系列端口(用户输入)。它是一个大型的项目/窗口服务,几乎可以在输入的任何端口上运行,并且不会侦听当前已经收听的端口。问题是当我使用telnet或netcat测试服务时,我的服务没有捕获端口23上的连接,因此建立了连接。

我通过执行以下操作打开防火墙中的端口:

for (int i = 0; i < ports.Length; i++)
        {
            string arg = "advfirewall firewall add rule name=\"PeepHole Open" + "\" dir=in action=allow protocol=TCP localport=" + ports[i];
            string arg1 = "advfirewall firewall add rule name=\"PeepHole Open" + "\" dir=in action=allow protocol=UDP localport=" + ports[i];

            ProcessStartInfo procStartInfo = new ProcessStartInfo("netsh", arg);
            ProcessStartInfo procStartInfo1 = new ProcessStartInfo("netsh", arg1);
            procStartInfo.RedirectStandardOutput = true;
            procStartInfo1.RedirectStandardOutput = true;

            procStartInfo.UseShellExecute = false;
            procStartInfo1.UseShellExecute = false;

            procStartInfo.CreateNoWindow = true;
            procStartInfo1.CreateNoWindow = true;

            Process.Start(procStartInfo1);
            Process.Start(procStartInfo);

        }

我通过以下方式启动听众:

 IPEndPoint Ep = new IPEndPoint(IPAddress.Parse("0.0.0.0"), current_port);
 //TcpListener tempListener = new TcpListener(hostIP, current_port);
 TcpListener tempListener = new TcpListener(Ep);
 TCP_Listener listen = new TCP_Listener();   //my defined tcplistener struct
 listen.listener = tempListener;             //set the Listener's TcpListener field
 listen.port = current_port;                 //set the Listener's Port field                                 
 listen.listener.Start();                    //start this particular TcpListener
 tcp_listener_list.Add(listen);              //add the struct to the list of Listeners

通过以下方式接受TCP连接:

 for (int i = 0; i < tcp_listener_list.Count - 1; i++)
 {
     if (tcp_listener_list[i].listener.Pending())
     {
         TcpClient client = tcp_listener_list[i].listener.AcceptTcpClient();
         int clientPort = tcp_listener_list[i].port;
         IPEndPoint ep = client.Client.RemoteEndPoint as IPEndPoint;
         ThreadPool.QueueUserWorkItem(LogTCP, new object[] { client, clientPort, ep });
      }
  }

在LogTCP中我关闭连接(其中client是TcpClient对象):

 NetworkStream networkStream = client.GetStream(); 
 networkStream.Close();
 client.Close(); //close the connection, all the data is gleaned from the attacker already

现在的问题是,当我运行telnet或netcat来测试端口的关闭和记录时,我的代码永远不会执行,并且因为端口被打开而建立了连接; TCP连接永远不会是.Pending(),如果我删除它,问题就是持久性的。另外,如果我将侦听器设置为使用IPAddress.Any并且如果我使用或不使用.Pending()if语句将accept方法重新配置为AcceptSocket,则会出现同样的问题。 Windows是否在某些程序的低级别对待某些端口?

我正在从Windows 8.1运行Windows服务,并通过telty(在安装该服务的机器上)和telnet和netcat在Linux VM上发送TCP连接。 Telnet客户端和Telnet服务器都在“主机”上禁用。机。

我尝试过在研究过程中找到的关闭插座和连接的许多不同变体。

client.Client.Close()产生一个ObjectDisposedException client.Client.Shutdown(SocketShutdown.Both)使以前所有的&#39;工作&#39; ports挂起与CLOSE_WAIT的连接

2 个答案:

答案 0 :(得分:0)

永远不需要

Pending。只是不断接受所有听众。每个侦听器启动一个任务来执行此操作:

while (true) {
 ProcessConnectionAsync(await listener.AcceptAsync());
}

像这样。

这是一个错误的错误:tcp_listener_list.Count - 1。但是如上所述,当你这样做时,这个bug就会消失。

关于结束,为什么不只是client.Dispose();?这是在.NET中进行资源管理的常用方法。不需要其他任何东西。

答案 1 :(得分:0)

我认为这里的关键是,你提到你已经创建了你自己的结构。结构非常棘手。您可能认为以下代码最终会得到一个包含tempListener和current_port的TCP_Listener实例。但是如果你设置一个断点,你可能会注意到其他情况。您在结构上执行的每个修改实际上都返回一个全新的结构,因此您不能像对类一样分配一个字段。

TCP_Listener listen = new TCP_Listener();   //my defined tcplistener struct
listen.listener = tempListener;             //set the Listener's TcpListener field
listen.port = current_port;                 //set the Listener's Port field                                 
listen.listener.Start();  

我建议您使用类,而不是结构。或者将结构初始化为新的TCP_Listener(tempListener,current_port),然后启动它。

这至少是你问题的一部分。一旦你解决了这个问题,请告诉我们它是否仍然无效,我们可以查看下一期。