如何在Linux中终止单个TCP连接?

时间:2013-09-17 07:04:55

标签: linux tcp

我有一个进程可以在不同的端口上打开几个到几个浏览器的tcp连接。

使用netsat输出是这样的:

tcp 0 0 server1.something:myprog client1.something:49987 ESTABLISHED
tcp 0 0 server1.something:myprog client1.something:65987 ESTABLISHED
tcp 0 0 server1.something:myprog client1.something:89987 ESTABLISHED

现在我想杀死其中一个连接?我该怎么做? (因为杀死进程会终止所有连接)

3 个答案:

答案 0 :(得分:6)

以下是一些选项:

  • 使用gdb附加并在fd上调用close()。您可以使用ls -la / proc / $ pid / fd从addr / port到inode编号通过/ proc / net / tcp和inode编号映射到进程内的FD。
  • 欺骗RST数据包。你需要在本地生成它并以某种方式猜测SEQ号。
  • 也许设置一个iptables规则来生成下一个数据包的RST。
  • 编写内核模块。

似乎没有一个很好的支持方式来做到这一点。如果他们的FD无论如何意外关闭,进程很可能会崩溃。

答案 1 :(得分:4)

您不能杀死进程的单个连接。

但你可以用iptables阻止它。因此,连接无法提供或接收数据,客户端将在超时运行。

答案 2 :(得分:0)

在Linux内核> = 4.9上,您可以通过键ss使用iproute2的-K命令

ss -K dst client1.something dport = 49987

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