tcpwall

当咱们想要阻止某些TCP连贯的建设,在Linux平台上有一个很好的解决方案iptables,然而对那些曾经建设的tcp连贯,iptables就不能做到得心应手的阻断了。

我在互联网上检索的时候发现了tcpkill这个工具,tcpkill是一个网络分析工具集dsniff中的一个小工具。在Linux上能够间接通过dsniff包装置,应用形式也非常简单。

通过测试我发现tcpkill在执行命令之后并不会立即阻断tcp连贯,而是期待有数据传输时,才会阻断,因而在执行完命令之后程序并不会被动退出,而是须要通过Ctrl+C来退出,这对于某些想要通过程序来调用的脚本小子(例如我)来说几乎是个劫难。

如何阻断一个曾经建设的tcp连贯?

阻断一个曾经建设的tcp连贯通常有这几种计划:

  1. 服务端被动断开
  2. 客户端被动断开
  3. 拔掉网线(工夫要超过tcp超时工夫)
  4. 伪造RST数据包发送给服务端和客户端让它们被动断开(tcpkill就是这么做的)

前三种局限性太大,只能用第4种了。

如何实现伪造RST数据报文包?

GoPacket 是go基于libpcap构建的一个库,能够通过旁路的形式接管一份数据包的拷贝。因而咱们能够很不便捕捉到正在通信的tcp数据报文。通过数据报文,咱们能够获取到通信单方的MAC地址,IP和端口号,以及ACK号等,这些都是伪造数据包必不可少的。

在学习了tcpkill的源码之后,我应用go开发了一个增强版的tcpwalltcpwall不仅能够实现和tcpkill同样的基于ip或端口监听到指定数据报文之后伪造RST数据报文来阻断tcp连贯,也能够通过源ip源端口,目标ip目标端口来被动发送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}

其余

  • -timeout 工夫(秒)指定期待多久之后退出程序

我的项目地址 https://github.com/dushixiang...