繁体   English   中英

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

[英]Close established TCP connection on Linux

我无法找到我将尝试实现的简单事情的答案:一旦与我的 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

好的,我发现至少有一个可行的解决方案(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

但是,有一个更简单的解决方案会很好。

tcpkill 不起作用,因为它只会杀死任何新连接,它不会杀死现有的已建立连接

继承人如何删除已建立的 TCP 连接

  1. 找到进程的 PID 和客户端连接的 IP,假设你在 serverA 上,有人从 serverB 连接

    root@A> netstat -tulpan | 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 'call shutdown(17u, 2)'

应该看到类似的东西,

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

现在应该关闭 TCP 连接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM