tcpwall当我们想要阻止一些TCP连接的建立时,Linux平台上有iptables很好的解决方案,但是对于那些已经建立的tcp连接,iptables并不能为所欲为堵塞。在网上搜索的时候,找到了tcpkill这个工具。tcpkill是网络分析工具集dsniff中的一个小工具。在Linux上可以直接通过dsniff包安装,使用方法也很简单。通过测试,我发现tcpkill在执行命令后不会立即阻塞tcp连接,而是只有在有数据传输时才会阻塞。因此,程序执行完命令后不会主动退出,而是需要通过Ctrl+C退出,这对于一些想通过编程方式调用的脚本小子(比如我)来说是一场灾难。如何阻止已建立的tcp连接?阻塞已建立的tcp连接通常有几种方案:服务端主动断开客户端主动断开并拔掉网线(时间必须超过tcp超时时间)伪造RST包发送给服务端和客户端使他们主动断开连接(tcpkill就是这样做的)前三个限制太大,只能用第四个。如何实现伪造的RST数据包?GoPacket是go基于libpcap构建的库,可以通过旁路接收数据包的副本。因此,我们可以很容易地抓取正在通信的tcp数据包。通过数据包,我们可以得到通信双方的MAC地址、IP和端口号、ACK号,这些都是伪造数据包必不可少的。学习了tcpkill的源码后,用go开发了一个加强版的tcpwall。tcpwall不仅可以实现和tcpkill一样的基于ip或者端口监听指定的数据报文伪造RST数据报文阻断tcp连接,还可以通过sourceip源端口和目的ipdestination主动发送SYN数据包端口诱导那些没有数据的tcp连接发送ACK数据包获取源MAC、目的MAC和ACK号,可以指定参数让程序等待一段时间后自动退出。如何阻止具有指定IP和端口的TCP连接(不关心源或目标)tcpwall-i{interface}-host{host}-port{port}阻止具有指定源IP和源端口的TCP连接tcpwall-i{interface}-shost{src_host}-sport{src_port}阻塞指定目的IP和目的端口的TCP连接tcpwall-i{interface}-dhost{dst_host}-dport{dst_port}阻塞指定源IP、源端口和目的IP,目的端口的TCP连接(会主动向双方发送SYN数据包)tcpwall-i{interface}-shost{src_host}-sport{src_port}-dhost{dst_host}-dport{dst_port}Others-timeouttime(seconds)指定程序退出前等待的时间项目地址https://github.com/dushixiang...
