故障现象   

    客户企业反映“常有部分人不能上网”,且毫无规律。经了解整栋大楼物理拓扑结构为“接入-汇聚-网关”,整个交换网络工作在二层(Layer2)模式 ,客户端基本采用固定IP,接入层交换机华为二层1700/1720系列,核心汇聚为华为5700 千兆三层(Layer3)交换。

排查步骤

 STEP1:搜集

    登陆网关(H3C-F1000-c防火墙)查看安全日志,幸运的是很快就发现类似“duplicate ip 192.168.1.1.../ARP”相关日志 ... 至此,故障范围基本锁定。

同时我们也看到了,其实很多企业在网络建立之初就缺乏最基本的规划,而且不见得全是低成本成本所导致,这样的问题本可以避免的 ... 好吧! 至少请不要用192.168.1.1/24这样的默认地址做企业网关的IP。

 STEP2:分析

    尽管找到了故障的元凶,但我并不打算查找&拔掉那个办公室雇员私自添加的无线路由器(WiFi),有一句话叫“存在即是合理”,因为这不是用户的错误,是我们技术管理策略上的失误。

    对!就是这样! —— 我们应该找到这个网络脆弱的根源,事情虽小,但这种低级错误是绝对不能容忍的。一个茁壮网络架构不应给用户留有挑衅的机会,不管有意还是无意的动机。无论如何,防御应该在网络和用户的边缘就开始,而且是越严格越好。

 STEP2:方案

    基本思路:心想在交换机上启用ARP攻击防护、DHCP防护、三要素绑定(IP/MAC/端口)应该可以解决的吧?!

    环境模拟如下:

基于Layer2交换网络的ARP攻击防御_防火墙

    如图2个网关都是“192.168.1.1”并且都宣称自己是DHCP-SERVER,如此一来我们需要一套有效的机制来明确告诉所有交换机“到底谁是亲爹”这样的事实。

    当然,你如果去百度关于ARP相关方案的话,你会看到很多类似在交换机上配置“ARP annt-attack ... ”等等这样答案。但是啊!但是!请注意!!—— 那些防护都是在Layer3上现实的!!!我们面对现实是我们只有一个Layer2!!YES !! YES !! YES !! Just F*U*C+KING  Layer 2 !!  我们知道Layer2交换网络是根据MAC来转发的,与IP没有任何毛线关系!!换句话说也就是说 —— 即便是你把那些命令都在交换机上敲个遍,其结果仍然是“然!并!卵!”,不服气你在交换机 敲个"dis arp、 show arp"看看——木有表项!对!就是没有(除了你手动绑定的,你该不会跟我一样真的去绑定了1个吧^_^?)! 倒是通过“display mac-address、show mac”可以看到一些有用的信息。

 STEP2:实施

     好吧!现实很苛刻,我们总可以做点别的吧?!答案是肯定的!至少DHCP防护我们目前是可以做的(尽管对于静态IP用户意义不大,但是必须的)!

   DHCP-SERVER防护原理:仅让连接真正网关的接口放行DHCP-Offer报文其他接口拒绝进入。

    核心交换配置如下: 其他交换机同理

[SW2] dhcp enable 
 #全局允许DHCP
[SW2] dhcp snooping  enable  ipv4 
 #全局允许DHCP-SNOOPING
[SW2] port-group 10 
 #创建端口组 方便对端口批量操作
[SW2-port-group-10] group-member Ethernet 0/0/1 to e0/0/22
 #端口批量加入到组 上行端口除外
[SW2-port-group-10] dhcp snooping enable 
 #下行端口全部启用DHCP-SNOOPING(拒绝Offer报文)
[SW2] interface GigabitEthernet 0/0/1 
 #配置上行端口
[SW2-GigabitEthernet0/0/1] dhcp snooping  enable 
 #上行端口启用DHCP-SNOOPING
[SW2-GigabitEthernet0/0/1] dhcp snooping  trusted 
#上行端口为信任端口(Offer报文正常下发)

    接着我们来验证以上面配置工作的效果

    伪网关地址池为192.168.1.2~99,网关地址池为192.168.1.100~200.

基于Layer2交换网络的ARP攻击防御_防火墙_02

    上图是连续执行8次“ ipconfig/renew"以重新获取地址的结果,始终不再获取伪网关分配的地址。

    如果说还不够明显,接着往下看在核心交换上通往两个网关的抓包结果

基于Layer2交换网络的ARP攻击防御_无线_03

上下图分别为“核心——伪网关”,“核心——网关”抓包截图

基于Layer2交换网络的ARP攻击防御_防火墙_04

    上面实验充分论证了交换机的“DHCP-SNOOPING”特性

    至此,我们仍然没有告诉交换机那2个‘192.168.1.1’与“到底谁是亲爹”这个关键问题

    这回我们转化一下思路:既然交换机没法自己识别,那么我们不如把所有人的嘴巴都堵上(网关除外)而且不允许他们私下沟通只允许和网关沟通,让真正的网关告诉交换机"我!是你亲爹!"

    好!历交换机文档中的特性发现确实可以这样那就是端口隔离这个伟大的特性

    端口隔离基本原 :同一隔离组(下行口)之间不准交头接耳,不同隔离组(上下行口)之间可以互通,这样就迫使ARP广播直接被发送给工作在Layer3之上的网关,并由网关直接答复,这就意味着除了上行接口任何接口通告的ARP答复都会被视而不见,事实上根本不会再有任何ARP请求被发送到网关之外的地方。

    核心交换配置如下: 其他交换机同理

[SW2-GigabitEthernet0/0/1] port-isolate enable group 5
 #创建隔离组5并加入上行端口
[SW2] port-group 10  
 #进入端口组10以便对下行端口批量操作
[SW2-port-group-10] port-isolate  enable  group  10 
 #下行端口全部加入隔离组10。
 #“隔离组10”与端口组的10没任何关系自己随便取小于64的值,
 # 重点是在同一交换机上与上行隔离组5号码不能相同,否则数据没法上行。

基于Layer2交换网络的ARP攻击防御_防火墙_05

    以上为客户端多次执行ARP刷新结果,同样不再获取到伪网关MAC的ARP项,始终显示正确网关的ARP项。

    至此,所有来自下行接口的ARP请求都会被送往网关,至于在网关设备上要做何等ARP防护,那不就是任由我们处理吗?通常我会选择动态或者静态绑定。

应用延伸

    这个案例很典型,普遍适用于酒店、企业、公共WiFi等多种场合。如企业内有服务器只需要把服务器另外放入一个隔离组即可。事实上随着网络终端应用越来越丰富,每一个企业在构建网络之初,应该尽可能把接入层设备的性能提高到一定层次,以适应未来几年终端扩充的需求。另外从综合成本上来也是明智之选。