1 概述
目前的以太网络的ARP协议是一个不安全的协议,因为是直接和用户使用的网络设备交互的协议,所以很容易被仿冒,篡改,复制和非法获取。针对这些攻击,采用MAC地址和IP地址的绑定检测是一种有效的抗攻击方法。
2 技术方案
2.1 配置IP地址和MAC地址的绑定表项
这个绑定表项是合法的IP地址与合法的MAC的一一对应关系,绑定表项除了在主控板保留一份之外,还在网络处理器里面保留一份。对于网络处理器接收到的报文,先通过硬件分类出ARP报文,包括请求和应答报文,对于请求和应答报文里面的源IP和源MAC以及目的IP和目的MAC查找绑定表进行检测,如果内容和绑定表内容不符合,认为是非法报文,进行丢弃。这样可以有效的防止假冒攻击和篡改攻击。同时绑定表项中需要配置指定mac地址,指定MAC地址一般为网关MAC地址,如果使能了VRRP,则为虚网关MAC地址,这样对于ARP请求报文,可以使用指定MAC地址回相应,可以隐藏用户的真实MAC地址,防止用户通过二层进行互访,所有的流量必须要上送到网关进行三层转发,可以有效的对用户进行二层隔离。
2.2 设置IP地址和MAC地址绑定表项的属性
每一个绑定表项有两种属性,网关属性和hidemac属性,网关属性对应着网关的IP地址的绑定表项,包括配置了VRRP之后的虚网关IP地址。Hidemac属性是给ARP应答检测使用的,如果配置了hidemac属性,对于接收到的ARP应答报文,根据目的IP查找绑定表项,如果查找到的表项是网关属性,意味着是回应网关的ARP应答,那么将报文源MAC与绑定MAC或者指定MAC二者进行绑定检查,只要有一个符合就认为合法,否则将报文源MAC和指定MAC进行绑定检查,隐藏用户的真实MAC信息。如果不配置hide-mac选项,则对于ARP应答报文,将报文源MAC和绑定MAC以及指定MAC进行绑定检查,有一个符合,则认为符合。对于用户的IP地址和MAC地址的绑定表项,是需要指定hidemac属性的。
2.3 在接口上设置本网段的用户精确绑定检查属性
根据ARP请求报文和应答报文中的IP地址查找表项,可能会查找不到相应的表项,也就是说是一个未知用户,我们可以通过配置接口的属性来允许或者阻止用户上网。配置了精确绑定match属性,说明查找不到相应的表项就丢弃这些ARP报文,用户无法上网。这样可以有效的防止非法访问。
2.4 在接口上设置隐藏本网段下面的用户MAC属性
可以根据自己的需要灵活的配置本网段的用户MAC地址需不需要隐藏,如果需要隐藏,那么就配置Hidemac属性,hidemac属性和绑定表项中的指定mac地址配合使用。在本网段内可以排除某些地址不隐藏MAC地址。 
2.5 流量抑止功能
对于来自同一个源IP地址的ARP请求报文和应答报文,一定的时间之内只允许通过一定数量的报文,比如说一秒钟通过四个,这样可以有效的防止流量攻击。
2.6 ARP请求报文和应答报文的处理流程
1. ARP请求报文的处理:
1、 正确性检查,正确的ARP请求报文必须符合下面要求:
如果接口上使能了精确绑定属性,那么源IP和源MAC必须符合绑定表项,目的的IP可以查询到相应的绑定表项;如果接口上没有使能精确绑定属性,那么根据源IP地址和目的IP地址查找绑定表项,如果查找不到,认为是合法请求,如果查找到相应的表项,那么必须符合绑定表项。
报文目的MAC是全“F”;
2、如果接口配置了hidemac属性,并且请求的源IP地址和目的IP地址没有被排除掉,使用指定mac地址回相应,否则使用真实MAC地址回相应。
3、进行流量抑制,每一秒钟允许同一个源IP地址发送四个ARP请求;

2. ARP应答报文的处理:
1、正确性检查,正确的ARP应答报文必须符合下面要求:
如果接口上使能了精确绑定属性,那么源IP和源MAC以及目的IP和目的MAC必须符合绑定表项;如果接口上没有使能精确绑定属性,那么根据源IP地址和目的IP地址查找绑定表项,如果查找不到,认为是合法请求,如果查找到相应的表项,那么必须符合绑定表项。
如果查找到绑定表项之后,配置了hidemac选项,那么源MAC地址是与绑定表项的指定mac地址做比较,对于目的IP是网关的ARP应答报文,应答报文的源MAC地址与配置的真实MAC地址或者指定MAC地址做检测,任意一个符合则认为合法。
2、进行流量抑制,每一秒钟允许同一个源IP地址发送四个ARP请求;
3 组网应用
NE40A(1/0/11)--------------------(7/0/0)NE40B 
Int vl 2 | (7/0/1) |(7/0/1)
2.2.2.1 | | int vl 2
| | 2.2.2.2
| |
5300--------------------------------+ 
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
PC1 PC2
(IP:2.2.2.201 MAC:000d-561a-16b4)(IP:2.2.2.202 MAC:020f-5857-a9fd)
1. 配置:
配置hide-mac选项后就要使arp报文的源mac分别和绑定mac、指定mac比较。如果不配置hide-mac的话,就只比较源mac和绑定mac,不比较指定mac。

在5300上启动Vlan隔离功能。
NE40A:
vlan 2
arp mac-binding match (配置精确绑定,说明本接口下只有查找到表项并且符合表项的用户可以上网)//源和目的的地址绑定都要检查,缺一不可。
arp mac-binding hide-mac (说明本接口下的用户的ARP请求报文,使用指定MAC地址(即网关MAC)回响应)
arp mac-binding hide-mac except 2.2.2.2(说明本接口下的请求报文中源IP为对端网关(NE40B)地址或目的IP为对端网关IP地址不隐藏mac)// NE40B的发给PC的ARP请求报文广播到了NE40A处或者pc1发给NE40B的ARP请求报文广播到了NE40A。
interface Vlanif2
undo shutdown
ip address 2.2.2.1 255.255.255.0
vrrp vrid 2 virtual-ip 2.2.2.222
vrrp vrid 2 priority 200

由于配置了vlan隔离,PC1与PC2二层不能互访,所以PC2请求PC1的ARP报文可以通过网关来代理:
arp mac-binding 2.2.2.201 000d-561a-16b4 assign-mac 0000-5e00-0102 hide-macd (PC1的绑定表项,指定MAC为虚MAC,配置hidemac选项,说明其他PC需要请求PC1的MAC时就隐藏PC1的真实MAC地址,使用虚网关MAC进行回应。) //PC2请求PC1的arp报文到了NE40A后,NE40A使用指定的MAC地址进行回应。//配置了绑定后,就生成相应的微码表项,那么只要是与表项相关的报文都需要匹配才能通过,与是否在vlan下配置match无关。而如果不配置match的话,其他与绑定表项无关的报文都默认通过,不进行比较,但是配置了match后所有报文都要精确匹配,如果无相应的绑定表项则丢弃!配置hide-mac选项后就要使arp报文的源mac分别和绑定mac、指定mac比较。如果不配置hide-mac的话,就只比较源mac和绑定mac,不比较指定mac。

arp mac-binding 2.2.2.202 020f-5857-a9fd assign-mac 0000-5e00-0102 hide-mac (PC2的绑定表项,指定MAC为虚MAC,配置hidemac选项,说明请求PC2的MAC需要隐藏其真实MAC地址使用网关MAC进行回应)
arp mac-binding 2.2.2.202 020f-5857-a9fd assign-mac 0000-5e00-0102 //这样配置就只检测源ip和源mac,assign-mac就失去了作用,为什么还要配置assign-mac选项呢?是因为对于微码而言,只是一张张表,它不懂得是否应该回应,所以不能让表项空着。

对端网关和自己网关的ARP绑定,主要是用于防止攻击和回应请求本网关的ARP:
arp mac-binding 2.2.2.2 0022-2222-2222 assign-mac 0022-2222-2222 gateway (对端接口地址的绑定表项,指定mac地址为真实mac地址,配置网关选项)
arp mac-binding 2.2.2.1 00e0-0166-1700 assign-mac 00e0-0166-1700 gateway (自己的接口地址的绑定表项,指定mac地址为真实mac地址,配置网关选项)
arp mac-binding 2.2.2.222 0000-5e00-0102 assign-mac 0000-5e00-0102 gateway (虚网关的绑定表项,指定mac地址为虚mac地址,配置网关选项)

NE40B:
vlan 2
arp mac-binding match (配置精确绑定,说明本接口下只有查找到表项并且符合表项的用户可以上网)
arp mac-binding hide-mac (说明请求本接口下的用户的ARP请求报文,使用指定MAC地址(即网关MAC)回响应)
arp mac-binding hide-mac except 2.2.2.1 (说明本接口下的请求报文中源IP为对端网关地址和目的IP为对端网关地址不隐藏mac,)
interface Vlanif2
undo shutdown
ip address 2.2.2.2 255.255.255.0
vrrp vrid 2 virtual-ip 2.2.2.222

arp mac-binding 2.2.2.201 000d-561a-16b4 assign-mac 0000-5e00-0102 hide-mac(PC1的绑定表项,指定MAC为虚MAC,配置hidemac选项,说明请求这个PC机需要隐藏真实MAC地址)
arp mac-binding 2.2.2.202 020f-5857-a9fd assign-mac 0000-5e00-0102 hide-mac(PC2的绑定表项,指定MAC为虚MAC,配置hidemac选项,说明请求这个PC机需要隐藏真实MAC地址)
arp mac-binding 2.2.2.1 00e0-0166-1700 assign-mac 00e0-0166-1700 gateway (对端接口地址的绑定表项,指定mac地址为真实mac地址,配置网关选项)
arp mac-binding 2.2.2.2 0022-2222-2222 assign-mac 0022-2222-2222 gateway (自己的接口地址的绑定表项,指定mac地址为真实mac地址,配置网关选项)
arp mac-binding 2.2.2.222 0000-5e00-0102 assign-mac 0000-5e00-0102 gateway(虚网关的绑定表项,指定mac地址为虚mac地址,配置网关选项)
注意:如果有多台5300,请把它们划分到不同的Vlan中去,不然无法隐藏用户的MAC。
2. 处理流程说明
1)PC1访问PC2
PC1发送ARP请求,因为5300上配置了Vlan隔离,所以PC2不能接收到PC1的ARP请求,
NE40接收到了PC1的ARP请求,对ARP请求的源IP地址和源MAC地址做绑定表项检查,表项正确,根据目的IP地址查找绑定表项,发现存在相应的绑定表项(arp mac-binding 2.2.2.202 020f-5857-a9fd assign-mac 0000-5e00-0102 hide-mac),认为是合法用户发出的ARP请求,因为在Vlan接口上配置了hidemac属性,所以NE40代理回应这个ARP请求,发送的ARP应答的源mac地址为NE40的网关MAC地址,因为NE40上面跑了VRRP,所以这个网关MAC地址是对应的虚MAC地址。
PC1学习到了PC2的ARP表项之后,发送ICMP报文给PC2,因为目的MAC地址是NE40网关MAC地址,所以进行三层转发,查找转发表,触发FIB miss,发送ARP请求报文,请求PC2的ARP表项,PC2收到NE40的ARP请求之后,回应ARP应答,NE40接受到PC2的ARP应答之后,根据源IP和源MAC以及目的IP和目的MAC查找绑定表项,表项正确,认为是合法的ARP应答报文,同时学习PC2的ARP表项。
PC1再发送ICMP报文给PC2,PC2收到ICMP请求之后,回应ICMP应答给PC1,因为没有PC1的ARP表项,所以发送请求给PC1,过程和PC1请求PC2的过程一致,PC2学习到PC1的ARP表项,对应的MAC地址为网关MAC。因为NE40上面跑了VRRP,所以这个网关MAC地址是对应的虚MAC地址。
2)PC1访问真实网关2.2.2.1
PC1发送ARP请求,网关收到请求,因为目的IP是网关地址,不作hidemac处理,以真实MAC地址回应应答,同时学习对应的ARP表项。(arp mac-binding 2.2.2.1 00e0-0166-1700 assign-mac 00e0-0166-1700 gateway)
PC1发送ICMP请求给网关,网关回应ICMP应答。(arp mac-binding 2.2.2.222 0000-5e00-0102 assign-mac 0000-5e00-0102 gateway)
3)PC1访问虚网关2.2.2.222
PC1发送ARP请求,网关收到请求,因为目的IP是虚IP地址,不作hidemac处理,以虚MAC地址回应应答,同时学习对应的ARP表项。
PC1发送ICMP请求给虚网关,虚网关回应ICMP应答。
4)PC1访问NE40B的真实网关2.2.2.2
PC1发送ARP请求,网关收到请求,虽然配置了hidemac属性,但是因为对于2.2.2.2是except的,所以这个时候不代理回应ARP请求,将ARP请求广播到NE40B上,NE40B做绑定检查,检查通过之后回应ARP应答,PC机学习到NE40B的2.2.2.2的ARP表项。
下面正常处理收发包流程。
5)从NE40A上访问PC1
NE40A发送ARP请求,PC1接收到请求之后回应ARP应答,因为根据目的IP地址查找到的绑定表项是网关属性的,所以应答报文的源MAC地址(即NE40A的MAC地址,这样做是为了防止攻击。试想PC回应答时修改了NE40的MAC,而NE40收到该应答报文后一看是ARP报文就直接上送主控板,主控板一看是自己的IP地址就不对MAC地址做检查了,这样的报文属于攻击报文,应该在微码就丢弃!)与配置的真实MAC地址或者指定MAC地址做检测(自己的MAC地址),检测通过。NE40学习到PC1的ARP表项。
下面正常处理收发包流程。
6)从NE40B上访问PC1
NE40B发送ARP请求,NE40A收到了ARP请求,虽然配置了hidemac属性,但是因为对于2.2.2.1是except的,所以这个时候不代理回应ARP请求。(arp mac-binding hide-mac except 2.2.2.2)
PC1接收到请求之后回应ARP应答,因为根据目的IP地址查找到的绑定表项是网关属性的,所以应答报文的源MAC地址与配置的真实MAC地址或者指定MAC地址做检测,检测通过。NE40学习到PC1的ARP表项。
下面正常处理收发包流程。