arptables是唯一能在内核arp收包路径(nf_arp_in)上直接拦截伪造arp响应的工具,通过sudo arptables -a input -s 192.168.1.100 --source-hw aa:bb:cc:dd:ee:ff -j drop实现源ip+mac精确过滤,iptables不处理arp,ebtables无法识别arp操作码。

arptables -A INPUT 丢弃指定MAC+IP组合的ARP响应
当确认某台设备(比如 192.168.1.100 + aa:bb:cc:dd:ee:ff)持续发送伪造ARP应答时,arptables 是唯一能在内核收包路径上直接拦截的工具。它不依赖用户态程序轮询或缓存刷新,而是从协议栈入口就过滤掉恶意包。
执行以下命令即可生效:
sudo arptables -A INPUT -s 192.168.1.100 --source-hw aa:bb:cc:dd:ee:ff -j DROP
注意点:
-
-A INPUT表示作用于发往本机的ARP请求/响应包,不能用OUTPUT或FORWARD替代 -
--source-hw必须写全小写冒号分隔格式,AA:BB:CC:DD:EE:FF或带短横线会匹配失败 - 该规则只阻断“源IP+源MAC”完全匹配的包,若攻击者轮换MAC,需配合脚本动态追加规则
- 规则不自动持久化,重启后失效,必须用
arptables-save导出并写入开机加载流程
为什么不用 iptables 或 ebtables?
iptables 完全不处理ARP包——它工作在IP层,而ARP是链路层协议,走的是独立的 arp_rcv() 路径;ebtables 虽能过滤以太网帧,但无法识别ARP操作码(opcode),容易误杀正常ARP请求(opcode=1)或放行伪造响应(opcode=2)。
arptables 是专为ARP设计的,底层挂钩在 NF_ARP_IN 点,能精确区分:
- 谁发的(
-s IP/--source-hw MAC) - 发给谁(
-d IP) - 是什么类型(隐含在ARP结构体中,无需显式指定)
所以遇到“明明写了iptables规则却拦不住ARP欺骗”的情况,基本可以确定是协议层选错工具。
清空、查看与保存arptables规则
调试阶段频繁修改规则时,这几个命令必须熟记:
- 查看当前所有规则:
sudo arptables -L -n(加-n避免DNS反查拖慢输出) - 清空INPUT链:
sudo arptables -F INPUT(慎用-F不带链名,会清空全部) - 保存到文件:
sudo arptables-save > /etc/arptables.rules - 开机恢复:
sudo arptables-restore 需写入 <code>/etc/rc.local或 systemd service
特别提醒:arptables-save 输出的规则里,MAC地址默认带引号,如 "aa:bb:cc:dd:ee:ff",直接 restore 没问题;但手动编辑时删了引号会导致语法错误,arptables-restore 会静默失败且不报错。
arp_ignore 和 arp_announce 不是替代方案
有人试图用 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 来“禁止响应”,但这只控制本机是否对ARP请求做应答,对已经收到的非法ARP响应包毫无过滤能力——它不丢包,只是让本机少发点包。
真正需要的是硬过滤,即:攻击者的ARP响应包到达网卡后,在进入本机ARP子系统前就被干掉。这只有 arptables 能做到。其他手段(静态绑定、rp_filter、监控脚本)都是补救或旁路措施,不能代替入口级拦截。
实际部署中,arptables 规则要放在最前面,避免被后续规则干扰;且必须配合 arp_ignore=1 和静态绑定使用,否则单靠过滤无法防止本机ARP表被已有污染条目误导。











