写在开篇:最近在测试DAI相关的内容,公司文档一如既往的简陋,新人看完保准一脸懵逼,搜了很多文章,个人觉得下面的这篇是写的最详细,最完整,也最容易理解,很值得学习,点赞。原文链接在文末,防止丢失,特转载一份留存待日后翻阅
一、ARP协议原理
1.协议概述
- Address Resolution Protocol
- 在以太网环境中,节点之间互相通信,需知晓对方的MAC地址
- 在现实环境中,一般采用IP地址标示通信的对象,而ARP的功能就是将IP“解析”到对应的MAC地址。
2.协议漏洞
- 基于广播,不可靠
- ARP响应报文无需请求即可直接发送,这给攻击者留下巨大漏洞
- 没有确认机制,任何人都可以发起arp请求或response
- IPv6中通过特定的机制规避掉ARP以及其漏洞
二、ARP欺骗原理
1.正常情况下各设备的ARP表项
2.欺骗过程ARP Request
PC1要欺骗PC2,通过造包工具,如anysend等,发出一个ARP request广播,这个ARP数据帧的以太网头部中,源MAC为PC1的MAC,目的MAC为全F,关键内容在于ARP协议报文(ARP body),也就是这个数据帧的以太网帧头后的内容,这才是ARP的真正内容,里头包含的主要元素有:发送者mac、发送者IP、接收者MAC及接收者IP。PC1发出的这个ARP数据帧中,sender MAC为自己的MAC地址,但是SenderIP为网关IP即192.168.0.254,此刻,PC2收到这个arp消息后,将更新自己的arp表项,如下:
如此一来,PC2发送数据到自己的网关0.254时,由于网关的MAC已经被欺骗成了PC1的MAC,因此数据都被转发给了PC1,那么PC2就断网了。如果PC1再机灵点,将PC2发过来的数据再转给真实的网关,同时在本地运行一个报文分析工具窥探PC2发过来的数据,那么就可以在PC2不断网的情况下,神不知鬼不觉的窥探PC2的上网流量,这就是the man in the middle,中间人攻击。
3.欺骗过程ARP Response
由于ARP的response并不需要arp request为先决条件即可直接发送,因此攻击者可以构造arp reply消息,并发送给被攻击对象,从而刷新被攻击者的arp表,同样能达到arp欺骗的目的。
4.理解invalid arp表项
什么是invalid arp表项:
ARP表中的MAC地址为全零(Windows主机)或“No completed”(网络设备)
产生的原因:发送ARP Request后,为接收ARP Reply做准备
大量存在的原因:同网段扫描(主机)、跨网段扫描(网络设备)
5.Gratuitous ARP
Gratuitous ARP,免费ARP是一种特殊的ARP Request/response报文,即Sender IP与Target IP一致(一般用于IP冲突检测)
我们看下面的例子:
PC2是新接入的主机,配置了192.168.0.1的地址,完成地址配置后,PC2向网络中发送一个Gratuitous ARP,以防内网中有人使用相同的IP地址,这个Gratuitous ARP的senderIP和target IP都是自身,senderMAC是自己的MAC。
那么当PC1收到这个Gratuitous ARP后,由于senderIP和自己冲突了,于是在本地弹出一个气泡(如果是windows系统),同时回复一个Gratuitous ARP response以告知对端出现了IP地址重复。
对端收到这个Gratuitous ARP消息后,知道内网中已经存在这个IP地址的使用者了,于是告警。
Gratuitous ARP的另外一个作用是,某些厂家用于防止ARP欺骗。例如在某些路由器上,配置了基于Gratuitous ARP的防arp欺骗解决方案,则该路由器(的接口)将以一定的时间间隔发送Gratuitous ARP,目的就是刷新底下PC的arp表,以保持网关IP对应的MAC始终是正确的,当然,这种防arp的解决方案挺土鳖的。
6.如何判断内网中是否存在arp欺骗
现在市面上其实已经有许多arp防火墙可以识别到,当然有一些简单的方法,例如arp –a看MAC是否正确。或者抓包等。
7.Arp欺骗的解决方案
解决方案1:手工绑定IP+MAC
例如在PC上,用arp –s 静态绑定网关IP及网关的MAC,以防止arp欺骗,或者在关键节点的网络设备上,使用命令arp进行绑定。
显然这种方式扩展性太差。
解决方案2:免费arp
这个前面已经说过了
解决方案3:DAI
其他,其实防ARP欺骗的解决方案业内还是有许多的,每个厂家都有自己的方法。
三、DAI工作机制
1.机制概述
部署DAI前,内网如果出现ARP欺骗行为,例如PC发送非法的ARP报文,对于交换机而言,是无法检测并作出防御动作的。
部署DAI后,我们可以定义交换机接口的信任状态:trusted,或untrusted,对于信任端口,将不对收到的ARP报文做检测,直接放行。而对于untrusted接口,ARP报文在收到后回进行检查,只有合法的ARP报文才会被放行,如果出现非法的ARP报文,则会被log,同时丢弃。
DAI依赖DHCP snooping技术,在一个用户动态获取IP地址的网络环境中,我们通过部署DHCP snooping一来可以起到防御DHCP欺骗的效果,另一方面,会在交换机上得到DHCP snooping binding database,这个数据库是DHCP Snooping侦听DHCP交互过程后的信息记录,里头包含客户端的IP、MAC、所属VLAN等等相关信息,而这些信息,恰恰可以作为ARP合法性校验的依据。
DAI部署于交换机上,用于确保合法的ARP request或response被放行而非法的ARP消息被丢弃。交换机部署DAI后的主要动作如下:
- 在DAI untrust接口上(注意与DHCP snooping的untrust接口区分开)阻拦一切ARP requests或response消息并作校验
- 在更新自己ARP表或将收到的ARP消息转发出去之前先进行合法性校验,主要看ARP报文中的IP及MAC对应关系是否合法
- 丢弃非法的ARP报文,交换机会在丢弃非法的ARP后进行log
前面说了DAI借助于DHCP snooping的绑定数据库进行ARP合法性校验。另一个合法性校验的依据是手工配置的ARP ACL。
你也可以配置DAI来丢弃那些以太网帧头源MAC与ARP body里的MAC不一致的非法ARP。这个后面有做进一步的介绍。
2.接口信任状态及网络的安全问题
一般来说,我们认为攻击行为多来自于终端的PC,可能是中毒或者黑客行为等。所以我们常会将连接终端PC的接口配置为DAI untrust接口,而交换机之间的接口配置为trust接口。
看上图,我们假设交换机A和B都运行DAI,而PC1及PC2都通过DHCP服务器获取地址,那么这时候对于PC1而言,只有在交换机A上的DHCP snooping database中才有其IP+MAC的绑定,交换机B则没有。因此如果A和B之间的接口为DAI 的untust,则来自PC1的ARP报文,将被交换机B丢弃,因为它认为这些报文是非法的,如此一来,PC1和2的通信就出问题了。所以建议A和B之间的接口设置为DAI的trust。
但是,并非所有的交换机互联接口设置为DAI的trust都会没有问题,在特定的环境下,这会留下一个安全隐患。例如,仍然是上面的图,假设A交换机不支持DAI,如果B的3/3口配置为trust,那么PC1就可以大摇大摆的去对B和PC2进行ARP欺骗了,即使B运行了DAI。所以DAI仅仅是保证运行DAI的交换机本身所连接的终端PC不能进行非法的ARP动作。像刚才所述的情况,可以考虑将交换机B的3/3口配置为untrust接口,再通过在B上手工配置ARP ACLs的方式来创建安全表项。当然,你可以将这两台交换机进行三层隔离,例如,加个路由器神马的。
3.ARP报文的rate limit
对于DAI而言,是需要损耗交换机CPU资源的,如果开启了DAI,就有可能会成为拒绝服务攻击的对象。所以我们对于运行了DAI的交换机接口,有ARP报文的限制。默认DAI untrust接口的rate limit是15个P/S也就是15pps,trust接口则完全没有限制。可以通过ip arp inspection limit这条接口级的命令来修改。
当接口收到的ARP报文超出这个阀值,接口将进入err-disable。可以使用shutdown no shutdown的方式手工重新恢复这个接口。或者,使用全局命令the errdisable recovery来让接口在一定的时间间隔后自动恢复。
4.ARP ACL及DHCP snooping database条目的相对优先级
ARP ACL的优先级高于DHCP snooping database条目。在你使用全局命令ip arp inspection filter指定了ARP ACL后,如果ARP报文被ARP ACL deny掉了,那么这些报文就被直接丢弃,即使在DHCP snooping database中有合法的表项匹配这些ARP报文。
四、DAI的配置方针
- DAI是ingress安全特性,不会做egress的安全校验
- DAI的工作需依赖DHCP snooping
- 如果DHCP snooping被关闭或者,这是一个无DHCP 的网络环境,例如纯静态IP地址的环境,使用ARP ACLs来放行或丢弃ARP报文
- DAI在access接口, trunk 接口, EtherChannel 接口, 及 private VLAN 接口上都支持
五、DAI配置命令
1.基本配置
ip arp inspection vlan {vlan_ID | vlan_range}
激活特定VLAN的DAI
ip arp inspection trust
接口模式,将接口配置为DAI trusted,默认为untrusted
2.应用ARP ACLs到DAI
ip arp inspection filter arp_acl_name vlan {vlan_ID | vlan_range} [static]
将配置好的ARP ACL应用到DAI
如果不使用static关键字,则ARP报文会先被ARP ACL匹配,如果没有任何匹配项,则再被DHCP Snooping database的安全表项再做一次校验,如果有合法表项,则放行,如果没有,则丢弃。
如果使用static关键字,则意味着ARP ACLs启用隐含deny any机制。也就是说如果ARP报文与ARP ACLs匹配,而结果是没有任何匹配项,则直接丢弃,不管DHCP Snooping database里是否有合法的条目。
3.配置ARP报文rate limit
ip arp inspection limit {rate pps [burst interval seconds] | none}
接口级命令。通过限制接口上收到的ARP报文的数量,可以有效的防止开启DAI的交换机被DoS攻击。
注意事项:
默认在DAI untrusted接口上rate是15pps,而trusted接口则无限制
Ip arp inspection limit rate none,是无限制
Burst interval ,默认是1s,可选配置。这是一个连续的检测时间段,用来检测在这个时间段内的ARP报文数量,默认是1S,所以就是说1S内,如果超出了15个(默认)ARP,则违例 。这个时间可选区间为1-15S
当出现违例,接口进入err-disable状态
errdisable recovery cause arp-inspection
激活由于arp-inspection违例导致的err-disable接口的自我恢复。
4.配置附加的校验动作
ip arp inspection validate { [dst-mac] [ip] [src-mac] }
我们可以通过配置一些额外的选项,让DAI做进一步的校验。
有三个可选关键字,dst-mac、ip、src-mac
dst-mac检测收到的ARP报文中,以太网帧头的目的MAC与ARP body里的target MAC是否一致,这个check针对ARP response。当开启这个选项后,如果两个MAC不一致,则ARP报文被丢弃
ip检测ARP body里的IP地址是否是无效或非预期的,如0.0.0.0、255.255.255.255,以及组播IP地址,这些都被认为是无效的IP。SenderIP是无论报文为ARP request或response都会进行校验。而targetIP只有在报文是ARP response时才会进行校验
src-mac检测收到的ARP报文中,以太网枕头的源MAC与ARP body里的sender MAC是否一致。这个校验动作在ARP request及response报文中都会进行。
5.配置DAI logging
当DAI丢弃一个ARP报文,交换机会在log buffer里存储一条信息,随后产生一条system message系统信息,在这条系统信息产生后,交换机从log buffer里清除之前存储的条目。每一个条目都包含例如VLAN、端口号、源目的IP地址、源目的MAC等信息。
一个存储在log buffer中的条目可以代表多个报文,例如交换机从同一个接口同一个VLAN收到具有相同ARP元素的ARP包,那么这些报文对应一个条目,以节省buffer的占用。同时只会产生一条系统信息。
ip arp inspection log-buffer entries number
配置DAI占用log buffer的大小(最大条目数量),区间是0-1024
默认是32条
ip arp inspection log-buffer logs number_of_messages interval length_in_seconds
配置DAI loggin system message,系统消息将以每length_in_seconds 发送number_of_messages 的速率来约束系统消息的发送。number_of_messages 默认为5,范围是0-1024,如果配置为0则表示条目只出现在log buffer中而不产生系统消息;length_in_seconds 默认是1S,范围是0-86400(1天),如果配置为0则表示系统消息将会立即产生,而log buffer中不再存储条目,如果将length_in_seconds 配置为0,则number_of_messages也会变为0。
ip arp inspection vlan vlan_range logging {acl-match {matchlog | none} | dhcp-bindings {all | none | permit}}
默认情况下,只要DAI丢弃报文,则会被logged
- acl-match matchlog—Logs packets based on the DAI ACL configuration. If you specify the
- matchlog keyword in this command and the log keyword in the permit or deny ARP access-list
- configuration command, ARP packets permitted or denied by the ACL are logged.
- acl-match none —Does not log packets that match ACLs.
- dhcp-bindings all —Logs all packets that match DHCP bindings.
- dhcp-bindings none —Does not log packets that match DHCP bindings.
- dhcp-bindings permit —Logs DHCP-binding permitted packets.
ip arp inspection vlan 100 logging acl-match none
意思是针对VLAN100中的流量,不去log被ARP ACL 匹配丢弃的报文
六、DAI配置范例
基本配置如下:
基本配置完成后,来看一下:
接下去在SW1上开启DAI:
为了使得PC2发出的ARP消息能够被放行,我们首先使用手工配置DHCP snooping bingding表项的方法:
另一个方法,是用ARP ACL:
再来做一个测试,就是PC1私自修改IP地址:
由于DAI开启后,下联的PC如果段时间发送大量的无效ARP,可能会导致交换机性能大量损耗,也就是DoS攻击。那么建议在接口上限定ARP消息门限。