V2ex上有2人问这个问题,就专门写文章总结一下吧
前提条件
- 旁路需要支持 TPROXY,且你的 TPROXY 支持 IPv6 的流量
- 不需要OpenWRT,我自己是在N1上刷了个自编内核的CoreELEC,打开了一些 TPROXY 工作需要的内核模块,旁路和高清播放两不误
- 主要原理就是利用 IPv6 Router Preferences and More-Specific Routes (RFC 4191) 绝大多数系统默认打开,参考 https://linux.die.net/man/5/radvd.conf 的 AdvDefaultPreference 章节
具体做法
- 我们假设TRPOXY的配置都已经配置好,任何被牵引过来的IPv6流量都会被按照设定的规则“自动处理”,你明白自动甄别和处理的意思是什么(PREROUTING/MATCH,范围太广且每个人方案不同,不具体说明,只要能达到本条要求即可),我假设你这方面没问题。
- 旁路可以通过 SLAAC/DHCPv6 获取一个地址,同时内核也获取到了一个前缀,这个前缀感知是内核自动完成的,我自己选的 SLAAC 方式,简单且不用关闭主路由的 SLACC 这样其他设备可以直连国内 IPv6大网
- 对于需要牵引流量走旁路的设备,获取其IPv6的Link-local地址(苹果手机需要关闭随机MAC地址,否则可能造成Link-local地址也随机变化),我们假设设备的Link-local地址为 fe80::aabb:ccdd:eeff:gghh
- 修改旁路的RADVD的RA方式为单播,并填入需要接受单播RA的第二步获取到的那些设备的Link-local地址,并且在RA中声明我的路由优先级最高(未配置的情况下,默认网关的路由优先级一般不是最高的,所以如果你没改过主路由的配置,主路由的RA声明的默认网关的优先级无需调整)
- 设备默认会把发送RA广播的旁路的Link-local地址设置为DNS,如果你想要使用这方面的特性,你可以加以利用在旁路还配置一个DNS,否则请自行使用IPv4的DHCP给这些设备单独分配DNS解决特殊的DNS问题,我假设你这方面也没问题
- 采用高优先级默认路由旁路上RADVD的配置案例:
1234567891011121314151617interface eth0 { ## 定义有IPv6的那个接口的名称,也就是旁路LAN口的名称IgnoreIfMissing on;AdvSendAdvert on;MaxRtrAdvInterval 600;AdvReachableTime 0;AdvDefaultPreference high; ########重要prefix ::/64 { ### SLAAC模式下获取的前缀都是/64AdvAutonomous on;AdvPreferredLifetime 14400;AdvValidLifetime 86400;AdvOnLink on;};clients { ### 在此枚举需要进行流量牵引的设备的Link local地址#DEVICE 1fe80::aabb:ccdd:eeff:gghh;};};
- 采用明细路由法:
实测手里的所有安卓都不支持,IOS未知,作为默认路由法的补充。
简单来说的话,就是把需要“牵引”流量的目的地址通过RA告诉客户端,相当于给客户端下发一些静态路由,你可以枚举所有的已经分配的公共单播IPv6地址前缀(数量也不是很多),也可以只声明你需要牵引的目的地址的前缀,这样做某些事情更加有针对性,这里给出一个示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
interface eth0 { # 省略其他的配置 route 2001:0000::/23 {}; route 2001:0200::/23 {}; route 2001:0400::/23 {}; route 2001:0600::/23 {}; route 2001:0800::/22 {}; route 2001:0c00::/23 {}; route 2001:0e00::/23 {}; route 2001:1200::/23 {}; route 2001:1400::/22 {}; route 2001:1800::/23 {}; route 2001:1a00::/23 {}; route 2001:1c00::/22 {}; route 2001:2000::/19 {}; route 2001:4000::/23 {}; route 2001:4200::/23 {}; route 2001:4400::/23 {}; route 2001:4600::/23 {}; route 2001:4800::/23 {}; route 2001:4a00::/23 {}; route 2001:4c00::/23 {}; route 2001:5000::/20 {}; route 2001:8000::/19 {}; route 2001:a000::/20 {}; route 2001:b000::/20 {}; route 2002:0000::/16 {}; route 2003:0000::/18 {}; route 2400:0000::/12 {}; route 2600:0000::/12 {}; route 2610:0000::/23 {}; route 2620:0000::/23 {}; route 2630:0000::/12 {}; route 2800:0000::/12 {}; route 2a00:0000::/12 {}; route 2a10:0000::/12 {}; route 2c00:0000::/12 {}; }; |