如何在 Linux 上添加或删除静态 ARP 条目
ARP(“地址解析协议”的缩写)是一种网络协议,用于将 IP 网络地址映射到相应的硬件 MAC 地址。当主机X
想要与主机Y
通信时,X
首先在其本地网络上广播ARP请求以获取Y
的MAC地址。一旦X
收到包含Y
的MAC地址的ARP回复,X
使用该信息构造发往Y
的以太网帧。
将得到的IP/MAC地址映射信息缓存在本地ARP表中,从而可以省略后续的ARP查询过程。
无论出于何种原因,当主机 X
未收到其希望与其通信的目标主机 Y
的 ARP 回复时,就会出现问题。在其他情况下,ARP 回复会传入,但包含与错误主机 Z
关联的 MAC 地址。这种损坏的 ARP 回复将导致流量劫持,本应发送到 Y
的流量最终到达主机 Z
。
在处理此类由 ARP 引起的异常情况时,能够在本地缓存的 ARP 表上手动添加静态 ARP 条目非常有用。当本地 ARP 表中找到目的主机 Y
的 MAC 地址时,无需发送 ARP 请求。
将静态 ARP 条目添加到本地 ARP 表
$ sudo arp -s 10.0.0.2 00:0c:29:c0:94:bf
上述命令告诉本地 ARP 表,IP 地址为 10.0.0.2
的主机具有 MAC 地址00:0c:29:c0:94:bf
。配置静态 ARP 条目后,您可以验证这一点。
$ arp -a -n
? (192.168.10.47) at e0:db:55:ce:13:f1 [ether] on eth0
? (192.168.10.1) at 00:e0:b1:cb:07:30 [ether] on eth0
? (10.0.0.2) at 00:0c:29:c0:94:bf [ether] PERM on eth1
如上所示,静态配置的 ARP 条目正确显示,在 ARP 表中标记为 PERM
。
从本地 ARP 表中删除静态 ARP 条目
$ sudo arp -d 10.0.0.2
$ arp -a -n
? (135.112.29.47) at e0:db:55:ce:13:f1 [ether] on eth0
? (135.112.29.1) at 00:e0:b1:cb:07:30 [ether] on eth0
? (10.0.0.2) at <incomplete> on eth1
在 Linux 上永久添加静态 ARP 条目
请注意,像上面这样在运行时由 arp
命令添加的任何 ARP 条目在重新启动后不会持续保留。为了永久添加静态 ARP 条目,您可以做的是在网络接口启动时自动从外部文件加载 ARP 条目。为此,首先创建一个包含静态 ARP 条目的文件。
$ sudo vi /etc/ethers
00:0c:29:c0:94:bf 10.0.0.2
00:0c:59:44:f0:a0 10.0.0.5
. . . .
arp
命令允许您使用 -f
选项加载任何外部文件。
$ sudo arp -f /etc/ethers
现在,您需要将上述命令设置为在给定网络接口(例如 eth0
)启动时自动运行。有特定于发行版的方法来运行网络接口的启动命令。以下是特定于发行版的示例。
这里我假设您没有在 Linux 系统上使用网络管理器。因此,如果您正在使用网络管理器,则必须先将其禁用。
在 Ubuntu、Debian 或 Mint 上,在 /etc/network/interfaces
中添加以下条目:
iface wlan0 inet dhcp
. . .
post-up arp -f /etc/ethers
在 CentOS、RHEL 或 Fedora 上,创建以下可执行脚本,如本教程中所述:
$ sudo vi /sbin/ifup-local
#!/bin/sh
if [[ "$1" == "eth0" ]]
then
arp -f /etc/ethers
else
#DO_NOTHING
fi
使脚本可执行:
$ sudo chmod +x /sbin/ifup-local