如何立即终止孤立的 TCP 连接?

如何立即终止孤立的 TCP 连接?

在 Linux 中关闭孤立的 TCP 连接非常困难。这个问题已经提出这里这里这里, 和这里;然而,这两种方法对我来说都不起作用。

调用close()不起作用,因为没有关联进程。安装CurrPorts不起作用,因为我不是在 Windows 上。设置tcp_max_orphans为零的方法没有成功(我认为即使成功,也不会立即终止连接)。运行tcpkill不起作用,因为没有活动流量。运行killcx失败no response from child, operation may have failed。Google 的tcp_killer失败Socket not found for connection。设置短超时并等待它不是一个选项,因为我必须立即重用 IP 和端口。

在整个过程中,netstat -tp始终表明连接处于活动状态:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0    156 localhost:54494         localhost:xmpp-client   FIN_WAIT1   -

有什么方法可以立即终止此TCP连接?

答案1

我遇到的最好的解决方案(尽管有点蛮力)是这个很好的内核模块,称为丢弃 TCP 套接字由他人制作用户StackExchange 社区。它使用inet_twsk_deschedule_put()Linux 内核,尽管此功能旨在强制终止该状态下的 TCP 连接,但它也TIME_WAIT可用于终止。FIN_WAIT1

该模块可以加载:

git clone https://github.com/milabs/drop-tcp-sock.git
cd drop-tcp-sock && make
insmod ./drop-tcp-sock.ko

然后(在我的场景中)使用:

echo "127.0.0.1:54494 127.0.0.1:5222" >/proc/net/tcpdropsock

相关内容