kill一条TCP连接实现方法详解

 更新时间:2022年11月02日 11:26:03   作者:扣钉日记  
这篇文章主要为大家介绍了kill一条TCP连接实现方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

简介

如果你的程序写得有毛病,打开了很多TCP连接,但一直没有关闭,即常见的连接泄露场景,你可能想要在排查问题的过程中,先临时kill一波泄露的连接。

又比如你要验证程序在遇到网络错误时的自愈能力,想手动kill掉一些正常TCP连接,看程序是否能自动重连并恢复运行。

这些场景,都需要手动kill一部分TCP连接,那在Linux下有哪些kill连接的方法呢?

kill活跃的TCP连接

使用ngrep或tcpkill命令可以杀死活跃状态的TCP连接,用法如下:

# ngrep杀死连接
$ sudo ngrep -d any -K3 '' 'port 54690'
# 安装tcpkill,及使用其杀死连接
$ sudo apt install dsniff  
$ sudo tcpkill -i any 'port 45308'

如上所示,可以发现在杀死连接时,ngrep和tcpkill都向连接方发送了RST包。

实现原理

学过《计算机网络》的同学都知道,TCP协议是通过FIN包与ACK包来做四次挥手,从而断开TCP连接的,这是正常的TCP断连过程,但TCP协议中还有RST包,这种包用于异常情况下断开连接,Linux在收到RST包后,会直接关闭本端的Socket连接,而不需要经历四次挥手过程。

而上面的ngrep与tcpkill命令,正是通过给对方发送RST包,从而实现杀死TCP连接的。但要发送一个正确的RST包,需要知道TCP连接交互时所使用的序列号(seq),因为乱序的包会被TCP直接丢弃,所以ngrep和tcpkill还会监听网卡上交互的包,以找到指定连接所使用的序列号seq。

所以,ngrep与tcpkill只能kill有流量的活跃TCP连接,对于空闲连接就无法处理了。

kill空闲的TCP连接

对于空闲状态的TCP连接,可以用ss或hping3命令来处理,如下:

使用ss杀死连接

通过ss命令的-K选项可以用来kill连接,如下:

# 安装ss命令
$ sudo apt install iproute2
# 使用ss杀死目标端口为65987的连接
$ sudo ss -K dport = 65987

注意,使用这个功能需要你的内核版本>=4.9,且打开了CONFIG_INET_DIAG_DESTROY选项,因此某些情况下可能无法使用。

使用hping3杀死连接

如果无法使用ss命令,则可以考虑使用hping3命令来kill连接,hping3命令可以发任何类型的TCP包,因此只要模拟tcpkill的原理即可,如下:

  • 通过发送SYN包来获取seq

上面提到了,TCP协议会直接丢弃乱序的数据包,但是对于SYN包却区别对待了,如果你随便发一个SYN包给已连接状态的Socket,它会回复一个ACK,并携带有正确的seq序列号,如下:

# 第一个参数,表示发送包的目标ip地址
# -a:设置包的源ip地址
# -s:设置包的源端口
# -p:设置包的目标端口
# --syn:表示发SYN包
# -V:verbose output,使hping3输出序列号seq
# -c:设置发包数量
$ sudo hping3 172.26.79.103 -a 192.168.18.230 -s 8080 -p 45316 --syn -V -c 1
using eth0, addr: 172.26.79.103, MTU: 1500
HPING 172.26.79.103 (eth0 172.26.79.103): S set, 40 headers + 0 data bytes
len=40 ip=172.26.79.103 ttl=64 DF id=16518 tos=0 iplen=40
sport=45316 flags=A seq=0 win=502 rtt=13.4 ms
seq=1179666991 ack=1833836153 sum=2acf urp=0

可以在输出中找到,ack=1833836153即是对方回复的序列号,我们用在后面的发RST包中。

  • 使用seq发RST包
# --rst:表示发RST包
# --win:设置TCP窗口大小
# --setseq:设置包的seq序列包
$ sudo hping3 172.26.79.103 -a 192.168.18.230 -s 8080 -p 45316 --rst --win 0 --setseq 1833836153 -c 1
HPING 172.26.79.103 (eth0 172.26.79.103): R set, 40 headers + 0 data bytes
--- 172.26.79.103 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

整个过程如下:

可以发现前面我们用lsof查到的连接,在发送RST包后就查不到了,说明连接已经被kill了。整个操作看起来有点麻烦,可以自己写个脚本封装一下。

以上就是kill一条TCP连接实现方法详解的详细内容,更多关于kill TCP连接的资料请关注脚本之家其它相关文章!

相关文章

  • Git 2.27.0详细安装步骤详解

    Git 2.27.0详细安装步骤详解

    这篇文章主要介绍了Git 2.27.0详细安装步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • VSCode开发必备插件推荐(墙裂推荐!)

    VSCode开发必备插件推荐(墙裂推荐!)

    vscode是微软开发的的一款代码编辑器,就如官网上说的一样,vscode重新定义(redefined)了代码编辑器,下面这篇文章主要给大家介绍了关于VSCode必备插件推荐的相关资料,需要的朋友可以参考下
    2022-11-11
  • transform实现HTML5 video标签视频比例拉伸实例详解

    transform实现HTML5 video标签视频比例拉伸实例详解

    这篇文章主要介绍了transform实现HTML5 video标签视频比例拉伸的相关资料,需要的朋友可以参考下
    2016-09-09
  • VS2019无法添加引用问题

    VS2019无法添加引用问题

    这篇文章主要介绍了VS2019无法添加引用问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 彻底解决页面文字编码乱码问题

    彻底解决页面文字编码乱码问题

    在HTML页面中、Javascript脚本中、以及XML数据传输中,因为编码导致的问题不计其数。
    2009-10-10
  • WebStorm 遇到的问题总结

    WebStorm 遇到的问题总结

    这篇文章主要介绍了WebStorm 遇到的问题总结的相关资料,需要的朋友可以参考下
    2017-03-03
  • OB系统变量Variables及ODC管理会话功能详解

    OB系统变量Variables及ODC管理会话功能详解

    这篇文章主要为大家介绍了OB系统变量Variables及ODC管理会话功能详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 永久解决VSCode终端中文乱码问题

    永久解决VSCode终端中文乱码问题

    这篇文章主要介绍了永久解决VSCode终端中文乱码问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 声音验证码制作方法

    声音验证码制作方法

    收听验证码已经比较普遍了,使用户看不清楚的情况下可以通过耳朵来收听验证码,但网上搜了很久没看到有具体的制作方法,自己想了想,还是按自己的方法来实现了,呵呵。
    2009-06-06
  • Scratch3.0初始化加载七牛云上的sbs文件的方法

    Scratch3.0初始化加载七牛云上的sbs文件的方法

    今天通过本文给大家介绍Scratch3.0初始化加载七牛云上的sbs文件的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08

最新评论