9

我有一个进程可以在不同的端口上打开多个到多个浏览器的 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

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

4

4 回答 4

6

以下是一些选项:

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

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

于 2013-09-17T08:18:44.160 回答
6

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

ss -K dst client1.something dport = 49987

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

于 2019-04-10T15:12:46.613 回答
4

您不能终止进程的单个连接。

但是你可以用 iptables 阻止它。所以连接不能提供或接收数据,客户端会超时运行。

于 2013-09-17T07:10:34.393 回答
1

您可以按目标端口杀死:

ss -K dport = 65987
于 2021-10-23T06:50:29.223 回答