很多年前的文章,似乎仍然有参考意义。
前几周帮一个网吧解决了经常掉线的故障,现在把这次故障解决的经历写出来,也许对大家有所启示。
网吧给我描述的故障现象是网吧无规律掉线,表现是下面所有客户端都不能上网,而上网服务器仍然能够上网,也就是说对方ISP线路没有问题,掉线之后重启上网服务器网络又恢复正常,于是把问题定位在网吧内部,网吧网络结构如图1。
经过分析,认为大致可能是以下原因造成网吧掉线:
1, 上网服务器内网卡到主交换机这段的问题,比如上网服务器的内网卡有问题,或者上网服务器本身有问题(比如电源风扇或CPU风扇坏掉),或者主交换机与上网服务器内网卡之间的连线有问题,或者主交换机有问题;
2, 网吧客户端有病毒发送大量数据包导致网络堵塞;
3, 网吧客户端的网卡坏或者交换机的端口损坏;
4, 网吧内部有人进行攻击,比如常见的ARP攻击。
但到底是什么原因,也只有一个一个地排除,于是首先要排除上面描述的第1个可能,为了排除第1个可能,老板重新换了一个主交换机测试,也换掉了主交换机与上网服务器内网卡之间的网线,并且我也重新安装并配置了一台上网服务器,也就是说如果是第1个可能造成的掉线,那么问题就应该得到解决,时间一天一天地过去,但要到一周的时间时网吧老板又打来电话说网络又掉线了,这并没有出乎我的意料,因为原来在检查上网服务器等等时,并没有发现服务器有造成网络掉线的重大嫌疑,虽然它安装了一些多余无用的协议,但这并不足以影响内部网络掉线,最多影响网络性能而已。
于是开始怀疑内部客户端的问题,但心中马上又排除了第2个可能,因为网吧都安装了还原精灵之类的东西,重启后计算机都还原了,所以客户端不应该有什么病毒的,而且这种时间间隔的掉线也不像客户端网卡坏或者交换机端口坏,于是想到了第4种可能,难道是有人在进行攻击,既然是可能是有人在进行攻击,那就只有当他在攻击时才能确定真实原因,如果攻击者没有在现场,我去了也找不出原因的,于是一次网吧老板再次打电话说掉线之后,我就迅速赶到了现场,到了网吧,我就在上网服务器上输入arp –a命令,结果让我大吃一惊,这不就是猜想中的ARP攻击吗?(如下)
C:\Documents and Settings\Administrator>arp -a
Interface: 192.168.0.1 --- 0x10004
Internet Address Physical Address Type
192.168.0.12 00-11-09-d5-86-4a dynamic
192.168.0.13 00-11-09-d5-86-4a dynymic
192.168.0.15 00-11-09-d5-86-4a dynymic
……………………………………………
从上面的ARP缓存表可以看出,所有的内网IP对应的MAC地址都被修改成一样的了,这个修改后的MAC地址就可能是攻击者的MAC地址,因为这样所有到其他IP的数据将被传递到这台攻击机,以实现攻击者的某些需要,比如盗取各种密码等,那这个MAC对应的真实IP又是谁呢?因为原来的MAC地址没有登记,所以只有通过IP来找到相应的上网客户端,于是只有在上网服务器上安装上一个sniffer软件,看到底是哪个IP在发送攻击性的数据包,下图2是我用Ethereal监听之后过滤出来的所有ARP通信,这是我首先看到的一部分截图,可以看出,图2是ARP广播,实质上是攻击者在进行扫描,以确定哪些机器在线,因为在线的机器会对这个ARP广播做出应答,不过这也马上暴露了攻击者自身,从图2 可以看出,现在的扫描者是IP为192.168.0.56的客户机(56号机),当然这还不能充分证明它就是攻击者,我们再看看下面的数据包(图3)。
请注意图3中高亮选中的行,源MAC是攻击机,目标MAC是上网服务器的内网卡,这里攻击机冒充192.168.0.86这台机器对网关说86号机的MAC地址是00-11-09-d5-83-2d(这本是攻击机的MAC地址),这样做的结果就是网关发送给86机器的数据将发送到攻击者,紧接着上面的下一行,攻击者给另一台机器(经查是85号机)说网关的MAC地址是攻击者的MAC,于是到这里,攻击就行成了,因为攻击者给客户机说网关的地址是它的MAC,又跟网关说客户机的MAC是它的MAC地址,于是所有通讯的数据都到达了攻击机,从而到达它获取网内其他用户帐号和密码的要求,当然也很有可能这只是纯粹的攻击而已。于是此后网速会越来越慢,直至崩溃,如果此时攻击者关机,那么整个网络就会表现突然掉线,因为此时客户机都不能与这个假“网关”通讯了,当然客户机也就不能访问因特网了,表现出来就是网络掉线了,如果此时上网服务器重新启动,由于启动时它将广播自己的ARP,这也导致客户机更新网关的ARP条目,于是网络又恢复正常,但如果攻击仍在继续,网络又回像前面一样慢慢崩溃。
那怎样来防范这类ARP中间攻击呢?当然只要攻击者不能更改别人的ARP缓存表条目就行了,要做到这一点,我们可以创建静态ARP表项来实现,但这比较麻烦,因为不光要在网关上创建,还需要在客户机上进行,在网关上创建所有客户机的ARP静态项,这样攻击者就不能修改网关上的ARP项,为了不让攻击者修改客户机上的ARP项(通常是修改网关条目),还需要在客户机的ARP缓存表中创建至少网关的ARP静态条目,可以通过下面的方法进行:
(一) 在上网服务器(网关)上创建所有客户机的静态ARP表项
1,使用arp –a > c:\arp.txt把所有动态ARP表项定向到一个文本文件c:\arp.txt
完成后打开这个文本,删除掉顶部非ARP表项的部分,结果如图4所示:
最好在上网高峰期执行这个命令,这样才能尽可能得到所有客户机的MAC地址,当然你也可以手动在后面添加上没包括进的IP和MAC地址对。
2,创建脚本文件c:\bind.bat,内容如下:
FOR /F "tokens=1,2" %%i in (c:\arp.txt) do (arp -s %%i %%j)
它的作用是从前面的arp.txt中提取相应的表项并创建静态表项。
3,为了让上网服务器每次开机都运行上面的脚本,可以把这个脚本的快捷方式发送到启动项里面。
(二) 客户机的操作
客户机上的操作同理,只是客户机只需要绑定网关,当然也可以全部绑定,操作与上面类似,不同的是可以把上面的arp.txt文本放在一个共享文件夹中,然后2、3步作相应改变即可。