适用场景
ARP 欺骗防御是同网段环境中最容易被忽视的一环。ARP 协议本身没有任何认证机制,任何主机都可以广播「某 IP 对应的 MAC 是我」,收到该报文的主机会直接覆盖本地 ARP 缓存。攻击者由此可以把自己插入通信链路中间,实现流量嗅探、会话劫持、DNS 篡改乃至整段断网。需要重点防护的场景包括:
- 托管机房、IDC 多租户同网段服务器;
- 企业办公网、无线接入网,终端数量多且不可控;
- 内网核心业务系统之间通过二层互访,网关即为唯一出口;
- 摄像头、打印机、工控设备等长期未更新的嵌入式终端混合组网。
前置条件
- Linux 服务器具备 root 权限,可执行
ip、arptables命令; - 可登录接入层交换机(可选,但二层防护必须在交换机侧才能覆盖全网段);
- 已知网关、关键服务器、DNS 服务器的 IP 与 MAC 对应关系,并记录在配置管理库中;
arpwatch、arping可安装,且系统有可用的 syslog 或邮件告警通道。
原理说明
主机通信时需要先把目标 IP 解析为 MAC,解析结果写入 ARP 缓存表。攻击手法主要有三类:
- ARP 缓存投毒:持续发送伪造的 ARP 应答,声称网关 IP 对应攻击者 MAC,受害主机的出网流量被牵引到攻击者主机;
- ARP 泛洪:高速发送大量随机 ARP 报文,耗尽交换机 MAC 地址表容量,触发交换机退化为广播转发,实现旁路嗅探;
- 免费 ARP 劫持:伪造 Gratuitous ARP 抢占地址,导致 IP 冲突或业务中断。
防御手段按层次划分:主机层使用静态 ARP 绑定与 arptables 过滤;监测层使用 arpwatch 与自检脚本发现 MAC 漂移;网络层使用交换机的 DHCP Snooping 与动态 ARP 检测(DAI)实现全网段准入。三层同时部署才能形成闭环,只做主机层静态绑定只能保护自身。
操作步骤
步骤一:建立基线并识别异常
记录网关与关键主机的真实 MAC,作为后续比对依据:
ip neigh show
arp -an
cat /sys/class/net/eth0/address
若同一条 IP 的 MAC 在短时间内反复变化,或网关 MAC 与设备资产记录不一致,即存在投毒嫌疑:
for i in $(seq 1 20); do ip neigh show 192.168.1.1; sleep 1; done | sort -u
步骤二:主机层静态 ARP 绑定
把网关与关键服务器条目设为 permanent,内核将拒绝用收到的 ARP 应答更新该条目:
ip neigh replace 192.168.1.1 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
ip neigh replace 192.168.1.53 lladdr 00:11:22:33:44:66 dev eth0 nud permanent
ip neigh show
输出中状态应为 PERMANENT。重启后条目会丢失,用 systemd 单元固化:
cat > /etc/systemd/system/static-arp.service <<'EOF'
[Unit]
Description=Static ARP entries
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/ip neigh replace 192.168.1.1 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
ExecStart=/usr/sbin/ip neigh replace 192.168.1.53 lladdr 00:11:22:33:44:66 dev eth0 nud permanent
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now static-arp.service
步骤三:arptables 过滤伪造应答
在已做静态绑定的前提下,直接丢弃所有声称网关地址的 ARP 应答,阻断投毒报文被内核处理:
arptables -A INPUT --opcode 2 -d 192.168.1.1 -j DROP
arptables -A OUTPUT --opcode 2 -s 192.168.1.1 -j DROP
arptables -L -n
其中 –opcode 2 表示 ARP Reply,-d 为 ARP 报文中的目标 IP。规则固化:
mkdir -p /etc/arptables
arptables-save > /etc/arptables/rules.v4
cat > /etc/systemd/system/arptables-restore.service <<'EOF'
[Unit]
Description=Restore arptables rules
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/arptables-restore /etc/arptables/rules.v4
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now arptables-restore.service
步骤四:arpwatch 监测 MAC 漂移
arpwatch 持续监听 ARP 流量,一旦某 IP 的 MAC 发生变化或出现新设备即记录并告警:
apt-get install -y arpwatch # Debian/Ubuntu
# yum install -y arpwatch # RHEL/CentOS
mkdir -p /var/lib/arpwatch
arpwatch -i eth0 -f /var/lib/arpwatch/arp.dat -m ops@example.com -N -p
参数含义:-i 指定网卡,-f 指定地址库文件,-m 指定告警邮箱,-N 不报告网关地址变化,-p 关闭混杂模式。生产环境用 systemd 托管:
cat > /etc/systemd/system/arpwatch.service <<'EOF'
[Unit]
Description=ARP watcher
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/sbin/arpwatch -i eth0 -f /var/lib/arpwatch/arp.dat -m ops@example.com
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now arpwatch.service
步骤五:自检脚本与定时告警
用脚本把网关 MAC 与基线比对,异常时写 syslog 并返回非零退出码,供监控系统采集:
cat > /usr/local/bin/arp-guard.sh <<'EOF'
#!/bin/bash
GW_IP="192.168.1.1"
GW_MAC="00:11:22:33:44:55"
DEV="eth0"
now=$(ip neigh show "$GW_IP" dev "$DEV" | awk '{print $5}' | head -n1)
if [ -z "$now" ]; then
logger -t arp-guard "WARN: no ARP entry for $GW_IP"
exit 2
fi
if [ "$now" != "$GW_MAC" ]; then
logger -t arp-guard "ALERT: $GW_IP MAC drift $GW_MAC -> $now"
exit 1
fi
exit 0
EOF
chmod 700 /usr/local/bin/arp-guard.sh
echo '*/5 * * * * root /usr/local/bin/arp-guard.sh' > /etc/cron.d/arp-guard
步骤六:交换机侧全网段防护
主机层只能自保,覆盖全网段必须在接入交换机启用 DHCP Snooping 与动态 ARP 检测(以 Cisco 为例):
ip dhcp snooping
ip dhcp snooping vlan 10
no ip dhcp snooping information option
ip arp inspection vlan 10
ip arp inspection validate src-mac dst-mac ip
interface GigabitEthernet0/1
description Uplink-to-Core
ip dhcp snooping trust
ip arp inspection trust
interface range GigabitEthernet0/2 - 24
switchport port-security
switchport port-security maximum 2
switchport port-security violation restrict
ip arp inspection limit rate 15 burst interval 1
上联端口设为 trust,接入端口不得为 trust,否则 DAI 形同虚设;ip arp inspection validate 需同时校验源 MAC、目的 MAC 与 IP,仅校验 IP 无法拦截 MAC 伪造。
配置验证
逐项确认防护生效:
# 1. 静态条目存在且为 PERMANENT
ip neigh show 192.168.1.1
# 2. arptables 规则命中计数
arptables -L -n -v
# 3. arpwatch 运行状态与地址库
systemctl status arpwatch
tail -n 20 /var/log/syslog | grep arpwatch
# 4. 自检脚本
/usr/local/bin/arp-guard.sh; echo "exit=$?"
# 5. 用 arping 触发一次解析后复核 MAC 是否被改写
arping -c 3 -I eth0 192.168.1.1
ip neigh show 192.168.1.1
攻击模拟验证(仅在授权测试网段执行):在另一台主机发送伪造应答,观察目标机 ARP 表未变化、arpwatch 产生 changed ethernet address 记录、arptables 命中计数递增,即可判定防护链路完整。
# 测试端(授权环境)
arpspoof -i eth0 -t 192.168.1.10 192.168.1.1
常见问题
Q1:网关更换硬件或做双机切换后全网断网怎么办?
静态绑定会阻止内核学习新 MAC,因此必须建立变更流程:更换前先记录新设备 MAC,变更窗口内下发 ip neigh replace 更新条目与 systemd 单元中的 lladdr,再重启 static-arp.service。同时 arpwatch 的告警日志应接入监控平台,避免网关漂移被静默忽略。临时回滚可执行 ip neigh del 192.168.1.1 dev eth0 恢复动态学习。
Q2:云服务器或虚拟化环境能否设置永久 ARP 条目?
多数公有云使用虚拟交换机(vSwitch)接管二层,不提供真实二层广播域,ARP 欺骗在租户间被平台隔离,此时静态绑定的收益很低;部分虚拟化平台的网卡驱动还会在热迁移后重置 ARP 缓存。此类环境应优先依赖平台侧的安全组与微分段,而非主机层静态条目。
Q3:只给服务器做静态绑定,办公网终端还有必要管吗?
有必要。攻击者通常以办公网终端为跳板,先投毒终端再横向探测服务器。终端侧建议启用交换机 DAI 与端口安全,或在终端上开启 arpwatch 类监测;对无法管控的个人终端,可通过 VLAN 隔离把办公网与服务器网段做三层隔离,禁止二层直达。
总结
ARP 欺骗防御需要三层配合:主机层用 ip neigh … nud permanent 锁死网关条目,用 arptables –opcode 2 丢弃伪造应答;监测层用 arpwatch 与定时自检脚本捕捉 MAC 漂移并告警;网络层在接入交换机启用 DHCP Snooping 与 DAI,配合端口安全限制单端口 MAC 数量。三层中任意一层单独部署都只能局部生效,主机层防不住同网段其他主机被投毒,交换机层防不住未纳入受管端口的私接设备。上线顺序建议先在核心服务器与网关完成绑定,再补齐监测告警,最后推动交换机侧全网段策略落地。