6月 2021

[转]如何干掉一条tcp 连接(活跃/非活跃)

原文来自:https://developer.aliyun.com/article/59308,之前遇到了同样的问题,在实现RTMP服务器时由于没有设置SO_RCVTIMEO,导致在RTMP握手消息交换阶段无限等待握手数据包,出现了非活跃状态的tcp连接占用情况,试过原版tcpkill,由于非活跃状态,无法强行断开连接,所幸找到了这个修改版,试了下成功踢掉了捣乱连接,特此分享,感谢原作者!

背景

最近在测试环境部署服务的时候老是会有端口被占用情况用netstat/ss 查看后发现端口一直被占用
同另外一个ip 建立了tcp 连接,类似于这样:

ESTAB      0      0      192.168.103.169:12345              192.168.103.12:10261 

当然这个问题也不是最近才遇到,之前也遇到过,不过之前都是很快这个连接就自动消失,我就可以欢快
的使用我自己喜欢的12345 端口,无奈这次一直连续好几天这个连接一直存在导致我一直无法使用这个端口。

解决过程

1. google 找答案

google 果然告诉我答案,有个叫tcpkill 的工具(可以自行搜索一下),看到之后立即将源码下下来
编译了一把,按照提示将几个确实的包安装后编译成功,然后按照tcpkill 的帮助文档进行操作

tcpkill -i eth0 src port 12345 and dst port 10261 and src host 192.168.103.169 dst host 192.168.103.12
# 按照libpcap 规则描述出一个tcp 连接

执行上述命令后发现tcpkill 感觉像是处于hang 住状态,运行了半天也没见把这个连接干掉,为什么这个连接没干掉? 于是用 nc 测试了下,发现如下情况

对于nc 已经建立的连接运行tcpkill 后无法立即干掉,只有在这个连接上有数据传输的时候才会把发送rst 包将连接reset 掉。
Continue reading…