gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:18:45 25 4
gpt4 key购买 nike

原始问题

我正在使用 telnet 连接到 Node.js TCP 服务器(在本地主机上),并且我正在尝试探索保持事件探针。

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

  • 当我从 telnet 提示符退出 telnet 时,套接字的 end 事件在 Node.js 中触发。明显收到了FIN包。
  • 当我杀死 telnet 进程时,它还会在进程终止之前通过 FIN 数据包干净地退出连接。

您知道一种在不发送 FIN 数据包的情况下退出 telnet 的方法吗(最好不要涉及断开连接/产生物理网络故障的网线。)

改进的问题

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

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

那么我如何创建一个客户端进程,使其保持事件状态,但让它表现得像一个完全失效的 TCP 连接?

剧透

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

最佳答案

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

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

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

fg $PID

将 netcat 之一返回到 shell 前台。

另一个选项是 iptables 规则:

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

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

关于node.js - 退出本地主机上的客户端,而不断开与本地主机上服务器的 TCP 连接(没有 FIN 数据包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12736564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com