[转帖] 如何kill一条TCP连接?
https://www.cnblogs.com/codelogs/p/16838850.html
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。
简介#
如果你的程序写得有毛病,打开了很多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连接?
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 如果你的程序写得有毛病,打开了很多TCP连接,但一直没有关闭,即常见的连接泄露场景,你可能想要在排查问题的过程中, ...
- Linux 内核协议栈之TCP连接关闭
Close行为: 当应用程序在调用close()函数关闭TCP连接时,Linux内核的默认行为是将套接口发送队列里的原有数据(比如之前残留的数据)以及新加入 的数据(比如函数close()产生的FIN ...
- close_wait状态和time_wait状态(TCP连接)
1.CLOSE_WAIT的简单解决方案 不久前,我的Socket Client程序遇到了一个非常尴尬的错误.它本来应该在一个socket长连接上持续不断地向服务器发送数据,如果socket连接断开,那 ...
- TCP/IP 笔记 - TCP连接管理
TCP是一种面向连接的单播协议,在发送数据之前,通信双方必须在彼此建立一条连接:这与UDP的无连接不同,UDP无需通信双方发送数据之前建立连接.所有TCP需要处理多种TCP状态时需要面对的问题,比如连 ...
- TCP/IP协议--TCP协议概括和TCP连接的建立和终止
TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...
- TCP连接三次握手协议,释放连接四次挥手,以及使用 awl伪造mac地址进行多线程syn洪泛攻击。
这个TCP连接就是一次追女生-谈恋爱-分手,追求比分手简单,但是分手比追求复杂.哥,谈了半年的女朋友,在就快要成功了的时候分了,原因是因为有人在后面该老子背后搞SYN洪泛攻击,最后女朋友丢失了.学会T ...
- Http权威指南(TCP连接)
1.HTTP请求的过程 世界上几乎所有的HTTP通信都是由TCP/IP承载的,当发生HTTP请求时,实际上经过了以下几个步骤: ①浏览器从请求的URL中解析主机名 ②浏览器查询这个主机名的IP地址 ③ ...
- 利用tcpdump抓包工具监控TCP连接的三次握手和断开连接的四次挥手
TCP传输控制协议是面向连接的可靠的传输层协议,在进行数据传输之前,需要在传输数据的两端(客户端和服务器端)创建一个连接,这个连接由一对插口地址唯一标识,即是在IP报文首部的源IP地址.目的IP地址, ...
- 多图详解 TCP 连接管理,太全了!!!
TCP 是一种面向连接的单播协议,在 TCP 中,并不存在多播.广播的这种行为,因为 TCP 报文段中能明确发送方和接受方的 IP 地址. 在发送数据前,相互通信的双方(即发送方和接受方)需要建立一条 ...
- 关于TCP连接的3次握手和4次挥手
3次握手: 关键在于双方都需要确认自己的发信和收信功能正常,收信功能通过接收对方信息得到确认,发信功能需要发出信息—>对方回复信息得到确认. 举个日常例子,打电话时我们对话如下: 如上,需要第三 ...
随机推荐
- Mybatis源码3 CachingExecutor, 二级缓存,缓存的实现
Mybatis CachingExecutor, 二级缓存,缓存的实现 一丶二级缓存概述 上一章节,我们知道mybaits在构造SqlSession的时候,需要让SqlSession持有一个执行器,如 ...
- Cesium案例解析(九)——Rotatable2DMap旋转2D地图
目录 Cesium的Rotatable 2D Map示例展示了一个旋转的二维地图: 'use strict'; var viewer = new Cesium.Viewer('cesiumContai ...
- 规模化敏捷框架何从入手?这篇文章把SAFe讲透了!
摘要:敏捷软件开发理念已渐渐被业界普遍接受,越来越多的公司和团队不得不面对一个新的问题,就是规模化敏捷的引入和实现.目前市场上规模化框架主要有SAFe,Less,Scrum of Scrums, Sp ...
- 云小课 | 守护网络安全不是问题,iptables的四表五链为你开启“八卦阵”
摘要:担心网络基本安全?iptables八卦阵为您守护!本文带您一起了解iptables的相关知识. 网络世界就和现实世界一样,总是会有些不怀好意的"人"出现,扫扫你的端口啊,探测 ...
- Apache Superset 1.2.0教程 (一)—— 安装(Windows版)
Apache Superset 是一款由 Airbnb 开源的"现代化的企业级 BI(商业智能) Web 应用程序",其通过创建和分享 dashboard,为数据分析提供了轻量级的 ...
- 苹果商店上架流程_App上架苹果流程及注意事项
苹果商店上架流程_App上架苹果流程及注意事项 APP上架是:APP应用从提交审核到上架整个过程.目的是让应用展示在APP Store上获取流量及用户 一.IOS上架整个流程 1.申请开发者账号 2. ...
- Excel 选择性粘贴
乘以某个系数 选择 粘贴时,乘以某个系数 两列合一列 添加一列辅助列 方法2
- 灵魂拷问std::enable_shared_from_this,揭秘实现原理
参考博客: std::enable_shared_from_this原理浅析 引言 在C++编程中,使用智能指针是一种安全管理对象生命周期的方式.std::shared_ptr是一种允许多个指针共享对 ...
- UVA 156 Ananagrams STL应用
https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&prob ...
- POJ - 3180 The Cow Prom ( korasaju 算法模板)
The Cow Prom POJ - 3180 题意: 奶牛圆舞:N头牛,M条有向绳子,能组成几个歌舞团(团内奶牛数 n >= 2)?要求顺时针逆时针都能带动舞团内所有牛. 分析: 所谓能带动, ...