退出本地主机上的客户端,而不断开与本地主机上的服务器的TCP连接(没有FIN数据包)

原来的问题

我用telnet连接到一个node.js TCP服务器(在本地主机上),我试图探索保持活跃的探测。

作为第一个testing,我想用telnet连接到服务器,并以不发送FIN数据包的方式终止telnet会话。 (让服务器认为TCP套接字仍然是'健康的')。不幸的是,我似乎无法find一个聪明的方式来testing这个。

  • 当我从telnet提示符退出telnet时,套接字的end事件在节点中触发。 它显然有一个FIN数据包。
  • 当我kill telnet的进程时,它也干净地退出与FIN数据包的连接,在进程死亡之前。

您是否知道如何在不发送FIN数据包的情况下退出telnet(最好不要连接断开的networking电缆/产生物理networking故障)。

改进的问题

我想用localhost / loopback模拟一个networking故障(实际上没有断开任何接口/networking电缆)。 我想在本地主机上打开客户端和服务器之间的TCP连接。 然后,我希望客户端“死”,而不让服务器知道它已经消失了。 (即不发送FIN数据包)。例如,如果路由器发生故障,这可能发生在真实的networking中。

感谢下面的评论,我已经了解到,当进程死亡(或被强行杀死)时,内核将收集进程拥有的任何开放的端口/套接字,就像我上面的telnet一样,并且通过发送FIN数据包。 所以我需要欺骗内核不closures现有的连接。

那么我怎样才能创build一个客户端进程,保持它的活着,但让它performance得像一个完全死的TCP连接?

剧透

  • (下面的答案1:使用原始套接字(scapy),让它忽略服务器在初始连接和一些testing数据后发送的任何数据包(例如一段时间之后))
  • (回答2,来自同事的想法:configurationiptables来切断客户端和服务器之间的stream量,实际的iptables规则在下面注释)

你必须杀死客户端进程吗? 如果是这样,只需使用netcat,让进程在后台运行。 在bash中:

 for i in $(seq 5) do nc localhost 5001 &; sleep 1; done 

这创build了5个TCP客户端,SYN间隔1秒。 如果您需要与其中一个会话进行交互,则可以使用

 fg $PID 

将netcat的其中一个返回到shell前台。

另一种select是iptables规则:

 iptables -A OUTPUT -p tcp --tcp-flags FIN -j DROP 

另一个select是使用低级networking工具和原始套接字,比如Scapy。 这是Scapy的Python文档 。 除了您需要确认服务器提供给您的SYN-ACK以外,您将执行类似于TCP SYN扫描的操作。 这将使服务器套接字处于“连接”状态,您可以继续做其他事情。 服务器可能会偶尔确认,但您的testing程序不会在意。 它只会发送SYN并响应SYN-ACK

您需要断开机器与networking的连接。 “断开”一个进程总是会导致操作系统/机器正确closures该插槽。

断开机器最简单的方法是不用拔掉电缆,只需更改机器的IP地址即可。