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

out*_*ker 6 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
Run Code Online (Sandbox Code Playgroud)

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

小智 22

在 Linux 内核 >= 4.9 上,您可以使用ssiproute2 中的命令和 key-K

ss -K dst client1.something dport = 49987
Run Code Online (Sandbox Code Playgroud)

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


cdl*_*ard 6

以下是一些选项:

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

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


Pau*_*aul 6

您可以通过目标端口杀死:

ss -K dport = 65987
Run Code Online (Sandbox Code Playgroud)