前言
大约是在三年前的时候,第一次碰到
ARP
病毒,当时的情况现在依然历历在目。不断的有人断网,之后范围越来越扩大,重启了交换机之后好了一段时间,接着又开始不正常,周而复始。后来在
net130
的
BBS
上有人说是
ARP
病毒,针对于我的
huawei3526e
可以使用
display log
的命令来查看具体的冲突源发生在哪里,于是问题很快就解决了。之后的日子里为了快速定位,统计了全台的电脑
mac
地址,这样粗粗算来大约也有
300
多台的电脑了。
什么是
ARP
病毒
首先要说一下什么是
ARP
协议。在局域网中,网络中实际传输的是
“
帧
”
,帧里面是有目标主机的
MAC
地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的
MAC
地址。但这个目标
MAC
地址是如何获得的呢?它就是通过地址解析协议获得的。所谓
“
地址解析
”
就是主机在发送帧前将目标
IP
地址转换成目标
MAC
地
址的过程。
ARP
协议的基本功能就是通过目标设备的
IP
地址,查询目标设备的
MAC
地址,以保证通信的顺利进行。
ARP
病毒通过发送伪装的
ARP
包,欺骗交换机或者本网段内的邻居电脑,将
MAC
地址与
IP
地址的对应关系更改为自身,从而达到截取数据包、盗取密码等目的。
就如我在上面讲到的,
ARP
病毒发作的特点是会导致某个网段的瘫痪,对于不同的网段间一般来说是不会传染的。当然也有可能导致其他网段阻塞,这是因为过多的
ARP
包可能大量占用交换机
CPU
资源,并使其死机。我有一次如此的经历,一个网段中同时有两个
ARP
病毒源,结果交换机
CPU
使用率达到了
99%
,所有网段全部瘫痪,甚至无法
telnet
登陆,最后使用
console
线恢复的系统。这些只是表面现象,病毒源还通过解析捕获的数据包,极有可能获取重要的信息和密码,导致隐私被泄露、密码被盗取等等。
ARP
病毒是局域网内部安全最大的威胁者,如何能有效地防护关系到工作正常地开展,因此需要从原理上对其有深入的理解,并且针对不同的表现,作出及时、有效判断和处理,同时针对不同的场合、情况,做好防范的工作。
如何快速定位
ARP
病毒源
这个基本上是一个力气活,为什么这么说呢?因为即便是可以通过各种手段获得病毒源的
MAC
地址,但是这个
MAC
所对应的电脑是属于谁的,具体的物理位置在哪里,这就不得而知了。所以事先不得不做一些必要的调查工作,统计每一台电脑的
MAC
地址、位置和所属的人员。之后做一张表,最好是存在数据库中,这样以后可以做一个查询系统。但不是制作完成这张表就万事大吉了,还要定期维护,尤其是在部门变动和人员轮换的时候,可能需要重新做这样的统计。对于有
400
台以上电脑的网络来说,这显然不是一件轻松的工作。当然,这也是没有办法的。
这是针对于
ARP
病毒已经发作而采用的应急预案,对于平时的维护,最好是可以做一些预防的工作,这样可以有效地减少此类事件的发生,无论对管理者还是使用人员,都可以感到轻松一些。
预防
ARP
病毒发作的几个方法
不同的网络有其不同的特点,因此对于其中发生的病毒事件也有着不一样的预防方法。针对于
ARP
病毒而言,网上流传着一种似乎很
“
神奇
”
的办法,甚至被一些专业人士奉为一种有效的解决方案。具体是这样:在网关上绑定每一台电脑的
MAC
和
IP
地址,然后在每台电脑绑定到网管的
MAC
和
IP
。举例如下:
arp –s 192.168.0.1 00-17-16-00-88-ad
。很明显这里有漏洞。首先这个命令是
windows
下的
arp
绑定指令,并适合其他的操作系统。第二,这个网络结构的网关是一台安装了
windows
的电脑,不适合使用交换机的局域网。所以说,这个办法是应用于
windows
操作系统的
NAT
单网段结构。事实上,它只是提供了一个思路,就是说要在路由端和客户端做双向的
ARP
解析绑定,这样就从根本上消除了
ARP
病毒的根源,即
ARP
解析。
对于使用交换机的网络,我们可以在交换机上绑定其下每一个网段中,每一台电脑的
MAC
和
IP
地址,然后关闭交换机的动态
APR
功能;之后在每一台电脑上,针对不同的操作系统,使用不同的指令完成网关
MAC
和
IP
的绑定。但还是和定位病毒时所遇到的困难一样,这样很费劲,而且需要不断地维护。当然,就目前的情况看来这是一种效果很好的办法,而且可以使用在绝大多数不同的网络结构中。以前我写过一个这样的解决方案,里面有很详细的配置步骤,可以到我的
blog
(
http://www.cnitblog.com/gyn
)上查阅。
还有一种比较商业化的防御办法,就是设置
ARP
病 毒防火墙,即是在交换机之前架设一台监控过滤器,对于检测到的威胁来源进行封锁。有些解决方案可能还会在客户端安装一个监控小软件,但这其实是有风险的, 因为对于这样的解决方案,如果一旦客户端受到病毒攻击,可能使得该软件被破坏,从而导致监控失效。其实这样的商业解决方案,将其分解开来,每一个模块都是 很容易实现的。首先,在防火墙上设置网管和路由,保证数据的正常进出,在
windows
和
linux
下都有
route
指令来完成该功能;第二,需要一个抓包的工具,通过它来检测网络中的
ARP
包,并对其进行分析,可以使用
pcap
工具;第三,针对分析得到的结果,比如说一个病毒源,使用一定的手段对其封锁,在
linux
环境相可以使用强大的
iptables
。
ARP
防火墙实现的几点细节
针对于以上描述的三个模块,可以具体实现如下:
首先是抓包的实现。在类
unix
的操作系统之下可以使用
pcap
,在
windows
下有
winpcap
,功能都是类似的,但又都非常强大。这里以
windows
为例,编程工具使用
ActivePerl5.8.8
。第一步,到
http://www.winpcap.org/install/default.htm
下载最新的版本,然后安装。第二,在
ppm
下安装
NetPacket
网络数据包解析工具和
Net-Pcap
及其它的简化工具
Net-PcapUtil
,其中后两者的
ppd
文件在
http://www.bribes.org/perl/ppm/Net-Pcap.ppd
和
http://www.bribes.org/perl/ppm/Net-PcapUtils.ppd
中。之后参照安装之后生成的帮助文档,我们就可以开始着手抓包了。
关键是下面这个
Net::PcapUtil
中的
loop
方法,该方法启动一个循环检测,将符合过滤要求的包送给处理程序进行分析。
Net::PcapUtils::loop(\&callback_fn, [ARG => value]);
callback_fn
就是包处理程序。其中
ARG
是如下结构的一下哈希表:
my %args = (
SNAPLEN => 100, # Num bytes to capture from packet
PROMISC => 1, # Operate in promiscuous mode?
TIMEOUT => 1000, # Read timeout (ms)
NUMPACKETS => -1, # Pkts to read (-1 = loop forever)
FILTER => '', # Filter string
USERDATA => '', # Passed as first arg to callback fn
SAVEFILE => '', # Default save file
DEV => '', # Network interface to open
);
需要注意的两点,其一是
FILTER
,包过滤器,具体的语法可以到
winpcap
手册中查询。这里使用了“
arp or rarp
”,即是只抓取
arp
和反向
arp
解析的包。其二是
DEV
,需要使用
Net::Pcap::findalldevs(\$err)
来得到本机的网络设备列表,因为有宽带连接的存在,本地连接会被放在比较靠后的位置,一般会是在最后一位。
抓到包之后,就要对其进行解析。这里要用到
NetPacket
,它提供了针对不同网络层次的包的分析工具。局域网中的“帧”数据以太网层的数据,所以先要使用
NetPacket::Ethernet
得到其中的有效数据,之后再使用
NetPacket::ARP
得到其中的
MAC
和
IP
对应关系。如果对于相同的
MAC
地址,存在不同的
IP
地址映射,那么我们就可以确定该
MAC
地址即是病毒源。为了防止
MAC
伪装,还可以增加在
ethernet
中的检验。但是因为
IP
地址是以八进制的形式存储的,为了方便阅读和进一步利用,需要做一些转换,使其变现为
点分十进制
。
sub sap_to_ip {
my $spa = shift;
my $ip;
for my $idx (0, 2, 4, 6) {
$ip .= oct('0x' . substr($spa, $idx, 2)) . '.';
}
return substr($ip, 0, length($ip) - 1);
}
第二,对于得到的病毒源
MAC
地址,经过一定的处理之后,交由
iptables
进行进一步的处理。在这里我们要用到基于
MAC
地址的匹配,可以使用如下的指令:
iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx –j DROP
这表示,在
INPUT
链中,丢弃所有源
MAC
地址为“
xx:xx:xx:xx:xx:xx
”的包。这样就封锁了所有来自病毒源的数据和请求,包括
ARP
请求。
第三,完成网关的路由功能。相比较原先的网络结构,建立了防火墙的子网,需要将网关由交换机移到防火墙上。根据防火墙连接子网的数量,防火墙上应该配有相应数量的网卡或者说是网络接口。对于单子网的结构,在这里需要两块网卡。首先,假设子网的
IP
段为
192.168.138.0/24,
交换机中的内部连接网络为
192.168.65.0/24
,那么我们需要在防火墙中做如下的配置:
ifconfig eht0 192.168.65.21 netmask 255.255.255.0
route add –net 192.168.65.0 netmask 255.255.255.0
ifconfig eth1 192.168.138.65 netmask 255.255.255.0
route add –net 192.168.138.0 netmask 255.255.255.0
route add default gw 192.168.65.25
子网“
192.168.138.0
”中的所有的数据将通过转发,从而交给上层交换机中的
IP
地址“
192.168.65.25
”,这样就完成了路由功能。
结束语
局域网的管理,最重要的还是要理解这些问题发生背后的原因,以及相关的一些概念和原理,只有这样才能从根本上找出解决的办法,举一反三、触类旁通。
ARP
病毒的防护只是一个例子,它不仅仅需要网络相关的知识,还需要熟悉一些操作系统指令,这些东西都是一个系统的,因此在平时的工作中在深入专业知识的同时,要注意拓展知识的面,从而更好地应对不断进步的科技发展及其中带来和出现的一些问题。