工作原理

日常工作生活中大家在维护自己的服务器、VPS有时会碰到这样的情况:服务器上突然出现了许多来自未知ip的网络连接与流量,我们需要第一时间切断这些可能有害的网络连接。除了iptables/ipset, blackhole routing这些常规手段,我们还可以借助一些更轻量级的小工具来临时处理这些情况,如tcpkill。

tcpkill不会马上中断目标tcp连接,是因为伪造tcp rst包时,需要填入正确的sequence number,这需要通过拦截双方的tcp通信才能实时得到。所以运行tcpkill后,只有目标连接有新tcp包发送/接受才会导致tcp连接中断。因此针对CLOSE_WAIT等没有有效数据的链接是无效的


源码编译安装

由于Dsniff套件编译需要各种依赖问题,因此采用其他的演绎版本

https://github.com/chartbeat/tcpkill.git 


运行指令

果我们需要使用tcpkill临时禁止服务器与主机10.0.0.1的tcp连接,可以在服务器上输入命令:

# tcpkill host 10.0.0.1

断开60040端口链接

./tcpkill  port 60040

依赖pcap

目前适配版本libpcap-0.7.2

pcaputil.c:17:10: 致命错误:pcap.h:没有那个文件或目录
 #include <pcap.h>
 
 In file included from pcaputil.c:22:0:
pcaputil.h:14:9: 错误:与‘pcap_init’类型冲突
 pcap_t *pcap_init(char *intf, char *filter, int snaplen);
         ^~~~~~~~~
In file included from /usr/local/include/pcap.h:43:0,
                 from pcaputil.c:17:
/usr/local/include/pcap/pcap.h:386:14: 附注:‘pcap_init’的上一个声明在此
 PCAP_API int pcap_init(unsigned int, char *);
              ^~~~~~~~~
pcaputil.c:61:1: 错误:与‘pcap_init’类型冲突
 pcap_init(char *intf, char *filter, int snaplen)