故障现象
客户企业反映“常有部分人不能上网”,且毫无规律。经了解整栋大楼物理拓扑结构为“接入-汇聚-网关”,整个交换网络工作在二层(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/端口)应该可以解决的吧?!
环境模拟如下:
如图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.
上图是连续执行8次“ ipconfig/renew"以重新获取地址的结果,始终不再获取伪网关分配的地址。
如果说还不够明显,接着往下看在核心交换上通往两个网关的抓包结果
上面实验充分论证了交换机的“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号码不能相同,否则数据没法上行。
以上为客户端多次执行ARP刷新结果,同样不再获取到伪网关MAC的ARP项,始终显示正确网关的ARP项。
至此,所有来自下行接口的ARP请求都会被送往网关,至于在网关设备上要做何等ARP防护,那不就是任由我们处理吗?通常我会选择动态或者静态绑定。
应用延伸
这个案例很典型,普遍适用于酒店、企业、公共WiFi等多种场合。如企业内有服务器只需要把服务器另外放入一个隔离组即可。事实上随着网络终端应用越来越丰富,每一个企业在构建网络之初,应该尽可能把接入层设备的性能提高到一定层次,以适应未来几年终端扩充的需求。另外从综合成本上来也是明智之选。