刚开始接触IPv6的时候,对于link-local地址(fe00::/8)是不太关注的。
最近在尝试搞一个双栈旁路由,在不对出口光猫做hack的情况下,通过旁路由发送高优先级的RA消息实现了所有IPv6流量通过旁路由转发的能力,做完了之后发现其实挺简单的,一开始就是走了很多弯路。
我的网络配置有点特殊,旁路由有双网卡分别接入了光猫LAN口和交换机,而交换机也接入了LAN口,所以本质上双网卡接入了同一个network segment,在IPv4下,需要非常小心的处理ARP相关的事情,通过source route来解决各种冲突的问题,到了IPv6中突然发现一切都不一样了。
其中最关键的在于IPv4中的ARP在IPv6中已经不存在了,而是换成了完全不一样的基于link-local地址进行邻居发现和通信,由于每个interface都会自动获得link-local的地址,其实也就拥有了基本的IP通信能力,所以一个主机两个网卡都接入同一个network segment的时候,不需要再处理ARP相关的问题,由于link-local地址是一个真正的IP地址,所以所有的数据都是在IP之上传递的,这样就可以通过各种IP层工具来控制数据包了。
由于开始的时候没有意识到这个区别,所以一开始花了很多时间解决如何同时分配IPv6地址给两个网卡,同时还要保证路由的正确性。其实由于我的目的是通过其中一个接口接收LAN请求,分流之后转发,所以其实只需要一个link-local就完全够用了,根本不需要配置多个全局IPv6地址,这样也不需要搞各种路由规则了。