网关 : IP = IP-1, MAC = 11:11:11:11:11:11
本机 : IP = IP-2, MAC = 22:22:22:22:22:22
主机A: IP = IP-A, MAC = AA:AA:AA:AA:AA:AA
主机B: IP = IP-B, MAC = BB:BB:BB:BB:BB:BB
主机C: IP = IP-C, MAC = CC:CC:CC:CC:CC:CC
子网内的任意两台主机(网关也可看作一台主机)要正常通讯,需要互相知道对方的网卡地址MAC。如果一方不知道对方的MAC,就要进行ARP查询。
ARP 查询过程在一个正常的子网内,一次完整的 ARP 查询需要一次查询广播和一次点对点的应答。查询广播中包含了要查询主机的IP,此广播可以被子网内的每一台主机的网卡收到,网卡会检查要查询的IP是否与自己的IP相等,不等则直接丢弃,相等则将此数据包提交给系统内核(一个中断),内核调用网卡驱动解析收到的数据包,然后构建一个应答数据包回送到查询的主机,查询主机收到应答后更新自己的ARP缓存表。
对应 LnS 的设置,此通讯过程需要两条规则,以本机查询主机B的MAC为例
① 22:22:22:22:22:22 => FF:FF:FF:FF:FF:FF (允许本机广播出站)
② 22:22:22:22:22:22 <= BB:BB:BB:BB:BB:BB (允许主机B应答本机入站)
规则说明方式:=> 表示传出,<= 表示传入,== 表示双向。
注意按此设置 LnS 规则时,有方向规定的始终要将源放在左边,目标放在右边,对方向为双向的始终将本机放在左边,远端放在右边。
只要将此查询过程中的任何一步掐断,则该查询过程就会失败。比如有人找你公司的讨债,总经理秘书可以想各种理由使债主见不到总经理,即使见到了,总经理也可以找财务不在或目前实在没钱为由不付钱,讨债就失败了。这两个方法就好比拦截广播和拦截应答。
子网内的两台主机要能够完整的通讯(双方都可收发数据)必须互知对方的MAC地址,比如本机要跟主机B完整通讯,还必须让主机B也能查询到自己的 MAC。
① 22:22:22:22:22:22 => FF:FF:FF:FF:FF:FF (允许本机广播出站)
② 22:22:22:22:22:22 <= BB:BB:BB:BB:BB:BB (允许主机B应答本机入站)
③ FF:FF:FF:FF:FF:FF <= BB:BB:BB:BB:BB:BB (允许主机B广播入站)
④ 22:22:22:22:22:22 => BB:BB:BB:BB:BB:BB (允许本机应答主机B出站)
显然规则②④在LnS中是可以合并的,则两台机器完整通讯只须 3 条规则:
① 22:22:22:22:22:22 => FF:FF:FF:FF:FF:FF (允许本机广播出站)
② FF:FF:FF:FF:FF:FF <= BB:BB:BB:BB:BB:BB (允许主机B广播入站)
③ 22:22:22:22:22:22 == BB:BB:BB:BB:BB:BB (允许本机与主机B相互应答)
前面说了,一次查询过程需要一次广播和一次应答,但 ARP 协议中并不要求广播与应答成对出现,也就是可以没有广播,任何一台主机都可以主动发送应答数据包,如果目标主机没有使用静态MAC,则只要收到应答广播就会更新自己的ARP缓存表。因此,我们可以人为的构建一个错误的应答数据包让目标主机更新自己的ARP缓存。
比如从本机控制,不让主机A与主机B通讯:
本机向主机A发送应答数据包,告诉它 IP-B 的 MAC 是 XX:XX:XX:XX:XX:XX
本机向主机B发送应答数据包,告诉它 IP-A 的 MAC 是 YY:YY:YY:YY:YY:YY
此时主机A和主机B的 ARP 缓存中关于对方的MAC都错误的,他们互发数据时就会发到一个错误或都根本不存在(取决于伪造的MAC)的网卡,A、B 间的通讯自然失败。(其实只要其中一台的ARP缓存错误,A、B 间的通讯就会表现不正常)
想想,如果伪造的应答数据包是告诉主机B:IP-1 的 MAC 是 ZZ:ZZ:ZZ:ZZ:ZZ:ZZ 会怎么样?则主机B与网关通讯会不正常,就会表现为断网。如果同时对网关欺骗,告诉它主机B的MAC为一个错误值,且这种欺骗一直持续,则主机B无法上网了。
大家常说的网络执法官就是利用ARP欺骗来踢人的。执法官运行时首先会大量发送广播,获得所有主机的MAC地址,然后,想欺骗谁,就向谁发送伪造的应答数据包。
当然,ARP欺骗决不仅止于此,比如还可以使目标主机断线后将自己的MAC伪造成被欺骗主机的MAC达到特殊目的,或者同时欺骗网关与目标主机,但是用自己的MAC代替伪造应答数据包中的随机MAC并开启本机的数据转发功能,插入到网关与目标主机通讯中充当代理,达到监听目标主机的目的。但本文的目是要说明LnS中的ARP规则如何设置,ARP欺骗不是重点。
ARP 防范
说到这样,大家肯定已经发现一个问题:欺骗者必须能与被欺骗者通讯,以便发送伪造的应答数据包,否则欺骗过程就不能完成。基于这点,我们可以从几个地方来防止 ARP 欺骗:
一、不让非信任的主机查询自己的MAC,欺骗者不能与本机通讯,自然无从欺骗了
可以拦截它的查询广播(要钱的一律不许进门)
可以拦截本机对它的应答(都来要吧,我就一句话,没钱,死猪不怕开水烫)
二、使用静态MAC,拒绝更新ARP缓存。
即使有仿造应答到达本机,但本机不使用该包更新自己的ARP缓存,欺骗失败。 那么为什么使用变种二方法的网友实际中“可行”了?说可行是因为过滤太严格,能防止绝大数大ARP欺骗,加引号是因为可行是暂时的,连续的长时间测试,很可能会断网的。
这跟具体的网络环境有关系,可能的原因比较多。一种可能的原因是LnS有BUG,过滤起作用在本机与网关建立连接之后,或者使用了静态MAC、指定IP避免DHCP租约失效之类,具体的我也分析不清楚。但从原理上说,这方法是错误的。
安全是相对的
防止ARP欺骗最好的办法在网关和各子机上均采用静态MAC绑定。防火墙只能增加安全系数,不能保证绝对完全,一是因为防火墙可能有BUG或者功能本身不完善又或者设置不善,二是现实中的妥协可能存在漏洞。比如本机为了上网信任了网关,同时为了共享信任了主机B,但主机B是没有任何安全防护,攻击者可以从主机B下手,迫使主机B当机后将自己伪造主机B的IP与MAC,获得与本机通讯的能力后再用其它办法攻击,更严重的情况是如果网关本身不安全,那么在本机上如何防护都不能取得较好的效果。