在linux中杀死tcp连接

Viv*_*oel 86 tcp

如果客户端机器死机,我在一个处于挂起状态的应用程序中有一些死连接。

->192.168.1.214:49029 (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)

有没有办法在不重新启动服务器的情况下从 linux 命令行终止这些选项?

搜索后,我找到了名为 tcpkill 的解决方案。但这对我不起作用。因为它永久阻止了该 IP。

小智 72

在 linux 内核 >= 4.9 上,您可以使用ss来自 iproute2的命令和密钥-K

ss -K dst 192.168.1.214 dport = 49029
Run Code Online (Sandbox Code Playgroud)

内核必须在CONFIG_INET_DIAG_DESTROY启用选项的情况下编译。

  • 对于 linux,如果您有空闲连接(`tcpkill` 无法工作),这确实是最好的方法,而且几乎是唯一的方法。但是,我承认我没有检查过“killcx”,但感觉很多安全软件都会阻止它工作,除非您修改 iptables 以允许这些欺骗性数据包通过。 (2认同)
  • ss:无效选项 -- 'K' ubuntu 18.04.5 LTS (2认同)

Mar*_*555 37

原文来自:http : //rtomaszewski.blogspot.sk/2012/11/how-to-forced-kill-established-tcp.html

要“杀死”套接字,您必须发送 TCP 重置数据包。要发送它(并被对方接受),您必须知道实际的 TCP 序列号。

1) 已经提到的tcpkill方法通过被动嗅探网络并等待此连接的有效数据包到达来学习 SEQ 编号。然后它使用学习到的 SEQ 号向双方发送 RSET 数据包。但是,如果连接空闲/挂起并且没有数据流,它不会做任何事情并且会永远等待。

2)另一种方法使用称为killcx链接到 Sourceforge)的perl 脚本。这会主动发送欺骗性 SYN 数据包并从答案中学习 SEQ 编号。然后它以与 相同的方式发送 RSET 数据包tcpkill

另一种方法(基于您想要实现的目标)是使用gdb调试器附加到拥有此套接字/连接的进程并close()代表其发出系统调用 - 如本答案中所述

如果您只想处理挂起的连接(另一端已死),则有各种超时(例如 TCP keepalive),如果在系统上正确配置,它们应该会自动关闭此类连接。


小智 23

tcpkill可能会为你做。在 Ubuntu 中,它在dsniff包中。

就像是:

$ sudo tcpkill -i wlan0 host 192.168.1.214
Run Code Online (Sandbox Code Playgroud)

(或其他tcpdump类似的表达方式来说明要杀死的连接)。

  • 这仅在连接正在传输任何内容时才有效。它不适用于挂起/空闲的 TCP 连接(有关详细信息,请参阅我的答案) (4认同)

Nil*_*ils 8

以 root 身份执行netstat -tunp|grep 49029。输出的最后一列应显示负责该连接的进程的 PID 和程序名称。

如果幸运的话,该连接只有一个进程。

如果你不走运,它会变得更加复杂(PID 不仅仅负责那个连接)。这是什么服务?

为什么要终止该会话?

  • 我不能杀死那个进程。它是齿轮服务器。我只想关闭连接。 (10认同)