tcpwall
当咱们想要阻止某些 TCP 连贯的建设,在 Linux 平台上有一个很好的解决方案iptables,然而对那些曾经建设的 tcp 连贯,iptables 就不能做到得心应手的阻断了。
我在互联网上检索的时候发现了 tcpkill 这个工具,tcpkill 是一个网络分析工具集 dsniff 中的一个小工具。在 Linux 上能够间接通过 dsniff 包装置,应用形式也非常简单。
通过测试我发现 tcpkill 在执行命令之后并不会立即阻断 tcp 连贯,而是期待有数据传输时,才会阻断,因而在执行完命令之后程序并不会被动退出,而是须要通过 Ctrl+C 来退出,这对于某些想要通过程序来调用的脚本小子(例如我)来说几乎是个劫难。
如何阻断一个曾经建设的 tcp 连贯?
阻断一个曾经建设的 tcp 连贯通常有这几种计划:
- 服务端被动断开
- 客户端被动断开
- 拔掉网线(工夫要超过 tcp 超时工夫)
- 伪造 RST 数据包发送给服务端和客户端让它们被动断开(tcpkill 就是这么做的)
前三种局限性太大,只能用第 4 种了。
如何实现伪造 RST 数据报文包?
GoPacket 是 go 基于 libpcap 构建的一个库,能够通过旁路的形式接管一份数据包的拷贝。因而咱们能够很不便捕捉到正在通信的 tcp 数据报文。通过数据报文,咱们能够获取到通信单方的 MAC 地址,IP 和端口号,以及 ACK 号等,这些都是伪造数据包必不可少的。
在学习了 tcpkill 的源码之后,我应用 go 开发了一个增强版的 tcpwall,tcpwall 不仅能够实现和 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…