arp -s 绑定重启失效是因为仅写入内核ARP缓存,未持久化;生产中需通过/etc/network/interfaces(Debian/Ubuntu)或nmcli post-up-command(RHEL/CentOS)实现开机自动绑定,并配合交换机端口安全等措施。
为什么
绑定后重启就失效?
因为
是临时命令,只写入内核 ARP 缓存,系统重启或网络服务重载后清空。实际生产中必须落盘持久化,否则防不了持续的 ARP 欺骗。
常见错误是只跑一遍
就以为搞定了,结果几小时后攻击恢复——缓存过期或 DHCP 更新触发了 ARP 表刷新。
绑定前确认目标 IP 确实在线且 MAC 正确:
静态条目需带
参数才可响应其他主机的 ARP 请求(仅限网关等需要代理应答的场景)
普通终端机一般用
+
(禁用动态学习)组合,但后者在较新内核中已被弃用,改用 sysctl 控制
如何让静态 ARP 在 Ubuntu/Debian 开机生效?
推荐写进
(ifupdown 方式),比 systemd service 更底层、更可靠。NetworkManager 或 netplan 用户需另寻路径(见下节)。
在对应接口段末尾添加
指令:
CentOS Linux 7.9.2009
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
下载
多条绑定用多个
,不要合并成一行(shell 解析可能出错)
确保
已安装:
,否则
命令不存在
测试是否生效:
,再执行
查看 PERM 标记
CentOS/RHEL 8+ 或使用 NetworkManager 的机器怎么处理?
NetworkManager 默认忽略
中的
相关指令,也不能直接改内核参数来锁死 ARP 表。稳妥做法是用
配置连接级脚本:
是 NM 1.22+ 支持的特性,旧版本需用
脚本
务必加
,否则 DHCP 获取的网关可能覆盖静态 ARP 条目
NetworkManager 不会自动执行
,如需禁用动态学习,得额外设
绑定后仍被欺骗?检查这几个关键点
静态 ARP 只防“你主动发包时找错网关”,不防“别人冒充你”。ARP 欺骗检测和防御是两件事。以下情况会导致绑定形同虚设:
目标 IP 对应的 MAC 实际已变更(比如网关设备重换、虚拟机迁移),但本地没更新绑定 —— 静态 ARP 不会自适应
交换机端口安全未开启,攻击者仍可泛洪发送伪造 ARP,导致其他主机缓存污染(你的机器安全了,别人还在中毒)
未关闭本机的
和
,当收到非本机 IP 的 ARP 请求时,仍可能响应,暴露自身存在
容器或 Docker 网络中,
只作用于宿主机 namespace,容器内部需单独绑定或改用 CNI 插件策略
真正健壮的防护要结合交换机端口绑定、DHCP Snooping、以及定期校验
输出与可信清单的一致性——静态 ARP 只是其中一环,而且是最容易配错的一环。
arp -sarp -sarp -s 192.168.1.1 00:11:22:33:44:55ping -c1 192.168.1.1 && arp -n | grep 192.168.1.1pubarp -sarp -D/etc/network/interfacespost-upauto eth0
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
post-up arp -s 192.168.1.1 00:11:22:33:44:55
post-up arp -s 192.168.1.254 aa:bb:cc:dd:ee:ffpost-upifupdownapt install ifupdownifupsudo ifdown eth0 && sudo ifup eth0arp -n/etc/sysconfig/network-scripts/ifcfg-*arpnmclinmcli connection modify "System eth0" +ipv4.route-metric 100
nmcli connection modify "System eth0" ipv4.ignore-auto-routes yes
nmcli connection modify "System eth0" +ipv4.post-up-command "arp -s 192.168.1.1 00:11:22:33:44:55"
nmcli connection down "System eth0" && nmcli connection up "System eth0"post-up-commanddispatcherignore-auto-routesarp -Dsysctl -w net.ipv4.conf.eth0.arp_accept=0arp_ignorearp_announcearp -sarp -n