Set Up Static ARP Table Entry
前不久,由于需要对局域网内的各个主机配置静态 ARP 缓存列表,重新学习了 ARP 相关知识,记录如下。
ARP 协议
简介
ARP,即 Address Resolution Protocol 地址解析协议。在给定 IP 地址时,用于解析目标主机的 MAC(Media Access Control) 物理地址,是数据链路层协议。
ARP Cache,ARP 缓存,是包含一条或者多条 IP 地址到 MAC 地址的映射表项(Table Entry)的列表,存储的是目标主机到其网络邻居的网络与物理地址映射,包括网关的地址映射信息。
ARP 工作过程
假设主机 A 和 B 在同一网段,主机 A 需要向主机 B 发送数据,则具体的地址解析过程如下:
- 主机 A 首先查询自己的 ARP 缓存列表是否存在主机 B 的 IP 和 MAC地址映射。存在,则直接依据映射关系对 IP 数据包进行帧封装,并向主机 B 发送数据帧;否则,在同网段广播目标地址为主机 B 的 IP、目标 MAC 地址为全 0 的「ARP 请求」报文。
- 同网段的其他主机收到「ARP 请求」报文后,比对请求报文中的目标 IP 地址。和本机 IP 不同,则直接丢弃;相同,则向主机 A 发送携带自身 IP 和 MAC 地址映射关系的单播 「ARP 响应」报文。
- 主机 A 收到主机 B 的响应报文后,更新自己的 ARP 缓存列表,接着依据此映射关系向主机 B 发送数据帧。
- 根据主机 A 中配置的 ARP 表项生存时间,在生存时间计时结束后,重复上述过程。
ARP 欺骗攻击
ARP 协议是建立在网络中各个主机互相信任基础上的,网络中的主机可自主发送 ARP 响应报文,其他主机收到响应报文时不检测该报文的真实性即将其记入本机 ARP 缓存中。
因此,攻击者可以通过向某一受害主机发送伪造的 ARP 响应报文,使受害者主机向对应 IP 地址发送的信息实际无法到达预期主机,这就是 ARP 欺骗(MAC spoofing)攻击。
在局域网中,攻击者可以通过持续性地向网关发送 ARP 报文,冲击网关的 ARP 缓存,从而可以用自身的 MAC 地址替代受害者主机 ARP 映射关系表项中的 MAC 地址。这种情况下,会使得受害者主机断网,过程如下所示1。
- 首先,查询网关和受害者主机的 IP 地址
网关的 IP 地址为 192.168.135.2
,受害者主机的 IP 地址为 192.168.135.131
。
- 在 Kali-Linux 中,使用
arpspoof
命令冲击网关的 ARP 缓存
arpspoof -i eth0 -t 192.168.135.131 192.168.135.2
- 过一小段时间后,受害者主机被断网
若攻击者同时对受害者主机发起 ARP 欺骗,那么就可以在网关和受害者主机之前插入恶意第三方,截获彼此的通信流量,实现对受害者主机网络数据包的监听。比如,早期的盗号木马便使用这种攻击手段。
一种比较简单的防御方法是在网关和局域网各主机上配置静态 ARP 表项,并将表项设置为不老化更新。
ARP 表的更新和老化2
ARP 表的更新条件
实际环境中,只有同时满足以下两个条件,设备的 ARP 表项才会更新:
- 设备收到来自某个 IP 的 「ARP 请求」包或者是「免费 ARP 3」包
- 设备现有的 ARP 表项中已经存在该 IP 对应的 ARP 表项
ARP 表的老化时间
不同的系统,ARP 表项的老化时间设定不太一样,2分钟、5分钟、20分钟都有,还可以设置永不超时。在大多数实现中4,完整表项的超时为20分钟,而不完整表项5的超时为3分钟。请参考文档进行配置。
ARP 表老化时间定时器的重置
满足一下任一条件,设备的 ARP 表项的老化时间定时器便会重置:
- 设备的 ARP 表项更新
- 设备调用(引用)ARP 表项转发数据后
单条静态 ARP 表项的添加和删除
Windows
- 添加:
arp /s <inetaddr> <etheraddr> [<ifaceaddr>]
其中,inetaddr
是目标 IP 地址;etheraddr
是目标 MAC 地址;ifaceaddr
表示本机指定的网络接口,这里用其 IP 地址指代。
此命令将一条静态表项添加到 ARP 缓存,指定 IP 地址 inetaddr
到 MAC 地址 etheraddr
的映射;或者使用 ifaceaddr
参数为指定接口添加静态表项。
/s
参数添加的表项不会从 ARP 缓存中退出6,该表项将被保存至计算机重新启动。
示例如下,此命令需要管理员权限:
arp /s 10.0.0.80 10-AB-00-4F-2A-9C
- 删除:
arp /d <inetaddr> [<ifaceaddr>]
arp /d 10.0.0.80
Linux
- 添加:
arp [-i <if>] -s <hostname> <hw_addr>
if
参数指定网络接口,例如:eth0
;hostname
参数指定 IP 地址或者使用对应主机名指代;hw_addr
指定 MAC 地址。
示例如下:
arp -i eth0 -s 192.168.1.6 ff:ee:ee:ee:ee:ee
- 删除:
arp -d <hostname>
arp -d 192.168.1.6
ARP 表项的批量添加
Windows
Windows 没有静态 ARP 缓存的批量导入机制,官方文档6给出的方法是使用 .bat
批处理文件配置。
若需要永久化静态表项,可以为批处理文件设置开机启动。在 Win10 中,有开机启动目录 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
,将批处理文件放置在此文件夹中即可开机启动脚本。
Linux
arp -f <filename>
Linux 可以从文件中读取并添加 ARP 表项,使用参数 -f
从配置文件中读取 IP 和 MAC 地址对参数,通常习惯将地址对参数保存在 /etc/ethers
文件中。
配置文件中的表项格式要求如下7:
hostname MACaddress [temp] [pub]
temp
:若未声明 temp
参数,ARP 表项将永久存储于 ARP 缓存中,不会老化。否则,此表项在 ARP 缓存中会到期老化,然后被删除。
pub
:若声明此参数,该表项会被公开发布出去。即该主机会在响应「ARP 请求」报文的时候,同时反馈 pub
声明的表项,即使该表项中的 IP 地址并不是本机自身的 IP 地址。
Linux 中的静态 ARP 表项永久化设置如下所示8:
- CentOS
使用管理员权限创建一个脚本:
vim /sbin/ifup-local
其内容如下:
#!/bin/bash
arp -f /etc/ethers
然后赋予其执行权限:
chmod +x /sbin/ifup-local
计算机重启后,此脚本会在网卡启动时执行。
- Ubuntu9
使用管理员权限编辑文件 /etc/rc.local
:
vim /etc/rc.local
添加内容如下:
#!/bin/bash
arp -f <ip_addr> <mac_addr>
exit 0
或者从文件读取地址对信息
#!/bin/bash
arp -f /etc/ethers
exit 0
然后赋予脚本执行权限:
chmod +x /etc/rc.local
无线网卡的 MAC 地址随机化
网络适配器的硬件地址实际是在网络设备制造商生产时已经写入硬件内部,MAC 地址在世界范围内是唯一标识的。MAC 地址长度一般为 6 个字节,也就是 48 比特。其前 24 位是由厂商向 IEEE 申请的厂商地址,后24位是由厂商自行分配。
自从无线网卡大规模应用以来,计算机或者移动电话在连接到公共无线网络的时候,就存在暴露这个唯一标识的 MAC 地址的风险。而通过「硬件地址随机化」,可降低隐私泄露风险,在你的电脑扫描网络并连接时便难以对你进行跟踪。
移动电话一般默认开启此项功能,计算机需要在接入网络的时候主动配置10。
拓展阅读
- 计算机网络基础知识总结
- ARP 协议小结
- 彻底搞懂系列之:ARP 协议
- Linux 实现的 ARP 缓存老化时间原理解析
- Win10 上的 MAC 地址随机化运行机制
- Ubuntu20.04 下 MAC 地址随机化
- MAC Address Randomization: Privacy at the Cost of Security and Convenience