linux无内置网关mac变更自动锁接口功能,但可通过arp监控脚本+systemd服务实现:持续比对网关mac,变化时执行ip link set down禁用接口,并建议增加多轮检测、mac持久化及日志审计。

Linux系统本身不提供“检测网关MAC变化→自动锁定接口”的开箱即用功能,但可通过组合ARP监控、脚本响应与接口控制实现该行为。核心思路是:持续比对当前网关IP对应的MAC地址,一旦发现变更,立即禁用对应网络接口(如ip link set eth0 down),防止潜在的ARP欺骗或中间人攻击。
一、确认网关IP并获取初始MAC地址
先明确你的默认网关:
- 运行
ip route | grep default,记下网关IP(例如192.168.1.1) - 手动解析一次MAC:
arp -n | grep "192.168.1.1"或ip neigh show | grep "192.168.1.1" - 若无记录,可先 ping 通网关触发ARP学习:
ping -c 1 192.168.1.1
二、编写ARP监控与响应脚本
创建一个守护脚本(例如 /usr/local/bin/gateway-arp-guard.sh),内容如下:
#!/bin/bash
GATEWAY="192.168.1.1"
INTERFACE="eth0"
KNOWN_MAC=""
<h1>初始化已知MAC</h1><p>get_current_mac() {
ip neigh show "$GATEWAY" 2>/dev/null | awk '{print $5}' | head -n1 | tr '[:lower:]' '[:upper:]'
}</p><p>KNOWN_MAC=$(get_current_mac)
if [ -z "$KNOWN_MAC" ]; then
echo "无法获取网关 $GATEWAY 的初始MAC,退出。"
exit 1
fi</p><p>while true; do
sleep 10
CURRENT_MAC=$(get_current_mac)
if [ -n "$CURRENT_MAC" ] && [ "$CURRENT_MAC" != "$KNOWN_MAC" ]; then
echo "$(date): 网关MAC变更 detected: $KNOWN_MAC → $CURRENT_MAC"
ip link set "$INTERFACE" down
logger -t arp-guard "Interface $INTERFACE disabled due to gateway MAC change"
exit 0
fi
done
</p>
赋予执行权限:sudo chmod +x /usr/local/bin/gateway-arp-guard.sh
三、以服务方式持久运行
新建 systemd 服务文件 /etc/systemd/system/arp-guard.service:
[Unit] Description=ARP Guard for Gateway MAC Integrity After=network.target <p>[Service] Type=simple ExecStart=/usr/local/bin/gateway-arp-guard.sh Restart=on-failure RestartSec=5 User=root</p><p>[Install] WantedBy=multi-user.target </p>
启用并启动:
sudo systemctl daemon-reloadsudo systemctl enable --now arp-guard.service-
sudo systemctl status arp-guard.service确认运行中
四、增强可靠性建议
为避免误触发或单点失效,推荐补充以下措施:
- 在脚本中增加多次连续检测(如3次间隔检查均不同才动作),降低瞬时ARP缓存刷新导致的误判
- 将
KNOWN_MAC存入文件(如/var/lib/arp-guard/known-mac),支持重启后恢复信任状态 - 配合
iptables或nftables添加规则,丢弃来自非预期网关MAC的数据包(作为第二道防线) - 日志统一写入
/var/log/arp-guard.log并轮转,便于审计
该机制不依赖外部工具(如arpwatch),纯用系统内置命令构建,轻量可控,适用于安全敏感或工业控制类Linux终端场景。











