在 Linux 上关闭已建立的 TCP 连接

问题描述 投票:0回答:3

我无法找到我将尝试实现的简单事情的答案: 一旦与我的 Linux 服务器建立了 tcp 连接,假设 ssh / tcp 22 或 x11 / tcp 6000 显示 -> 如何关闭此连接而不杀死进程(sshd / x11 显示服务器)。 我还看到一些使用 iptables 的建议,但它对我不起作用,连接在 netstat -an 中仍然可见。 如果有人能指出我正确的方向,那就太好了。

到目前为止我尝试过的事情

tcpkill: kills the process, not good for me
iptables: does not close the established connection, but prevent further connections. 

提前致谢 DJ

linux sockets tcp
3个回答
4
投票

好的,我找到了至少一种有效的解决方案(killcx)。也许我们能够找到更简单的解决方案。 另外,我看到了“zb”的评论 - 谢谢 - 这可能也有效,但我无法找到有效的语法,因为这个工具似乎非常有用但很复杂。 所以这里是一个如何使用对我有用的 1. 解决方案的示例:

netstat -anp  | grep 22   
output: tcp  0  0 192.168.0.82:22         192.168.0.77:33597      VERBUNDEN   25258/0
iptables -A INPUT -j DROP -s 192.168.0.77 (to prevent reconnect)
perl killcx.pl 192.168.0.77:33597 (to kill the tcp connection)

killcx 可以在这里找到:http://killcx.sourceforge.net/ 它“窃取”来自外部主机(192.168.0.77)的连接并关闭它。因此,该解决方案工作正常,但如果您面临压力,则很难快速设置。以下是所需的包:

apt-get install libnetpacket-perl  libnet-pcap-perl libnet-rawip-perl
wget http://killcx.sourceforge.net/killcx.txt -O killcx.pl

但是,如果有一个更简单的解决方案就好了。


2
投票

tcpkill 不起作用,因为它只会终止任何新连接,而不会终止现有的 ESTABLISHED 连接

以下是删除已建立的 TCP 连接的方法

  1. 找到进程的PID和连接的客户端的IP, 假设您在服务器 A 上并且有人从服务器 B 进行连接

    root@A> netstat -tulpan | grep ssh | grep ssh | grep 服务器B

应该看到类似的东西,

tcp        0      0 <serverA IP>:<port>     <serverB>:<port>   ESTABLISHED 221955/sshd
  1. 使用 lsof 实用程序使用父 PID 获取此连接的文件描述符

    root@A> lsof -np 221995 | grep serverB IP

应该看到类似这样的东西

sshd 221955 <user>  17u IPv4 2857516568  0t0  TCP <serverA IP>:<port>-><serverB IP>:<port> (ESTABLISHED)

获取文件描述符编号(第 4 列)= 17u

  1. 使用 GDB 关闭此连接,无需杀死 sshd

    root@A> gdb -p 211955 --batch -ex '调用 shutdown(17u, 2)'

应该看到类似的东西,

0x00007f0b138c0b40 in __read_nocancel () from /usr/lib64/libc.so.6
$1 = 0
[Inferior 1 (process 211955) detached]

TCP 连接现在应该关闭


0
投票

使用

ss
检查并终止它们

-K, --kill 强行关闭套接字,显示关闭的内容

### list them
ss -tp '( sport = :443  )'

### or 
ss --tcp src :443

### terminate them
ss -K -tp '( sport = :443  )'

### or
ss --kill --tcp src :443

注意:第一次运行

ss -K
时,它会杀死并显示结果,第二次运行时显示标题,没有输出;因此,看起来我们必须运行两次,但情况并非如此,第一次运行时

在 Debian 11 上测试

更多如何从命令行终止死连接而不重新启动服务器

© www.soinside.com 2019 - 2024. All rights reserved.