arp_ignore=1与arp_filter=1之争

众所周知,内核网络配置参数arp_ignore=1可实现与arp_filter=1一样的功能,都能解决多网卡同子网ip时的多次arp响应 问题。那么到底应该使用哪个配置呢?

结论

使用arp_ignore=1arp_filter=1主要用来防攻击,比如可过滤sip不规范的arp报文,如跨网段的arp报文。

原因

arp_ignore=1开销小,可实现各网卡响应各自ip的arp请求。
arp_filter=1开销大一些(查路由表),且只解决重复arp响应问题,难以实现各网卡响应各自ip的arp请求。虽在同子网多网卡场景生效,但固定一个网卡响应arp请求,因路由结果。要实现各网卡响应各自ip的arp请求,需深度配置route路由表,配合ip rule使用,参考linux - 2 NICs 2 IPS same subnet - Server Fault。

arp_filter=1含义:sip的路由出口为本网卡才进一步处理。arp_filter是源地址校验,是rp_filter的arp版本的补充。
arp_ignore=1含义:dip为本网卡ip才响应。

内核代码分析

// arp_ignore
static int arp_ignore(struct in_device *in_dev, __be32 sip, __be32 tip) {
    ...
    return !inet_confirm_addr(in_dev, sip, tip, scope);  // 这里只要dip是否是网卡ip
}

// arp_filter
static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)
	rt = ip_route_output(net, sip, tip, 0, 0);  // 查路由

你可能感兴趣的:(网络)