Skip to content

局域网 ARP 欺骗

01 前置理论与核心机制

1. ARP 协议的地址映射规则

  • IP 与 MAC 的映射:在局域网(LAN)底层通信中,数据包在二层交换机上转发依赖的是物理网卡地址(MAC)。ARP(地址解析协议)负责将目标 IP 转换为对应的 MAC 地址。
  • 信任漏洞(无身份认证):ARP 协议在设计上缺乏身份认证机制。局域网内的任何机器都可以发送伪造的 ARP 应答报文,声称自己拥有某个特定的 IP 地址。

2. 中间人攻击(MitM)的本质

  • 网关劫持:攻击者在局域网内持续发送伪造的 ARP 报文,向受害机器宣称“我的 MAC 地址就是网关”。受害机器的 ARP 缓存被污染后,原本发往真实网关(路由器)的流量会被引流至攻击者机器。攻击者可据此对流量进行嗅探、篡改,然后再转发给真实网关,完成中间人劫持。

02 故障排查与恢复闭环 SOP

当发现局域网内某台机器流量异常、存在未知通信,或网络时断时续时,按以下步骤查出攻击源:

步骤一:排查本地 ARP 缓存(寻找异常特征)

无需立即使用复杂分析工具,优先检查受害机器本地的 ARP 映射表是否被篡改。

# 查看本地 ARP 缓存表 (Linux)
arp -a
# 或使用较新的 ip 命令
ip neigh show
  • 分析要点:仔细比对输出结果,重点关注网关 IP 对应的 MAC 地址。如果发现多个不同的 IP 指向了同一个 MAC 地址(例如网关 192.168.0.1 的 MAC 与局域网内另一台普通机器 .89 的 MAC 完全一致),说明缓存已被污染。记录该异常的 MAC 地址。

步骤二:抓取底层 ARP 流量(锁定恶意发包行为)

仅凭缓存异常不足以确诊,需抓取实时的二层网络包,验证该异常 MAC 是否在持续发起攻击。

# 监听指定网卡 (如 ens33/eth0) 的 arp 报文,-e 打印 MAC,-n 不解析域名
tcpdump -i  -e -n arp

  • 排查焦点:观察抓包输出。如果在没有设备发起 ARP Request 的情况下,某个设备在高频、持续地主动发送类似 Reply 192.168.0.1 is-at 00:0c:29:6b:25:a3 的应答包,向全网广播伪造的网关身份,且该 MAC 与第一步记录的异常 MAC 吻合,即可确认该设备为攻击源。

步骤三:追踪真实物理设备

获取攻击源 MAC 地址后,将其从网络层对应到物理层: - 查交换机端口:登录接入层交换机,查看 MAC 地址表(如 Cisco 系设备执行 show mac address-table | include <异常MAC>),确认该 MAC 所在的物理端口。 - 查资产台账:通过 IT 资产管理后台搜索该 MAC,定位具体的服务器实体或终端电脑。

步骤四:应急止血与防御

  • 临时止血:在受害机器上绑定静态 ARP,强制将网关 IP 与真实的网关 MAC 绑定,拒绝动态更新。
arp -s 192.168.0.1
  • 物理隔离:确认攻击端口后,直接在交换机上将该端口 shutdown 进行物理断网。

03 真实生产故障现象与案例库

案例 1:内网渗透测试引发的流量劫持

  • 监控现象:某业务服务器向外部请求 API 时延迟大幅增加,部分 HTTP 流量中出现未知的注入代码。
  • 排查结果:执行 arp -a 发现网关 MAC 被替换。通过 tcpdump -e -n arp 抓包,锁定一个尾号为 25:a3 的 MAC 正在以每秒数十次的频率发送伪造网关的 ARP Reply。
  • 根因与处置:同网段内某台服务器被攻陷,正在运行 arpspoof 等工具进行中间人嗅探。处置方案为立即在交换机层面封禁该端口,并将被控服务器断网重装。

案例 2:静态 IP 配置冲突引发的“假性攻击”

  • 监控现象:局域网内部分机器随机断网,网络时好时坏。
  • 排查结果:抓包发现有两个不同的 MAC 地址在竞争同一个网关 IP,不断互相覆盖 ARP 缓存。
  • 根因与处置:局域网内有员工私自将终端的静态 IP 设置为网关 IP,导致 IP 冲突。处置方案为定位违规设备并改回 DHCP 自动获取。

案例 3:网卡故障导致的免费 ARP (Gratuitous ARP)风暴

  • 监控现象:二层局域网出现广播风暴,所有机器的 CPU 中断使用率(si/hi)飙升,网络瘫痪。
  • 排查结果:交换机端口指示灯高频闪烁,抓包发现某台机器在持续发送 Gratuitous ARP(免费 ARP)报文。
  • 根因与处置:某台服务器物理网卡硬件故障或驱动 Bug,导致发包逻辑失控。处置方案为拔除故障网线,更换物理网卡。

04 生产排障速查表(局域网 ARP 异常)

遇到局域网流量异常或疑似被劫持,按序排查:顺序排查层级执行命令 / 观测点异常定性处置动作01本地缓存arp -a 或 ip neigh多个 IP 对应同一个 MAC,或网关 MAC 突变记录异常 MAC 地址作为排查目标02抓包取证tcpdump -i eth0 -e -n arp某 MAC 未经请求持续发送 Reply 伪装网关定性为 ARP 欺骗或中间人攻击03设备定位show mac address-table找到异常 MAC 对应的交换机物理端口追踪底层物理位置及所属资产04终端阻断arp -s <网关IP> <真实MAC>业务受影响且需优先保障连通性受害机绑定静态 ARP 忽略伪造报文05根源隔离交换机 shutdown 端口确认该端口下为攻击源或失控机器物理切断攻击源网络连接

05 面试应答参考话术

面试官问:“如果局域网被中间人攻击了(比如 ARP 欺骗),你怎么快速查出攻击源?”

可以这样回答:排查的核心在于理解局域网二层通信规则。ARP 协议负责将 IP 解析为 MAC 地址,但由于缺乏身份验证,攻击者可以伪造应答,将自身 MAC 伪装成网关来截获流量。遇到流量劫持,不建议盲目部署复杂的分析软件。标准的排查思路分为三步:查缓存、抓流量、定设备。第一步:检查本地 ARP 缓存

首先在受害机器上执行 arp -a。如果输出结果显示网关 IP 对应的 MAC 与局域网内另一台普通机器的 MAC 完全相同(即多 IP 对应单 MAC),说明缓存已被污染。此时记录该异常 MAC 地址。第二步:抓取 ARP 流量验证

进一步使用 tcpdump -i eth0 -e -n arp 抓取底层的 ARP 报文,-e 参数用于打印二层 MAC 地址。如果抓包显示,该设备在未经请求的情况下,高频主动发送 Reply 应答包,向全网宣告自己是网关,且 MAC 地址与第一步一致,即可确认该设备在持续发起劫持攻击。第三步:锁定物理位置并阻断

获取确切的 MAC 地址后,登录接入层交换机查看 MAC 地址表,或在 IT 资产库中进行检索,锁定具体的交换机端口和物理设备。直接在交换机上将其端口 shutdown,即可阻断攻击。

06 面试高频追问与应答预案

追问 1:既然 ARP 漏洞存在,企业内网一般怎么从源头防御 ARP 欺骗?

  • 回答要点:
  • DAI(动态 ARP 检测):在企业交换机开启 DAI 功能。交换机会通过 DHCP Snooping 绑定表核对 ARP 报文。如果端口发送的 ARP 报文中 IP 与 MAC 的对应关系与 DHCP 记录不符,交换机会直接丢弃。
  • 静态绑定与端口安全:针对核心服务器,在操作系统内部静态绑定网关 ARP,并在交换机端口开启 Port Security(端口安全),限制该端口只能通信特定的 MAC。

追问 2:如果攻击者和受害者不在同一个网段(比如跨了路由器),还能发起 ARP 欺骗吗?

  • 回答要点:
  • 不能。ARP 属于二层广播协议,路由器的核心作用即隔离广播域。
  • 跨网段设备通信时,目标 MAC 会被封装为默认网关的 MAC,ARP 请求无法穿越路由器到达另一网段。因此,典型的 ARP 欺骗只能在同一二层局域网(同一 VLAN/子网)内发生。

07 一键 ARP 异常巡检脚本(check_arp_spoof.sh)

该脚本用于快速分析本地 ARP 缓存表,自动检测是否存在“多 IP 对应单 MAC”的劫持特征。

#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: check_arp_spoof.sh
# 功能描述: 本地 ARP 缓存表异常/劫持检测 (纯只读)
# 使用方式: 在 Linux 宿主机直接执行
# ==============================================================================

set -o pipefail

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'

echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${BLUE}                局域网 ARP 缓存表异常检测                        ${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"

# 1. 检查是否存在 arp 命令
if ! command -v arp &>/dev/null; then
    echo -e "${RED}[ERROR] 当前系统未安装 net-tools (找不到 arp 命令),请使用 ip neigh 手动查看。${PLAIN}"
    exit 1
fi

echo -e "\n${YELLOW}[1/2] 正在读取当前本地 ARP 缓存表...${PLAIN}"
# 提取 arp -n 中的有效 IP 和 MAC 地址,跳过 incomplete
ARP_ENTRIES=$(arp -n | awk '/^[0-9]/ && $3 != "(incomplete)" {print $1, $3}')

if [ -z "$ARP_ENTRIES" ]; then
    echo -e "${YELLOW}[INFO] 当前 ARP 缓存表为空或无有效记录。${PLAIN}"
    exit 0
fi

echo "$ARP_ENTRIES" | column -t

# 2. 检查 MAC 地址冲突 (是否存在一个 MAC 对应多个 IP)
echo -e "\n${YELLOW}[2/2] 分析是否存在 MAC 地址冲突 (中间人特征)...${PLAIN}"

# 提取 MAC 地址并统计出现次数,找出出现次数 > 1 的 MAC
DUPLICATE_MACS=$(echo "$ARP_ENTRIES" | awk '{print $2}' | sort | uniq -c | awk '$1 > 1 {print $2}')

if [ -n "$DUPLICATE_MACS" ]; then
    echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${PLAIN}"
    echo -e "${RED}[ALERT] 警告!检测到 MAC 地址冲突,极大概率遭遇 ARP 欺骗!${PLAIN}"
    echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${PLAIN}"

    for MAC in $DUPLICATE_MACS; do
        echo -e "\n${RED}异常 MAC 地址: ${MAC}${PLAIN}"
        echo -e "伪装了以下 IP:"
        echo "$ARP_ENTRIES" \vert{} grep -i "$MAC" | awk '{print " -> " $1}'

        # 简单判断是否包含网关 (假设网关通常是 .1 或 .254 结尾)
        if echo "$ARP_ENTRIES" \vert{} grep -i "$MAC" | awk '{print $1}' | grep -qE "\.1$\vert{}\.254$"; then
             echo -e "${YELLOW}[危险] 冲突 IP 中包含疑似网关地址!流量已被劫持。${PLAIN}"
        fi
    done
    echo -e "\n${YELLOW}建议操作: 立即执行 tcpdump -i  -e -n arp 抓包,并联络网络组隔离该 MAC。${PLAIN}"
else
    echo -e "${GREEN}[OK] 未发现多 IP 共享同一 MAC 的情况,当前 ARP 表无明显异常特征。${PLAIN}"
fi

echo -e "\n${BLUE}================================================================${PLAIN}"