家里电信双栈网络,路由器是 lede/openwrt ,DNS 用 adguard home 做了一层缓存转发,启用 ipv6 地址和 ipv6 解析。国内访问一切正常而且很爽,但国外流量一是因为机场不支持 ipv6 ,二是出国 ipv6 直连线路确实拉跨,经常访问不了或者出奇的慢。
当前的方案是将直连不能访问的网站(如 V2EX )使用 adguard home 的 ipset 功能,将解析到的 ipv6 加到一个指定的 ipset, 然后在 openwrt ip6table forward 转发链上 reject 掉,这样的问题是还会时不时碰到无法访问或访问慢的网站,需要不停的加这个 ipset 清单。于是想着有没有简洁优雅的方式可以直接保留国内 ipv6 流量,禁用国外 ipv6 。
先说我能想到的 2 个方案,一是 DNS 层面,另一是 iptables 层面:
1. 当前使用的 adguard home 能做的只能全局停用或者启用 ipv6 解析,无法指定对部分域名进行 ipv6 的停用或启用解析,这样的话就得多加一层 DNS 解析,多加的这层负责国外所有 DNS 解析,并且配置停用 ipv6 解析。这个方案的问题是需要 2 层 DNS 解析,而且国内,国外的域名清单能否找全,哪里能有?
2. 在 openwrt 上使用 ip6tables 的 FORWARD 转发链,配置只允许国内的 ipv6 网段通过,REJECT 所有其它网段,找了个国内的 ipv6 网段清单而且不多,这个实现容易。但弊端是实际所有客户端还是能拿到 ipv6 地址,而且像浏览器之类的客户端都是 ipv6 优先,会先进行 ipv6 请求,待 ipv6 请求失败后再次进行 ipv4 请求,多少对使用体验会有影响。附一个 iptables 实现:
ip6tables -F FORWARD
ip6tables -I FORWARD -d 240e::/18 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2408:8000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2409:8000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240a:c000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c:c000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240a:4000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240a:8000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240b:8000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c:8000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240d:4000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2408:4000::/22 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c:4000::/22 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240d:8000::/24 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240f:4000::/24 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240f:8000::/24 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2400:dd00::/28 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c::/28 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2001:4510::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2400:a980::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2a0c:f480::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2a0d:2480::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2406:cf00::/30 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2001:250::/31 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2001:da8::/31 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2403:800::/31 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -j REJECT
当前的方案是将直连不能访问的网站(如 V2EX )使用 adguard home 的 ipset 功能,将解析到的 ipv6 加到一个指定的 ipset, 然后在 openwrt ip6table forward 转发链上 reject 掉,这样的问题是还会时不时碰到无法访问或访问慢的网站,需要不停的加这个 ipset 清单。于是想着有没有简洁优雅的方式可以直接保留国内 ipv6 流量,禁用国外 ipv6 。
先说我能想到的 2 个方案,一是 DNS 层面,另一是 iptables 层面:
1. 当前使用的 adguard home 能做的只能全局停用或者启用 ipv6 解析,无法指定对部分域名进行 ipv6 的停用或启用解析,这样的话就得多加一层 DNS 解析,多加的这层负责国外所有 DNS 解析,并且配置停用 ipv6 解析。这个方案的问题是需要 2 层 DNS 解析,而且国内,国外的域名清单能否找全,哪里能有?
2. 在 openwrt 上使用 ip6tables 的 FORWARD 转发链,配置只允许国内的 ipv6 网段通过,REJECT 所有其它网段,找了个国内的 ipv6 网段清单而且不多,这个实现容易。但弊端是实际所有客户端还是能拿到 ipv6 地址,而且像浏览器之类的客户端都是 ipv6 优先,会先进行 ipv6 请求,待 ipv6 请求失败后再次进行 ipv4 请求,多少对使用体验会有影响。附一个 iptables 实现:
ip6tables -F FORWARD
ip6tables -I FORWARD -d 240e::/18 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2408:8000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2409:8000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240a:c000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c:c000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240a:4000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240a:8000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240b:8000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c:8000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240d:4000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2408:4000::/22 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c:4000::/22 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240d:8000::/24 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240f:4000::/24 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240f:8000::/24 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2400:dd00::/28 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c::/28 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2001:4510::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2400:a980::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2a0c:f480::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2a0d:2480::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2406:cf00::/30 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2001:250::/31 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2001:da8::/31 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2403:800::/31 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -j REJECT
