proxy_arp和arp_filter用来控制是否对arp请求作出响应,在正常情况下,如果收到arp请求,且请求的ip地址为网卡自身的ip地址时都会回复。那么当ip地址不是网卡自身的ip地址时是否进行回复则取决于这两个参数的配置,使用网卡自身的mac地址回复。两个参数的官方文档解释如下:
arp_filter
- 1 – 允许主机上拥有同一个子网的多个网卡,对于每个接口上收到的arp请求是否进行回复取决于当本机向发出arp请求的那个客户端的源ip发数据包时,这个数据包是否会从当前接收到请求的接口发出。如果是则回复,否则不回复。
- 0 – 本机有那个ip地址的话则会回复(其实是看路由,网卡配置ip地址后再local表里自动创建一条路由)。
proxy_arp
- 是否开启arp代理,开启arp代理的话则会以自己的mac地址回复arp请求,0为不开启,1则开启。
在开启了proxy_arp的情况下,如果请求中的ip地址不是本机网卡接口的地址:但是有该地址的路由,则会以自己的mac地址进行回复;如果没有该地址的路由,不回复。
如果开启了arp_filter,请求中的ip地址是本机接口的地址:如果且当我们向发起arp请求的客户端回复的包也通过当前网卡出去的话则进行回复;如果回包时不走当前网卡则不会进行回复。
下面通过一小段命令来测试,首先准备一个veth-pair和netns。
ip netns add test1
ip link add name veth0 type veth peer name host-veth0
ip link set host-veth0 up
ip link set veth0 netns test1
ip netns exec test1 ip link set veth0 up
ip netns exec test1 ip addr add 10.0.0.1 dev veth0
ip netns exec test1 ip route add default dev veth0
ip link add dummy0 type dummy
ip link set dummy0 up
ip addr add 10.0.0.6 dev dummy0
ip route add 10.0.0.9 dev eth0
因为默认路由路由了所有其他ip地址,为了避免默认路由的影响,先将我们自己的ip地址加入路由表,然后删除默认路由,要不删除默认路由后我们连接不上主机了。
# 这个221.x.x.x是我电脑在isp分配的公网地址,需要把原来的default替换为221.0.0.0/8
# 以确保测试开始之前主机上没有到10网段的路由规则(我们主机网段是192)
ip route add 221.0.0.0/8 dev eth0
ip route delete default
设置arp_filter为0或1以及10.0.0.1的路由是否为host-veth0的4种组合情况测试:ip netns exec test1 arping 10.0.0.6。
设置proxy_arp为0或1以及是否有10.0.0.9的路由规则4种组合情况测试: ip netns exec test1 arping 10.0.0.9。