菜单

[ Cisco ] 使用 DHCP Snooping + DAI 来抹杀内网常见的攻击

2021年3月14日 - Cisco

众所周知,企业以及数据中心网络内,DHCP 污染和 ARP 攻击一直以来都是会令网络从业人员感到头痛的问题。前者在企业网络内造成大量的 DHCP 抢占导致网内设备无法上网,后者则是各种网内都会存在的攻击。这两类攻击均会导致网络内设备无法正常通信。

今天我们来讲解一下如何使用 DHCP Snooping 和 DAI 来从根源上抹杀此类攻击。

快速开始:什么是 DHCP Snooping 和 DAI?

这里我们来摘取 Cisco 官方文档的原文来进行总结:

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 如下:

开始实验:配置 DHCP Snooping 和 DAI

配置前请注意:

其他平台 (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 已经可以正常工作了,接下来我们来验证一些攻击的情况。

  1. 客户端非法使用未分配的 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 的网内攻击,可有效保证网络的稳定性。

参考资料:

发表评论

邮箱地址不会被公开。 必填项已用*标注