tcpkill 是一款用于终止局域网中已建立 TCP 连接的网络工具软件,由 Dug Song 编写,属于 dsniff 工具集的一部分。它通过抓取符合过滤条件的报文获得连接的序列号信息,再向通信双方分别伪造并注入 TCP RST 重置报文,从而在不关闭双方程序的前提下断开连接。该工具需要 root 权限运行,常用于网络审计、安全测试以及模拟网络中断场景。
定义
tcpkill 是 dsniff 工具集中的一款命令行网络工具,用途是终止指定的进行中 TCP 连接,可以按主机、网络、端口或它们的组合来选定目标[1][2]。它面向局域网环境,采用与 tcpdump 相同的过滤器语法来指定要处理的连接[3][4]。
该工具的运行需要 root 权限,通常作为 dsniff 软件包的一部分安装,在 Debian、Ubuntu、Arch Linux 等发行版中随该软件包分发[3][5]。官方手册把它的作用范围限定在局域网内的 TCP 连接[6]。
原理
TCP 连接的任一端点在收到序列号落在接收窗口内的 RST 报文时,会立即释放连接状态。tcpkill 正是利用这一机制:它先通过 libpcap 库抓取匹配过滤条件的报文,从报文中解析出当前会话的序列号与确认号,再冒充通信的双方,各自向对端注入伪造的 RST 报文[7]。伪造源 IP 地址并不困难,难点在于让 RST 报文的序列号落入对方不断滑动的接收窗口,否则报文会被直接丢弃[7]。
为此,程序提供了 -1 至 -9 的暴力程度参数,数字越大表示发送越多按推测序列号构造的 RST 报文,默认值为 3;在高速连接上需要更高的数值才能命中移动中的接收窗口[1][4]。命令行形式为 tcpkill [-i interface] [-1...9] expression,其中 -i 指定监听的网络接口,expression 为 tcpdump 风格的过滤表达式[6]。
其核心流程可以概括为:抓包监听匹配连接,读取报文中的序列号信息,构造并发送 RST 报文,等待连接端点关闭会话。程序内部以回调方式处理每一个符合过滤条件的报文,因此只在目标连接上出现新报文时才会触发注入动作。
发展历程
tcpkill 由 Dug Song 开发,是 dsniff 工具集的组成部分。dsniff 的构想源自密歇根大学 CITI 研究室的研究成果,Dug Song 于 1999 年 12 月发布了 dsniff 的早期版本[8]。根据该项目的变更记录,tcpkill 作为新增程序出现在 2000 年 1 月 21 日发布的 1.3 版中。
2000 年 1 月 27 日发布的 1.4 版为 tcpkill 增加了 -v 详细输出选项。2000 年 12 月发布的 2.3 版要求 tcpkill 必须给出 pcap 过滤表达式,并统一了各工具的输出格式。2001 年 3 月发布的 2.4b1 是该系列较晚的测试版本[8]。由于 dsniff 在部分发行版中已不再默认提供、维护也趋于停滞,社区出现了用 Go 语言 配合 gopacket 库重写的实现,以便在新的平台上继续使用同类功能[9]。
应用
该工具的主要用途是检验现有程序在网络出现故障时的表现,例如观察程序能否自动重连、是否给出恰当的错误提示;其便利之处在于断开连接时不必关闭建立连接的程序本身[9]。在网络审计与安全测试中,它也被用于切断指定的会话连接[3]。
管理员可以用它处理长期占用的连接。典型用法是指定接口、主机与端口,例如同时按源端口和目标端口筛选,将某条保持很久的连接重置掉[10]。除主机外,过滤条件也可以写成端口或网络形式,例如针对特定端口的所有连接[2]。
从实现方式看,向双方注入伪造 RST 报文属于中间人操作,因此该工具也可用于在局域网或广域网范围内制造针对特定目标的拒绝服务效果[9][2]。
局限
tcpkill 只能断开网络接口上可见、且仍有数据传输的连接。程序要先抓到目标连接的报文,才能得到正确的序列号并构造出有效的 RST 报文,所以对一条已经不再收发数据的空闲连接,命令执行后往往长时间没有效果[7]。有资料把它概括为:仅当存在可供捕获的流量时才能工作,并且需要等待这样的流量出现[11]。
对于僵死连接或半连接,这类方式无法奏效,因为拿不到可用序列号。应对办法之一是主动发送 SYN 报文,从对端返回的 ACK 中推算出当前序列号,再据此构造 RST,这类做法可以覆盖活跃与非活跃连接[7]。
此外,该工具依赖对报文的抓取与解析,需要 root 权限,且只对网络中可见的未加密连接有效;对活跃连接有时需要多次尝试才能成功重置[3]。其功能也受所处的网络位置限制,跨交换设备或加密通道的场景会影响其可用性。
参见
参考资料
- tcpkill(8) — dsniff — Debian trixie [引用日期2026-10-14]
- Tcpkill [引用日期2026-10-14]
- tcpkill man | Linux Command Library [引用日期2026-10-14]
- tcpkill(8) — Arch manual pages [引用日期2026-10-14]
- tcpkill [引用日期2026-10-14]
- File: tcpkill.8 [引用日期2026-10-14]
- 29-TCP RST 攻击与如何杀掉一条 TCP 连接 [引用日期2026-10-14]
- linux嗅探工具[Dsniff] [引用日期2026-10-14]
- go-tcpkill [引用日期2026-10-14]
- [Linux] 使用tcpkill杀掉tcp连接 [引用日期2026-10-14]
- SOCK_DESTROY: an old Android patch aims upstream [引用日期2026-10-14]