1. 写在前面
Address Resolution Protocol (ARP) 处理 Internet Protocol (IP) 地址和 Media Access Control (MAC)地址之间的映射。Linux 将所有此类映射存储在本地系统缓存中,称为 ARP 表。
在本教程中,我们将探讨显示和控制 ARP 表的主要 Linux 命令:
首先,我们简要介绍 ARP 缓存和由此产生的表结构。接下来,我们安装一个工具来管理这个结构。之后,我们将讨论显示 ARP 表的方法。随后,我们将解释代理 ARP 和缓存过滤。最后,我们将深入探讨创建和删除 ARP 缓存条目。
2. ARP 缓存
在 IPv4 中,当主机需要和目标主机通信时,必须先通过 ARP 协议获得目的主机的链路层地址(ARP 将 IP 映射到 MAC 地址)。因此它与 IPv4 一起在开放系统互连(OSI)模型的第 2 层(数据链路层)和第 3 层(网络层)之间工作。
在 IPv6 中,同样需要从 IP 地址解析到链路层地址的功能。NDP(Neighbor Discovery Protocol)协议实现了这个功能。
NDP(Neighbor Discovery Protocol)是 IPv6 协议体系中一个重要的基础协议。NDP 协议替代了 IPv4 的 ARP(Address Resolution Protocol)和 ICMP 路由器发现(Router Discovery)。这里就不展开介绍。
除了处理映射,ARP 还允许通过请求发现网络上的主机。事实上,我们可以通过 arping
命令将 ARP 用作第 2 层的 ping
。
一旦我们通过读取响应或广播看到任何主机,本地 ARP 缓存就会以表格的形式存储数据:
+--------------+-------------------+
| IP Address | MAC Address |
+--------------+-------------------+
| 192.168.1.2 | DE-AD-BE-EF-06-66 |
| 192.168.1.3 | FE-ED-1D-EA-F0-10 |
| 192.168.1.4 | 01-00-01-BE-E0-01 |
+--------------+-------------------+
通常,Linux ARP 表可通过 /proc/net/arp
文件获取:
root@dev:~# cat /proc/net/arp
-------------------------------------------------------------------------------------
IP address HW type Flags HW address Mask Device
172.20.0.3 0x1 0x2 02:42:ac:14:00:03 * br-2c9e6051f755
10.100.0.1 0x1 0x2 08:4f:a9:7c:5d:51 * ens3
172.20.0.2 0x1 0x2 02:42:ac:14:00:02 * br-2c9e6051f755
172.20.0.5 0x1 0x2 02:42:ac:14:00:05 * br-2c9e6051f755
172.20.0.10 0x1 0x2 02:42:ac:14:00:0a * br-2c9e6051f755
10.100.0.11 0x1 0x2 fa:16:3e:4a:e1:14 * ens3
172.20.0.13 0x1 0x2 02:42:ac:14:00:0d * br-2c9e6051f755
172.20.0.9 0x1 0x2 02:42:ac:14:00:09 * br-2c9e6051f755
172.20.0.7 0x1 0x2 02:42:ac:14:00:07 * br-2c9e6051f755
注意:上述表格中的 MAC 地址与 /proc/net/arp
MAC 地址有不同的分隔符,这两种分隔符都有效,取决于工具和上下文。
3. 如何使用 arp ?
3.1 安装
安装:许多 Linux 发行版都包含 arp
,也可通过以下命令进行安装:
# Debian and Ubuntu systems
sudo apt-get install net-tools
# CentOS and similar OSs
sudo yum install net-tools
3.2 语法
基本语法:arp [-vn] [-H type] [-i if] [-ae] [hostname]
常用参数:
参数 | 描述 |
---|---|
-a | 显示所有条目 |
-d | 删除指定条目 |
-D | 使用硬件地址 |
-e | 设置显示风格 |
-f | IP地址与MAC地址静态映射 |
-g | 显示ARP缓存列表 |
-H | 设置地址类型 |
-i | 设置网络接口 |
-n | 使用数字方式显示条目 |
-v | 显示执行过程详细信息 |
–version | 显示版本信息 |
4. 通过 arp 显示 ARP 表
要显示 ARP 缓存中的当前条目,只需运行 arp
(不带任何参数)或 -e
:
root@dev:~# arp
-------------------------------------------------------------------------------------
Address HWtype HWaddress Flags Mask Iface
172.20.0.3 ether 02:42:ac:14:00:03 C br-2c9e6051f755
_gateway ether 08:4f:a9:7c:5d:51 C ens3
172.20.0.2 ether 02:42:ac:14:00:02 C br-2c9e6051f755
172.20.0.5 ether 02:42:ac:14:00:05 C br-2c9e6051f755
172.20.0.10 ether 02:42:ac:14:00:0a C br-2c9e6051f755
10.100.0.11 ether fa:16:3e:4a:e1:14 C ens3
172.20.0.13 ether 02:42:ac:14:00:0d C br-2c9e6051f755
172.20.0.9 ether 02:42:ac:14:00:09 C br-2c9e6051f755
172.20.0.7 ether 02:42:ac:14:00:07 C br-2c9e6051f755
与前面的示例不同,实际 arp
表有更多字段:
• Address, 设备的 IPv4 地址;
• HWtype, 链路类型,其中 ether 表示以太网,
支持:ash(Ash), ether(Ethernet),
ax25(AMPR AX.25), netrom (AMPR NET/ROM),
rose (AMPR ROSE), arcnet (ARCnet),
dlci (Frame Relay DLCI),
fddi (Fiber Distributed Data Interface),
hippi (HIPPI), irda (IrLAP),
x25 (generic X.25), eui64 (Generic EUI-64);
• HWaddress, 设备的 MAC 地址;
• Flags, 一个或多个:C (complete)、 M (permanent)、P (published);
C(complete)表示我们的 ARP 查询得到了响应,主机条目已完全配置;
M(permanent),即静态条目,不会过期,通常是手动添加的,但不使用临时参数;
P (published),标记条目与代理 ARP 有关;
• Mask, 可选 IPv4 掩码(netmask);
• Iface, 本地接口;
通过 -a
参数,输出 BSD 风格的列表,更容易解析:
root@dev:~# arp -a
-------------------------------------------------------------------------------------
? (172.20.0.3) at 02:42:ac:14:00:03 [ether] on br-2c9e6051f755
_gateway (10.100.0.1) at 08:4f:a9:7c:5d:51 [ether] on ens3
? (172.20.0.2) at 02:42:ac:14:00:02 [ether] on br-2c9e6051f755
? (172.20.0.5) at 02:42:ac:14:00:05 [ether] on br-2c9e6051f755
? (172.20.0.10) at 02:42:ac:14:00:0a [ether] on br-2c9e6051f755
? (10.100.0.11) at fa:16:3e:4a:e1:14 [ether] on ens3
? (172.20.0.13) at 02:42:ac:14:00:0d [ether] on br-2c9e6051f755
? (172.20.0.9) at 02:42:ac:14:00:09 [ether] on br-2c9e6051f755
? (172.20.0.7) at 02:42:ac:14:00:07 [ether] on br-2c9e6051f755
5. Proxy ARP
虽然不建议使用代理服务器,但我们可以指定一个代理服务器来处理对本地网络以外 IP 地址的请求。这样,代理服务器就会用自己的 MAC 地址来响应对其范围内任何此类 IP 地址的 ARP 请求。
arp 192.168.6.68
Address HWtype HWaddress Flags Mask Iface
192.168.6.68 ether 08-00-08-EB-E0-68 CP 255.255.255.0 eth0
通过掩码,显示 Proxy IP 地址范围。从 Linux 内核 2.2.0 版开始,默认情况下不允许整个子网的 ARP 条目。
6. arp 过滤
使用 HWtype (-H)
或 Iface (-i)
字段来过滤结果。
• -H for HWtype
• -i for Iface
root@dev:~# arp -H ether
-------------------------------------------------------------------------------------
Address HWtype HWaddress Flags Mask Iface
172.20.0.3 ether 02:42:ac:14:00:03 C br-2c9e6051f755
_gateway ether 08:4f:a9:7c:5d:51 C ens3
172.20.0.2 ether 02:42:ac:14:00:02 C br-2c9e6051f755
172.20.0.5 ether 02:42:ac:14:00:05 C br-2c9e6051f755
172.20.0.10 ether 02:42:ac:14:00:0a C br-2c9e6051f755
10.100.0.11 ether fa:16:3e:4a:e1:14 C ens3
172.20.0.13 ether 02:42:ac:14:00:0d C br-2c9e6051f755
172.20.0.9 ether 02:42:ac:14:00:09 C br-2c9e6051f755
172.20.0.7 ether 02:42:ac:14:00:07 C br-2c9e6051f755
-H
标志的参数可以是 ether
(以太网)、arcnet
、pronnet
、ax25
和 netrom
等;
root@dev:~# arp -i ens3
-------------------------------------------------------------------------------------
Address HWtype HWaddress Flags Mask Iface
_gateway ether 08:4f:a9:7c:5d:51 C ens3
10.100.0.11 ether fa:16:3e:4a:e1:14 C ens3
或者,通过 address
字段向 arp
过滤器提供地址:
root@dev:~# arp 172.20.0.2
-------------------------------------------------------------------------------------
Address HWtype HWaddress Flags Mask Iface
172.20.0.2 ether 02:42:ac:14:00:02 C br-2c9e6051f755
在这里,我们只能看到我们请求的条目。
7. 使用 arp 处理 ARP 条目
我们也可以使用 arp
来修改 ARP 表。
7.1 添加单个 ARP 条目
要在 ARP 表中手动加入一个简单条目,我们使用 -s:
$ arp -s 192.168.6.99 10:99:90:BE:EF:99
$ arp 192.168.6.99
Address HWtype HWaddress Flags Mask Iface
192.168.6.99 ether 10:99:90:BE:EF:99 CM eth0
没有使用临时指定符,因此 Flags 字段现在包含了 M 永久标记。如果我们想使用自己的 MAC 地址,那么 -D
标志与本地接口相结合,就可以取代 HWaddr
条目。这对代理 ARP 很有用。也可以通过 -H
指定 HWtype
,通过 -i
指定 Iface
。
示例:
$ arp -v -i eth0 -H ether -s 192.168.6.100 10:99:90:BE:E1:00
arp: SIOCSARP()
$ arp -v 192.168.6.100
Address HWtype HWaddress Flags Mask Iface
192.168.6.100 ether 10:99:90:BE:E1:00 CM eth0
Entries: 3 Skipped: 2 Found: 1
这里为条目指定接口和硬件地址类型,同时使用 -v
显示执行过程详细信息。verbosity
会显示任何函数调用(SIOCSARP())以及其他信息。
7.2 添加多个 ARP 条目
当涉及许多 ARP 条目时,文件可能是一种更简便的添加方法。首先,我们以预定义的格式创建文件:
HOST_OR_IP MAC_ADDRESS [temp,pub] [netmask NETMASK]
接下来,我们使用 -f
选项,告诉 arp
使用提供的文件路径作为每个映射的源代码。
示例:
$ cat /arps
192.168.6.66 DE-AD-BE-EF-06-66 temp
192.168.6.10 FE-ED-1D-EA-F0-10
192.168.6.1 01-00-01-BE-E0-01
$ arp -v
Entries: 0 Skipped: 0 Found: 0
$ arp -f /arps
$ arp -v
Address HWtype HWaddress Flags Mask Iface
192.168.6.66 ether DE-AD-BE-EF-06-66 C eth0
192.168.6.10 ether FE-ED-1D-EA-F0-10 CM eth0
192.168.6.1 ether 01-00-01-BE-E0-01 CM eth0
Entries: 3 Skipped: 0 Found: 3
7.3 删除 ARP 条目
要从系统 ARP 表中删除映射,我们需要使用 -d 标志,并至少包含一个主机名或 IP 地址:
$ arp -d 192.168.6.100
? (192.168.6.100) at 10:99:90:be:e1:00 [ether] PERM on eth0
$ arp -d 192.168.6.100
$ arp 192.168.6.100
arp: in 2 entries no match found.
这里,验证主机 192.168.6.100 的 ARP 条目是否存在,然后将其删除并确认操作结果。和其他操作一样,我们可以用 -i
指定条目的接口。
8. 小结
在本文中,我们浅浅的介绍了下 arp
命令及其选项。总之,虽然 Linux 内核会在 /proc/net/arp
中提供 ARP 信息,但我们可以使用 arp
工具以更人性化的方式显示和修改 ARP 表。
后续将会进一步详细介绍ARP:动态ARP、静态ARP、ARP老化机制、ARP报名等。
感谢您花时间阅读文章!
收藏本站不迷路!
原文始发于微信公众号(滑翔的纸飞机):Linux 中的 arp 命令(附示例)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/260876.html