跳转至

ARP


简介

ARP(Address Resolution Protocol,地址解析协议)
通过ARP获取IP和MAC的映射关系。一般通过广播自己的IP和MAC,或查询远端IP的MAC
在IPv6中,NDP(邻居发现协议)代替ARP

ARP报文格式

arp

ARP报文字段 长度 描述
硬件类型 2字节 如以太网(0x0001)
协议类型 2字节 如网际协议(IP)(0x0800)、IPv6(0x86DD)
硬件地址长度 1字节 每种硬件地址的字节长度,一般为6(以太网)
协议地址长度 1字节 每种协议地址的字节长度,一般为4(IPv4)
操作码 2字节 1为ARP请求
2为ARP应答
3为RARP请求
4为RARP应答
源硬件地址 硬件地址长度决定,一般6字节 发送方MAC地址
源协议地址 协议地址长度决定,一般4字节 发送方IP地址
目标硬件地址 硬件地址长度决定,一般6字节 目标MAC地址
目标协议地址 协议地址长度决定,一般4字节 目标IP地址

免费ARP

主机主动将自己的MACIP信息广播到局域网
使用自己的IP地址作为目的IP地址发送ARP请求。

例如:192.168.1.7主动发送广播ARP(源&目的IP一致的ARP请求)
arp

免费ARP作用

  • 检测IP地址冲突

    当设备接口的协议状态变为Up时,设备主动对外发送免费ARP报文。 正常情况下不会收到ARP应答, 如果收到,则表明本网络中存在与自身IP地址重复的地址。 如果检测到IP地址冲突,设备会周期性的广播发送免费ARP应答报文,直到冲突解除。

  • 通告新的MAC地址

    更换了网卡后MAC地址变化了,送一个免费ARP刷新其他设备内的动态ARP表

  • 在VRRP备份组中用来通告主备发生变换

    发生主备变换后,MASTER设备会广播发送一个免费ARP报文来通告发生了主备变换。

ARP请求与应答

例如:
1.192.168.1.7通过广播ARP请求查询192.168.1.2的MAC地址
arp
2.192.168.1.2收到请求后,回复应答
arp 3.局域网网内设备不处理不是针对自己IP的请求。

ARP表

主机或三层网络设备(路由器)上会维护一张ARP表,用于存储IP地址和MAC地址的映射关系,
一般ARP表项包括动态ARP表项和静态ARP表项。

动态ARP表项

  • 由ARP报文自动生成和维护,
  • 可老化,
  • 可被新的ARP报文更新,
  • 可被静态ARP表项覆盖。 动态ARP适用于拓扑结构复杂、通信实时性要求高的网络。

静态ARP表项

手工添加的IP地址和MAC地址之间固定的映射关系。
静态ARP表项不会被老化,不会被动态ARP表项覆盖。

ARP老化

ARP高速缓存

为了避免每次通信前,都要发送ARP请求
每台主机或设备上都维护着一个高速ARP缓存
存放最近学习到的IP地址和MAC地址的映射关系

查表流程

主机每次发送报文时,
会先在本地高速缓存中查找目的IP地址所对应的MAC地址
如果查到,则不会再发送ARP请求报文,而是直接将报文发至这个MAC地址;
如果查不到,则广播发送ARP请求报文,进行ARP地址解析。

老化

由于缓存容量和ARP表项存活时间有限制
动态ARP表项进行老化更新

老化参数

  • 老化超时时间、
  • 老化探测次数
  • 老化探测模式

老化流程

动态ARP表项到达老化超时时间后,设备会发送老化探测报文(即ARP请求报文)
如果能收到ARP应答报文,则更新该动态ARP表项
如果若干次请求后仍没有收到ARP应答报文,则删除该动态ARP表项。

设备发送的老化探测报文可以是单播报文,也可以是广播报文。
缺省情况下,设备只在最后一次发送ARP老化探测报文是广播模式,其余均为单播模式发送。
当对端设备MAC地址不变时,可以配置接口以单播模式发送ARP老化探测报文。
当接口Down时(arp请求回复ICMP不可打消息)设备会立即删除相应的动态ARP表项。

linux ARP相关命令

Bash
1
2
3
4
#管理arp缓存
arp
#发送arp请求
arping

linux下多个网口默认不能使用同网段IP

由于linux系统里,所有网口默认共用一张路由表
如果两个网口同网段,从一个口出去的报文会被路由到另一个网口出去

Linux内核ARP参数

arp_announce

控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址

参数

  • 0:(默认)本机所有IP地址都向任何一个接口发送请求ARP报文。
  • 1:尽量仅向该网卡上的IP作为ARP报文源IP
  • 2:只向该网卡回应与该网段匹配的ARP报文。

arp_ignore

定义对目标地址为本机IP的ARP请求消息的应答模式。

参数

  • 0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
  • 1:只响应目的IP地址为接收网卡上的本地地址的arp请求。
  • 2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
  • 3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
  • 4~7:预留。
  • 8:不回应所有的arp请求。

修改方法

修改/proc文件系统:

Bash
1
2
3
4
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "1">/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
echo "2">/proc/sys/net/ipv4/conf/eth0/arp_announce

使用sysctl -w直接写入内存

Bash
1
2
3
4
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.eth0.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.eth0.arp_announce=2

写入配置文件

Bash
1
2
3
4
5
6
7
#修改/etc/sysctl.conf,
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.eth0.arp_announce=2
#刷新到内存
sysctl -p

备注

arp_ignorearp_announce参数分别有all,default,lo,eth0等对应不同网卡。
当all和具体网卡的参数值不一致时,配置为较大值的生效。
一般只需修改all和某个具体网卡的参数即可。