记一次 Ubuntu 使用 arptables 抵御局域网 ARP 攻击

.

.

.

.

.

前段时间大概有一个月左右,租房的网络每天都断一次,每次断大概一两分钟左右就恢复了,所以没太在意。直到有一天晚上,LZ 正在写博客,但是网络频繁中断又重新连上再中断。待 LZ 好不容易找了个连上网的空隙把没写完的博文暂存了一下,然后就开始着手排查问题。

通过 arp(1) 命令发现网关的 mac 地址不是房东路由器的地址,于是第一反应便是内网发生了 ARP 攻击。

于是 LZ 打开 Wireshark 开始抓包,发现内网 192.168.1.129 这台主机向内网频繁的发送 ARP 广播,并且当 LZ 的主机向内网发送 ARP 广播查询网关 mac 地址时总是它进行响应,这是很明显的 ARP 欺骗。

其实这是木马病毒搞的鬼,它欺骗内网所有的主机,将自己伪装成网关。这样当其它主机发送上网请求的时候就会把数据包发给它,它就可以随意监听大家上网的内容了。

先不管它是什么鬼了,对 LZ 来说还得抓紧时间写博客,于是就先装一个 ARP 防火墙凑合一下,等有时间了再收拾它。

# 安装 arptables 防火墙
>$ sudo apt-get install arptables

# 编写脚本
>$ vim arptables.sh

#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# 进站规则:如果来源 mac 不是 d8:5d:4c:60:c5:3c 则丢弃数据包
arptables -A INPUT -i eth0 --src-mac ! d8:5d:4c:60:c5:3c -j DROP
# 进站规则:如果来源 mac 不是 d8:5d:4c:60:c5:3c 且来源 IP 不是 192.168.1.1 则丢弃数据包
arptables -A INPUT -i eth0 --src-ip 192.168.1.1 --src-mac ! d8:5d:4c:60:c5:3c -j DROP
# 允许所有的出站请求
arptables -A OUTPUT --destination-mac ff:ff:ff:ff:ff:ff -j ACCEPT

# 赋予脚本执行权限
>$ chmod 755 arptables.sh

# 然后将脚本添加到开机启动项即可。

# 这两条命令也是 arptables 常用的命令
# 查看所有的规则
sudo arptables -L
# 删除所有的规则
sudo arptables -F

配置好这个 ARP 防火墙之后立马就可以上网了,看来还是防火墙好使哈哈。

上面是在 LZ 的 Ubuntu 笔记本上配置的,后来 LZ 又切换到了装有 Redhat 的台式机上,结果发现依然被 arp 攻击得无法上网。

LZ 发现 Redhat 上已经预装了 arptables,但是在配置规则的时候总是提示 Permission denied,LZ 也是醉了,明明都是 root 了,也不知道为什么没权限。

无奈之下只好弃用 arptables 了,看来只能用原生的 arp 命令来设定一个静态的 arp 表,不过发现这个办法倒是蛮管用的,跟用 arptables 效果一样。

>$ sudo arp -s 192.168.1.1 d8:5d:4c:60:c5:3c

这条命令就是将本地 ARP 中网关的 IP 和 MAC 手工指定好,这样无论外面广播的网关地址是多少统统忽略,让系统直接与这个手工配置的网关打交道。