写在开篇:最近在测试DAI相关的内容,公司文档一如既往的简陋,新人看完保准一脸懵逼,搜了很多文章,个人觉得下面的这篇是写的最详细,最完整,也最容易理解,很值得学习,点赞。原文链接在文末,防止丢失,特转载一份留存待日后翻阅


 


 


一、ARP协议原理


 


1.协议概述


  • Address Resolution Protocol
  • 在以太网环境中,节点之间互相通信,需知晓对方的MAC地址
  • 在现实环境中,一般采用IP地址标示通信的对象,而ARP的功能就是将IP“解析”到对应的MAC地址。


 


2.协议漏洞


  • 基于广播,不可靠
  • ARP响应报文无需请求即可直接发送,这给攻击者留下巨大漏洞
  • 没有确认机制,任何人都可以发起arp请求或response
  • IPv6中通过特定的机制规避掉ARP以及其漏洞


 


二、ARP欺骗原理


 


1.正常情况下各设备的ARP表项


 


 


python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DHCP


 


2.欺骗过程ARP Request


 




python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DHCP_02


 


    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 


 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_IP_03


 


    由于ARP的response并不需要arp request为先决条件即可直接发送,因此攻击者可以构造arp reply消息,并发送给被攻击对象,从而刷新被攻击者的arp表,同样能达到arp欺骗的目的。


 


4.理解invalid arp表项


 


什么是invalid arp表项:


ARP表中的MAC地址为全零(Windows主机)或“No completed”(网络设备)


 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_ARP_04


 


产生的原因:发送ARP Request后,为接收ARP Reply做准备


大量存在的原因:同网段扫描(主机)、跨网段扫描(网络设备)


 


5.Gratuitous ARP


Gratuitous ARP,免费ARP是一种特殊的ARP Request/response报文,即Sender IP与Target IP一致(一般用于IP冲突检测)


我们看下面的例子:


 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_ARP_05


 


    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地址重复。


 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DAI_06


 


    对端收到这个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.机制概述


 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DAI_07


 


    部署DAI前,内网如果出现ARP欺骗行为,例如PC发送非法的ARP报文,对于交换机而言,是无法检测并作出防御动作的。


    部署DAI后,我们可以定义交换机接口的信任状态:trusted,或untrusted,对于信任端口,将不对收到的ARP报文做检测,直接放行。而对于untrusted接口,ARP报文在收到后回进行检查,只有合法的ARP报文才会被放行,如果出现非法的ARP报文,则会被log,同时丢弃。


 


 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DAI_08



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DHCP_09



 


    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.接口信任状态及网络的安全问题


 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DAI_10


 


    一般来说,我们认为攻击行为多来自于终端的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的配置方针


 


  1. DAI是ingress安全特性,不会做egress的安全校验
  2. DAI的工作需依赖DHCP snooping
  3. 如果DHCP snooping被关闭或者,这是一个无DHCP 的网络环境,例如纯静态IP地址的环境,使用ARP ACLs来放行或丢弃ARP报文
  4. 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配置范例


 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_IP_11


基本配置如下:

 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DHCP_12



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_ARP_13



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_ARP_14


基本配置完成后,来看一下:

 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DHCP_15


接下去在SW1上开启DAI:

 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_解决方案_16


为了使得PC2发出的ARP消息能够被放行,我们首先使用手工配置DHCP snooping bingding表项的方法:


 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DAI_17


另一个方法,是用ARP ACL:


python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DHCP_18


再来做一个测试,就是PC1私自修改IP地址:
 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_ARP_19


由于DAI开启后,下联的PC如果段时间发送大量的无效ARP,可能会导致交换机性能大量损耗,也就是DoS攻击。那么建议在接口上限定ARP消息门限。

 



python中协整检验coint和coint_johansen的区别 协整检验出现insufficient_DAI_20