ARP 欺骗防御实战:静态绑定与监控配置

适用场景

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 数量。三层中任意一层单独部署都只能局部生效,主机层防不住同网段其他主机被投毒,交换机层防不住未纳入受管端口的私接设备。上线顺序建议先在核心服务器与网关完成绑定,再补齐监测告警,最后推动交换机侧全网段策略落地。