共217行

ARP(Address Resolution Protocol),地址解析协议

2026-07-27 15:54:42

ARP 完整详解(通俗易懂,结合你 macOS 静态绑定场景)

一、ARP 全称

ARP = Address Resolution Protocol,地址解析协议
标准:RFC 826,工作在 TCP/IP 二层与三层之间(介于数据链路层 & 网络层)

一句话核心作用:
已知IP地址,查询对应的MAC物理地址

二、为什么需要 ARP?

局域网通信两套地址:

  1. IP地址(三层):逻辑地址,用来区分网段,可自由修改
    例:192.168.10.241
  2. MAC地址(二层):网卡硬件地址,烧录在网卡固件
    例:18:4a:53:24:da:f3

规则:

三、ARP 工作流程(局域网内)

假设你的 Mac(192.168.10.100)要访问 192.168.10.241

  1. Mac 先查本机 ARP缓存表:有没有保存该IP对应的MAC
  2. 没有记录 → 发送 ARP 请求(广播帧)

    广播:发给局域网所有设备 FF:FF:FF:FF:FF:FF
    内容:“谁是192.168.10.241?请把你的MAC地址告诉我!”

  3. 局域网所有主机收到广播,核对IP
  4. 目标设备匹配IP,回复 ARP应答(单播)

    “我是192.168.10.241,我的MAC=18:4a:53:24:da:f3”

  5. Mac 收到应答,写入 ARP缓存表,之后正常通讯

四、ARP缓存表是什么?

操作系统维护一张临时表格:IP <--> MAC <--> 网卡接口
你执行命令看到的就是缓存:

arp -a

缓存条目分两类:

  1. 动态ARP(默认)
    通过ARP广播自动学习得到,有老化时间(macOS一般20分钟左右)
    超时后自动删除,下次访问重新广播查询。

  2. 静态ARP(你正在配置的)
    管理员手动写入,不经过广播查询
    ✅ 用途:

五、ARP 相关重要概念(解释你遇到的报错)

1)ARP Proxy(ARP代理)

当一台设备收到ARP请求,目标IP不在本网段,设备代替目标回复ARP应答。

你最初报错:can only proxy for 192.168.10.241
原因:macOS arp -s(小写)容易被内核识别为创建ARP代理条目,而不是普通静态ARP。
解决方案:macOS 使用大写 arp -S + ifscope 指定网卡,强制普通静态条目。

2)ARP欺骗 / ARP中毒(静态ARP最常用防御场景)

攻击者发送伪造ARP应答:宣称网关IP对应的MAC是自己网卡。
局域网流量全部经过攻击者,实现抓包、断网。
绑定静态ARP就是最简单防御手段

六、不同系统 ARP 命令区别(重点!)

macOS(BSD 风格 arp)

# ❌ 小写s,容易生成proxy代理条目
arp -s IP MAC
# ✅ 大写S 创建标准静态ARP(推荐)
arp -S IP MAC ifscope 网卡名
# 查看缓存
arp -a
# 删除条目
arp -d IP ifscope en1

Windows

arp -a                  # 查看缓存
arp -s IP MAC           # 添加静态ARP(永久到重启)
arp -d IP               # 删除

Linux(Ubuntu/CentOS)

不推荐老旧 arp 命令,标准工具:

ip neigh show                     # 查看ARP表
ip neigh add IP lladdr MAC nud permanent dev eth0 #静态ARP

OpenWrt / BusyBox

arp -s 极易混淆代理与静态条目,统一使用 ip neigh

七、ARP 局限

  1. 只适用于同一个广播域(同一个局域网)
    跨路由器通信不使用ARP;跨网段依靠路由+网关。
  2. ARP报文无任何身份校验,天生容易被欺骗。
  3. 无法跨三层设备(路由器隔离广播,ARP广播不能穿过路由器)

八、延伸:ARP 和 RARP

九、结合你场景的总结

你在 macOS 绑定静态ARP目的:
强制系统永远使用 192.168.10.241 → 18:4a:53:24:da:f3不再发送ARP广播查询,杜绝伪造ARP应答干扰。
⚠️ 避坑要点再次汇总:

  1. macOS 用 arp -S 不要用 arp -s
  2. ifscope 后面填网卡名称(en0/en1),不能写MAC
  3. 绑定成功条目标记 [ethernet][proxy only] = 创建失败

macOS 静态ARP绑定 · 一页速查攻略(解决 proxy 报错)

一、核心避坑(必看)

二、快速确认网卡

查询本机网卡:

networksetup -listallhardwareports

常规对应:Wi-Fi=en0 | 有线网卡=en1(本次环境为 en1)

三、一键绑定(最终可用命令)

先清旧缓存、再绑定静态ARP(cannot locate 为正常提示,无需处理):

sudo arp -d 192.168.10.241 ifscope en1
sudo arp -S 192.168.10.241 18:4a:53:24:da:f3 ifscope en1

四、生效验证方法

arp -a | grep 192.168.10.241

五、删除静态ARP条目

sudo arp -d 192.168.10.241 ifscope en1

六、关键特性(精简)

七、常见报错速修

报错信息 问题原因 解决方案
ifscope has bad interface name ifscope 后填写了MAC地址 替换为网卡名 en0/en1
can only proxy for xxx 使用小写 arp -s 改用 arp -S + 指定网卡
条目显示 [proxy only] 内核误判为代理条目 删除条目后重新绑定

八、进阶:开机自动绑定(永久方案)

适配重启失效问题,开机自动加载静态ARP,全套一键执行:

# 1. 创建ARP绑定脚本
sudo tee /usr/local/bin/static_arp.sh <<'EOF'
#!/bin/zsh
arp -S 192.168.10.241 18:4a:53:24:da:f3 ifscope en1
EOF

# 2. 添加执行权限
sudo chmod +x /usr/local/bin/static_arp.sh

# 3. 创建开机守护进程
sudo tee /Library/LaunchDaemons/com.user.staticarp.plist <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.staticarp</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/static_arp.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/var/log/static_arp.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/static_arp.err</string>
</dict>
</plist>
EOF

# 4. 加载开机自启
sudo launchctl load /Library/LaunchDaemons/com.user.staticarp.plist

⚠️ 限制:网线拔插后仍会失效,需重新执行绑定

(注:部分内容可能由 AI 生成)