众所周知,企业以及数据中心网络内,DHCP 污染和 ARP 攻击一直以来都是会令网络从业人员感到头痛的问题。前者在企业网络内造成大量的 DHCP 抢占导致网内设备无法上网,后者则是各种网内都会存在的攻击。这两类攻击均会导致网络内设备无法正常通信。
今天我们来讲解一下如何使用 DHCP Snooping 和 DAI 来从根源上抹杀此类攻击。
快速开始:什么是 DHCP Snooping 和 DAI?
这里我们来摘取 Cisco 官方文档的原文来进行总结:
- Dynamic ARP inspection depends on the entries in the DHCP snooping binding database to verify IP-to-MAC address bindings in incoming ARP requests and ARP responses. Make sure to enable DHCP snooping to permit ARP packets that have dynamically assigned IP addresses.
- DHCP snooping is a security feature that acts like a firewall between untrusted hosts and trusted DHCP servers.
DHCP Snooping 是个安全特性,它类似于在“不信任的主机”和“信任的 DHCP 服务器”之间的防火墙,用来过滤非法的 DHCP OFFER 等请求。
Dynamic ARP inspection (DAI) 是根据 DHCP Snooping 绑定数据库来验证从端口进来的 ARP 请求/回复数据包的 IP-MAC 所对应的关系。若启用该特性,需要你在接入层交换机开启 DHCP Snooping.
也就是说,在数据中心内使用动态的方法开启 ARP 防攻击,需要以 DHCP Snooping 为前提才能开启。
DHCP Snooping 和 DAI 只需要在接入层交换机启用即可,汇聚以及核心无需启用。
接下来我们来做一个实验用于验证 DAI 是否能做到防 ARP 攻击,拓扑如下图:
这是一个很经典的 Spine – leaf 的架构图,Switch-RE 为核心交换机,负责担任网关,DHCP-Server 则是于交换机旁路链接的外部 DHCP 服务器,用于给 Client 1-4 分配 IP. A 和 B 则是接入层交换机。
网络的信息以及 Client 服务器将会获取的 IP 如下:
- 交换机 VLAN ID:100
- Gateway IP: 10.100.0.254/24
- Client 1 IP: 10.100.0.1/24
- Client 2 IP: 10.100.0.2/24
- Client 3 IP: 10.100.0.3/24
- Client 4 IP: 10.100.0.4/24
- ISP_Customer: 100.70.0.2
开始实验:配置 DHCP Snooping 和 DAI
配置前请注意:
- 1. DAI 开启后,因为会检查客户机发送过来的数据包,所以性能会有一些损失
- 2. DHCP Snooping 配置后,一定要记得配置定时写入数据库,防止意外断电重启后导致的客户机无法上网
其他平台 (Huawei, Juniper) 与 Cisco 的配置逻辑类似,这里因为我的 Lab 内镜像无法配置该功能,所以略过。
配置之前,现展示一下 DHCP 服务器的预配置,这里记录了客户机的 IP/MAC 所对应的绑定表:
[admin@MikroTik] > ip dhcp-server export # mar/14/2021 13:45:34 by RouterOS 6.45.9 # software id = # # # /ip dhcp-server add disabled=no interface=ether1 name=dhcp1 relay=10.100.0.254 /ip dhcp-server lease add address=10.100.0.1 mac-address=50:01:00:04:00:00 add address=10.100.0.2 mac-address=50:01:00:05:00:00 add address=10.100.0.3 mac-address=50:01:00:06:00:00 add address=10.100.0.4 mac-address=50:01:00:07:00:00 /ip dhcp-server network add address=10.100.0.0/24 dns-server=8.8.8.8 gateway=10.100.0.254
OK,我们首先配置 B 交换机:
B(config)#ip dhcp snooping // 开启 DHCP Snooping 功能 B(config)#ip dhcp snooping vlan 100 // 针对 VLAN 100 来进行 ARP 检查 B(config)#no ip dhcp snooping information option // 关闭 Option 82 插入 B(config)#ip dhcp snooping database write-delay 60 // 开启自动写入 DHCP Snooping 数据库功能,当有条目更新后,延迟60秒写入,可写入本地 flash 或者 tftp 服务器 B(config)#ip dhcp snooping database flash:dhcp_snooping.db // 保存路径 *Mar 14 12:51:53.901: %DHCP_SNOOPING-6-AGENT_OPERATION_SUCCEEDED: DHCP snooping database Write succeeded. B(config)#ip dhcp snooping database timeout 60 // 写入失败后重试间隔 B(config)#errdisable recovery cause dhcp-rate-limit // 若有内网机器的 DHCP 泛洪导致接口被关闭,允许其恢复正常状态 B(config)#errdisable recovery interval 30 // 被关闭后等待 30 秒再恢复 B(config)# ip arp inspection vlan 100 // 针对 VLAN 100 开启 ARP 检查功能 B(config)#int g0/0 B(config-if)#ip dhcp snooping trust // 设置 G0/0 为 DHCP 信任端口(允许通行,不检查) B(config-if)#ip arp inspection trust // 设置 G0/0 为 ARP 信任接口(允许通行,不检查) B(config-if)#end B#wr *Mar 14 12:55:08.490: %GRUB-5-CONFIG_WRITING: GRUB configuration is being updated on disk. Please wait... *Mar 14 12:55:09.226: %GRUB-5-CONFIG_WRITTEN: GRUB configuration was written to disk successfully.
为什么要这么配置?直接用一张图即可解释清楚:
由于 Cisco 交换机默认所有端口都是不信任状态,而我们需要允许我们的可信任的路由器所发的 DHCP OFFER 数据包通过交换机,则需要将 G0/0 接口配置为信任模式。这个路径是我们掌握下的,是可以信任的。ARP 的返回路径也是同理,无需进行检查。
配置完成后,我们来看看交换机显示:
B# show ip dhcp snooping binding MacAddress IpAddress Lease(sec) Type VLAN Interface ------------------ --------------- ---------- ------------- ---- -------------------- 50:01:00:04:00:00 10.100.0.1 579 dhcp-snooping 100 GigabitEthernet0/2 Total number of bindings: 1 B# show ip arp inspection statistics Vlan Forwarded Dropped DHCP Drops ACL Drops ---- --------- ------- ---------- --------- 100 6 0 0 0 Vlan DHCP Permits ACL Permits Probe Permits Source MAC Failures ---- ------------ ----------- ------------- ------------------- 100 3 0 0 0 Vlan Dest MAC Failures IP Validation Failures Invalid Protocol Data ---- ----------------- ---------------------- --------------------- 100 0 0 0
DHCP Snooping 和 DAI 已经可以正常工作了,接下来我们来验证一些攻击的情况。
- 客户端非法使用未分配的 IP 地址
我们为 Client 1 手动配置一个 10.100.0.100/24 来试试看:
root@localhost:~# ip addr add 10.100.0.100/24 dev ens3 root@localhost:~# ip ro add default via 10.100.0.254 root@localhost:~# ping isp PING isp (100.70.0.2) 56(84) bytes of data. From 10.100.0.100 icmp_seq=1 Destination Host Unreachable From 10.100.0.100 icmp_seq=2 Destination Host Unreachable From 10.100.0.100 icmp_seq=3 Destination Host Unreachable --- isp ping statistics --- 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 29ms
再看看此时交换机做出了什么动作:
*Mar 14 13:41:13.577: %SW_DAI-4-DHCP_SNOOPING_DENY: 1 Invalid ARPs (Req) on Gi0/2, vlan 100.([5001.0004.0000/10.100.0.100/0000.0000.0000/10.100.0.254/13:41:13 UTC Sun Mar 14 2021]) *Mar 14 13:41:14.579: %SW_DAI-4-DHCP_SNOOPING_DENY: 1 Invalid ARPs (Req) on Gi0/2, vlan 100.([5001.0004.0000/10.100.0.100/0000.0000.0000/10.100.0.254/13:41:14 UTC Sun Mar 14 2021]) *Mar 14 13:41:15.601: %SW_DAI-4-DHCP_SNOOPING_DENY: 1 Invalid ARPs (Req) on Gi0/2, vlan 100.([5001.0004.0000/10.100.0.100/0000.0000.0000/10.100.0.254/13:41:15 UTC Sun Mar 14 2021]) B#show ip arp inspection stati Vlan Forwarded Dropped DHCP Drops ACL Drops ---- --------- ------- ---------- --------- 100 68 33 33 0 Vlan DHCP Permits ACL Permits Probe Permits Source MAC Failures ---- ------------ ----------- ------------- ------------------- 100 34 0 0 0 Vlan Dest MAC Failures IP Validation Failures Invalid Protocol Data ---- ----------------- ---------------------- --------------------- 100 0 0 0
可以看到交换机立即报警,并将攻击记录打到 console 里面。
再来看看另一种情况。
2. 客户端使用了非法的 MAC 地址
我们先从 DHCP 服务器获得 IP 地址,让交换机生成 Snooping 表项,然后将 Client 1 的 MAC 地址从 50:01:00:04:00:00 改成 50:01:00:04:00:01 (模拟伪造 MAC 地址攻击):
root@localhost:~# dhclient -i ens3 root@localhost:~# ip a 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group def0 link/ether 50:01:00:04:00:00 brd ff:ff:ff:ff:ff:ff inet 10.100.0.1/24 brd 10.100.0.255 scope global dynamic ens3 valid_lft 599sec preferred_lft 599sec inet6 fe80::5201:ff:fe04:0/64 scope link valid_lft forever preferred_lft forever root@localhost:~# ip link set dev ens3 address 50:01:00:04:00:01 root@localhost:~# ip a 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group def0 link/ether 50:01:00:04:00:01 brd ff:ff:ff:ff:ff:ff inet 10.100.0.1/24 brd 10.100.0.255 scope global dynamic ens3 valid_lft 535sec preferred_lft 535sec inet6 fe80::5201:ff:fe04:0/64 scope link valid_lft forever preferred_lft forever root@localhost:~# ping isp PING isp (100.70.0.2) 56(84) bytes of data. From 10.100.0.1 icmp_seq=1 Destination Host Unreachable From 10.100.0.1 icmp_seq=2 Destination Host Unreachable From 10.100.0.1 icmp_seq=3 Destination Host Unreachable --- isp ping statistics --- 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 47ms root@localhost:~# ip link set dev ens3 address 50:01:00:04:00:00 root@localhost:~# ping isp PING isp (100.70.0.2) 56(84) bytes of data. 64 bytes from isp (100.70.0.2): icmp_seq=1 ttl=61 time=21.4 ms --- isp ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 21.440/21.440/21.440/0.000 ms
可以发现更改 MAC 地址后直接不通了,再看看交换机有什么动作:
*Mar 14 13:48:55.235: %SW_DAI-4-DHCP_SNOOPING_DENY: 1 Invalid ARPs (Req) on Gi0/2, vlan 100.([5001.0004.0001/10.100.0.1/0000.0000.0000/10.100.0.254/13:48:54 UTC Sun Mar 14 2021]) *Mar 14 13:48:56.262: %SW_DAI-4-DHCP_SNOOPING_DENY: 1 Invalid ARPs (Req) on Gi0/2, vlan 100.([5001.0004.0001/10.100.0.1/0000.0000.0000/10.100.0.254/13:48:55 UTC Sun Mar 14 2021]) B#
交换机阻止了数据包进入网内,并记录了该次攻击信息( MAC 地址,IP 地址)
经过实验可验证,该方案可阻止极大部份基于 DHCP 和 ARP 的网内攻击,可有效保证网络的稳定性。
参考资料: