linux内核本身支持ipv6 neigh proxy代理功能
目前用到的场景为:
作为路由器设备,WAN侧IPv6 PD没有正常分配的情况下,路由器给LAN侧设备提供的IPv6地址段默认是wan侧的子网段(或相同网段),此时WAN侧认为相同网段的情况下对LAN侧的IPv6地址链路可达,而发起ICMPv6 ns/na报文用于链路地址解释(PPPoE模式是点对点协议,不需要),但正常情况下我们的wan口是不会对此ns报文做响应的
ipv6 neigh proxy可用于对非接口的ipv6地址 ns报文做解答(目的mac就是wan接口本身)
实现原理:
内核使用neigh_table表管理邻居发现,ipv4对应arp_tbl,ipv6对应nd_tbl
其中有2个重要的链表:
nht->hash_buckets是正常的ipv6缓存邻居链表
phash_buckets是代理的ipv6邻居链表,这2个链表的结构体不一样,对应的各自有一套操作函数
内核曾查询邻居默认是使用nht->hash_buckets,增加查询phash_buckets链表的条件是proxy_ndp被设置为1
应用层添加邻居节点判断为代理邻居节点的条件是flags标记设置了NTF_PROXY
实现方式:
/proc/sys/net/ipv6/conf/all/proxy_ndp || /proc/sys/net/ipv6/conf/XXX/proxy_ndp 控制是否启用代理
ip -6 neigh add proxy 2000::3000 dev eth0添加对应的ipv6代理地址到各自需要代理的接口(mac地址直接取的接口的mac)