Linux系统下如何查看并重置/终止跨设备TCP连接并实现Python自动化
网关侧查看并重置跨主机TCP连接解决方案
前置依赖安装
首先在VM1(网关)上执行以下命令安装所需工具:
sudo apt update && sudo apt install -y conntrack dsniff coreutils
- conntrack:Netfilter连接跟踪工具,可查看所有流经网关的转发连接
- dsniff:包含
tcpkill工具,用于发送TCP RST包终止连接 - coreutils:自带
timeout命令,解决tcpkill长期占用终端的问题
查看VM2与VM3之间的转发TCP连接
netstat/ss仅能识别本机的TCP连接,无法查看网关转发的第三方流量,使用conntrack查询:
- 查看所有流经网关的TCP连接:
sudo conntrack -L -p tcp - 过滤VM3到VM2的SSH连接(替换为你实际的IP地址):
sudo conntrack -L -p tcp --src [VM3_IP] --dst [VM2_IP] --dport 22
返回结果中可直接获取连接的源端口、目的端口、连接状态等四元组信息。
无阻塞终止目标TCP连接
使用timeout命令限定tcpkill的运行时长,无需手动Ctrl+C退出:
sudo timeout 3s tcpkill -i [VM1承接内网流量的网卡名] host [VM3_IP] and host [VM2_IP] and port 22
- 3s为运行时长,通常1~3秒足够发送RST包终止连接,超时后进程自动退出
- 网卡名可通过
ip a命令查询,通常为eth0、ens33等
Python3自动化集成方案
你可以直接将上述命令封装到Python脚本中,使用subprocess模块调用即可,参考实现:
import subprocess import sys def kill_ssh_connection(vm3_ip, vm2_ip, port=22, interface="eth0"): # 先查询连接是否存在 check_cmd = f"sudo conntrack -L -p tcp --src {vm3_ip} --dst {vm2_ip} --dport {port} 2>/dev/null | wc -l" conn_count = int(subprocess.getoutput(check_cmd)) if conn_count == 0: print("未找到目标SSH连接") return False # 执行连接终止 kill_cmd = f"sudo timeout 3s tcpkill -i {interface} host {vm3_ip} and host {vm2_ip} and port {port} >/dev/null 2>&1" subprocess.run(kill_cmd, shell=True) print("目标连接已终止") return True if __name__ == "__main__": if len(sys.argv) != 4: print("用法: python3 kill_tcp.py [VM3_IP] [VM2_IP] [网卡名]") sys.exit(1) kill_ssh_connection(sys.argv[1], sys.argv[2], interface=sys.argv[3])
保存为kill_tcp.py后,直接运行sudo python3 kill_tcp.py [VM3_IP] [VM2_IP] [网卡名]即可完成单命令操作。
可选轻量方案(无需tcpkill)
如果你不想依赖外部工具,可以用Python的scapy库构造TCP RST包主动发送,同样可以实现连接终止的效果。
内容的提问来源于stack exchange,提问作者Andy Garcia
相关产品推荐
相关产品推荐

