2

原始问题

我正在使用 telnet 连接到 node.js TCP 服务器(在 localhost 上),并且我正在尝试探索保持活动状态的探针。

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

  • 当我从 telnet 提示符退出 telnet 时,套接字的end事件在节点中触发。它显然得到了一个 FIN 数据包。
  • 当我killtelnet 的进程时,它也会在进程终止之前用 FIN 数据包干净地退出连接。

您是否知道在不发送 FIN 数据包的情况下退出 telnet 的方法(最好不涉及断开/产生物理网络故障的网络电缆。)

改进的问题

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

感谢下面的评论,我了解到当进程死亡(或被强制终止)时,内核将收集进程拥有的任何打开的端口/套接字,就像我telnet上面的一样,并通过发送 FIN 来关闭它们包。所以我需要欺骗内核不要关闭现有的连接。

那么我怎样才能创建一个客户端进程,让它保持活动状态,但让它表现得像一个完全死掉的 TCP 连接呢?

剧透

  • (下面的答案1:使用原始套接字(scapy),让它忽略初始连接后服务器发送的任何数据包和一些测试数据。(例如,在一定时间后。)
  • (答案2,同事的想法:配置iptables切断客户端和服务器之间的流量。实际iptables规则在下面的评论中。)
4

2 回答 2

1

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

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

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

fg $PID

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

另一种选择是 iptables 规则:

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

另一种选择是使用带有原始套接字的低级网络工具,例如 Scapy。这是Scapy 的 Python 文档。您将执行类似于 TCP SYN 扫描的操作,但您需要确认服务器提供给您的 SYN-ACK。这将使服务器套接字处于“已连接”状态,您可以继续执行其他操作。服务器可能偶尔会确认您,但您的测试程序不会在意。它只会发送 SYN 并响应 SYN-ACK

于 2012-10-04T22:08:26.790 回答
0

您需要断开机器与网络的连接。“断开”进程将始终导致操作系统/机器正确关闭套接字。

无需物理拔出电缆即可断开机器的最简单方法是更改​​机器的 IP 地址。

于 2012-10-05T13:54:03.607 回答