直接敲个sudo arp -s就能绑定IP和MAC,这事儿谁都会。但问题在于,这操作只管当前这一次,机器一重启,绑定就没了。真要防住ARP欺骗,得让这个绑定在重启后依然坚挺,并且还得配合内核层面的防护和验证机制,才算把漏洞堵严实了。

用 arp -s 添加静态ARP条目
这是最基础的一步,命令格式固定:sudo arp -s 。比如,你想把网关192.168.1.1和它的真实MAC地址00:1a:2b:3c:4d:5e锁死,就这么敲:
sudo arp -s 192.168.1.1 00:1a:2b:3c:4d:5e
命令执行后立刻生效,但有几个关键点得注意:
arp -s添加的条目,在arp -n的输出里会带一个PERM标记,这表示它是永久的,而不是普通的C(缓存)或者INCOMPLETE状态。- 这个命令本身不校验你输入的MAC地址是否真实存在。万一输错了,它也会照绑不误,结果就是后续通信直接中断。
- 系统重启,或者网络服务重载(比如执行
systemctl restart networking),这些静态条目都会被清空。 - 它默认作用于系统第一个可用的网络接口。如果你的机器有多块网卡,建议使用更可控的
ip neigh add命令,并显式指定设备名。
让静态ARP绑定开机自动加载
靠手动执行命令肯定不行,必须得让绑定持久化,开机自动加载。这里推荐两种主流方法:
方法一:写入/etc/ethers文件 + arp -f加载
创建一个/etc/ethers文件,里面每行写一个对,例如:
192.168.1.1 00:1a:2b:3c:4d:5e
然后运行sudo arp -f就能加载文件里的所有绑定。不过要注意,arp -f不指定设备,它会尝试在所有接口上加载绑定。如果同一个IP地址在多个子网里都存在,可能会绑定到错误的网卡上。
方法二:使用systemd服务启动脚本(更可靠)
这个方法更稳妥。先创建一个脚本,比如/usr/local/bin/configure-static-arp.sh,里面用arp -s或者更推荐的ip neigh add命令,并且明确指定dev参数。然后,再配置一个对应的static-arp.service服务单元,确保它在network-online.target之后运行。这样做的好处是能完美避开网络还没就绪时就执行绑定命令导致失败的问题。
验证绑定是否真正生效且抗干扰
别光看到arp -n里显示PERM就以为万事大吉了。在实际的攻击场景下,你得确认三件事:
- 运行
ip neigh show,检查对应的条目是否包含PERMANENT字样,并且dev字段显示的网卡(比如eth0)和你预期的完全一致。 - 主动触发一次ARP请求:执行
arping -c 2 -I eth0 192.168.1.1,看看返回的MAC地址是不是和你绑定的那个一致。如果返回了别的MAC,说明绑定可能被绕过了,或者根本没生效。 - 有条件的话,可以做一次模拟欺骗测试:用另一台机器发送伪造的ARP响应(例如使用
arpspoof工具),然后再查一下arp -n | grep 192.168.1.1——在绑定和防护都生效的情况下,显示的MAC地址应该纹丝不动。
必须同步开启的内核级防护
光靠静态绑定,只能算“堵”了一个漏洞。如果不开内核防护,攻击者仍然可能通过其他路径污染你的ARP邻居表。下面这几个内核参数,几乎是必选项:
rp_filter(反向路径过滤):防止IP源地址伪造的数据包进入系统。设置命令:echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/rp_filterarp_ignore:控制本机对ARP请求的响应行为。设置为2表示“只响应目标IP是本机地址的ARP请求”。设置命令:echo 2 | sudo tee /proc/sys/net/ipv4/conf/all/arp_ignorearp_announce:限制ARP通告时使用的源IP,避免在多网卡环境下从错误的接口应答。设置命令:echo 2 | sudo tee /proc/sys/net/ipv4/conf/all/arp_announce
敲黑板了:这些设置必须写入/etc/sysctl.conf配置文件,然后执行sudo sysctl -p使其生效并持久化,否则重启后就会失效。如果只做了arp -s绑定,却忽略了这三项内核防护,那就好比把大门锁好了,却留着窗户大敞四开,攻击者照样能登堂入室。