有没有办法在 Linux 上重置/终止 TCP 连接?
Posted
技术标签:
【中文标题】有没有办法在 Linux 上重置/终止 TCP 连接?【英文标题】:Is there a way to reset/kill TCP connections on Linux? 【发布时间】:2022-01-09 09:38:53 【问题描述】:我一直在努力寻找一种通过一个命令简单地重置/终止 TCP 连接的方法。假设我有 3 台运行 Ubuntu 18.04 的虚拟机。 VM1 是网关,VM2 是主机,VM3 是攻击者。如果 VM3 通过 SSH 连接到 VM2,有没有办法可以通过 VM1 看到,然后重置/终止 TCP 连接?
我听说 netstat -atnp 用于查看本地机器上的连接,但我无法从 VM1 看到 VM3 和 VM2 之间的 SSH 连接。我还发现 tcpkill 可用于终止连接,但我希望使用 Python3 脚本自动执行此操作。根据我的理解,看起来 tcpkill 将控制会话终端,直到我 CTRL+C。结果,我不确定这是否可以在脚本中实现,因为我必须在脚本运行时手动 CTRL+C。
【问题讨论】:
【参考方案1】:netstat 只能显示一个端点是本地机器的连接,即涉及本地套接字的地方。它不显示本地机器只是转发数据包的连接,就像在虚拟机之间传递数据包的情况一样。
假设在您的情况下,从 VM3(攻击者)到 VM2(主机)的所有数据包都通过 VM1(网关) - 根据您的描述,这可能是真的,也可能不是。在这种情况下,可以在 VM1 上观察流量并使用 iptables 进行调节。 iptables 通常可以限制可能的流量,或者它可能会通过基于特定事件注入 RST 来终止连接 - 请参阅How to reset a tcp connection immediately on both ends on a certain condition using linux netfilter/iptables?。正如您已经注意到的,您还可以使用 tcpkill 等工具嗅探流量并终止选定的连接。这些工具还注入一个 TCP RST 来终止连接。还有其他类似的工具,有些也是用 Python 编写的,因此可能更容易集成。参见例如here 或here。
【讨论】:
以上是关于有没有办法在 Linux 上重置/终止 TCP 连接?的主要内容,如果未能解决你的问题,请参考以下文章
TCP 服务器在 SocketAsyncEventArgs 实例上重置 AcceptSocket.ReceiveAsync 操作
有没有办法在BBB和仅通过USB线连接的PC之间使用TCP / IP通信?
有没有办法使用 flash.net.Socket 检测 TCP 连接已被拒绝?
linux网络协议栈源码分析 - 传输层(TCP连接的终止)