网络基础:ARP 相关内核参数
文章目录
序
linux 中包含以下 arp 相关的参数,其中 name 可以替换未 all、default、具体设备名称三种。用户创建网络设备时使用 default 参数的值作为设备参数的默认值。当全局参数和网卡参数不同时,取其中较大的值生效。
- net.ipv4.conf.{all,default,interface}.arp_accept
- net.ipv4.conf.{all,default,interface}.arp_announce
- net.ipv4.conf.{all,default,interface}.arp_filter
- net.ipv4.conf.{all,default,interface}.arp_ignore
- net.ipv4.conf.{all,default,interface}.arp_notify
- net.ipv4.conf.{all,default,interface}.drop_gratuitous_arp
- net.ipv4.conf.{all,default,interface}.proxy_arp
- net.ipv4.conf.{all,default,interface}.proxy_arp_pvlan
1. arp_accept
arp_accept参数控制:当 IP 地址不存在于ARP table时,是否通过Gratuitous ARP更新ARP table。 需要注意:当 IP 地址已经存在于ARP table时,无论是否arp_accept开启, Gratuitous ARP都会更新 ARP table。
- 取值 0:不在ARP table中创建对应 IP 地址的表项
- 取值 1:在ARP table中创建对应 IP 地址的表项
2. arp_announce
arp_announce对网络接口上发出的 ARP 请求包中的源 IP 作出相应的限制。 参考《网络基础:深入ARP协议》我们可以知道:在系统准备通过网卡发送一个 IP 数据包前,该 IP 数据包的源 IP 地址和目标 IP 地址通常是已经知道的,同时发送的网卡也已经确定(即源 MAC 已经确定),此时系统可能需要通过 ARP 请求数据包获取目标 MAC 地址。结合 ARP 报文结构,我们知道,发送 ARP 请求数据包时需要包含发送方 IP 地址,该 IP 地址应该是什么呢?大家可能想当然的以为就是要发送的 IP 数据包的源 IP 地址,其实这个是不一定的,尤其是主机有多个网络接口和 IP 地址时,而arp_announce参数的作用正是:根据 IP 数据包的源 IP 地址,决定 ARP 请求包中的源 IP 地址。为了方便理解,我们将这IP 数据包和 ARP 数据包的源 IP 分别记录为 SIP,ArpSIP,将发送 ARP 的网卡 IP 记录为 HIP。
- 取值 0:主机会在每个网络设备上都发送 ARP 请求,如果 SIP 与 HIP 不同, 则使用 SIP 作为 ArpSIP。
- 取值 1:主机只在 HIP 和 SIP 属于同一子网的网卡发送 ARP 请求,并使用 HIP 作为 ArpSIP。如果没有找到满足条件的网卡,那么将采用级别2的方式来进行处理。
- 取值 2:在此模式下将忽略 SIP,并尝试选择能与对端 IP 地址通信的网卡发送 ARP 请求,这种情况下使用 HIP 作为 ArpSIP。内核根据路由表信息,将优先选择和对端 IP 同一个子网的网卡发送报文。如果没有合适的网卡,将选择默认路由对应的网卡。 PS:关于 arp_announce 参数含义的解释,我在网上找了很多但是说明的都不太一样。这里的叙述只是我自己的理解。
3. arp_ignore
arp_ignore定义了对目标地址为本机 IP 的 ARP 请求的不同应答模式。为了方便说明不同的应答模式,我们假设服务器上有 eth0(192.168.0.1/24)和 eth1(10.1.1.1/24)两张网卡。
- 取值 0:回应任何网络接口上对任何本机 IP 地址的 ARP 查询请求。eth0 收到对 10.1.1.1 和 192.168.0.1 的 ARP 查询都会给出回应。当然 eth0 给出的回应报文中使用的是自己的 MAC 地址。
- 取值 1:只回答目标 IP 地址是本机上来访网络接口 IP 地址的 ARP 查询请求 。eth0 只会回应对 192.168.0.1 的查询,而对 10.1.1.1 的 arp 查询不会回应。
- 取值 2:在模式 1 的基础上,要求 ARP 请求报文中,ARP 报文的源地址 IP 必须和响应网卡在同一个子网。eth0 只会回应对 192.168.0.1 的查询,并且要求请求的 ARP 报文中,源地址 IP 在 192.168.0.1/24 子网中。
- 取值 3:如果 ARP 请求的 IP 地址在本机的作用域(scope)为主机(host),则不回应 ARP 响应数据包,如果作用域为全局(global)或链路(link),则回应 ARP 响应数据包。(PS:此处的作用域指的应该是网卡本地路由的中作用域)
- 取值 8:不回应所有 ARP 查询。
4. arp_filter
arp_filter参数用来控制是否对 ARP 请求作出响应。在正常情况下,网卡如果收到 ARP 请求,且请求 IP 为网卡对应的 ip 地址时,网卡会使用自己的 MAC 回应这个 ARP 请求。那么当 IP 不是网卡自身的 IP 地址时,是否进行回复则取决于该参数。
- 取值 0:默认配置,当 ARP 请求的 ip 地址属于本机时,将回应 ARP 请求。此时如果服务器中,多张网卡接入在同一个子网中,那么进行 ARP 请求的 Client 会收到多个 IP 地址。
- 取值 1:对于网卡收到的 ARP 请求是否进行回复取决于:ARP 响应的数据包是否会从接收到请求的接口发出(通过路由表判断),如果请求和响应使用的网卡不一致,那么不会发送回复。
5. arp_notify
arp_notify参数控制:当网络设备启动或者硬件地址变化时,是否自动发送Gratuitous ARP请求。
- 取值 0:不发送请求
- 取值 1:自动发送请求
6. drop_gratuitous_arp
drop_gratuitous_arp参数顾名思义,即指定网卡丢弃所有 Gratuitous ARP 数据包。默认该配置是关闭的。
7. proxy_arp
proxy_arp参数控制:如果请求中的 IP 地址不是本机网卡接口的地址,但是有该地址的路由,则会以自己的 MAC 地址进行回复。如果没有该地址的路由,不回复。 可以通过下面的命令验证该参数的效果:
|
|
上述命令创建了一个 dummy 设备,并且为这个设备绑定了一个虚假的路由。当为一个网口开启 proxy_arp 后,在局域网中对 10.233.84.80 进行 arping 将返回 ens4 的 MAC 。 需要注意,网卡开启 arp_filter 是不会影响 proxy_arp 的!
8. proxy_arp_pvlan
Private VLAN 场景相关的参数。
参考
文章作者 yoaz
上次更新 2023-06-27
许可协议 MIT