IPv4 & IPv6 双栈家庭局域网内将客户端网关指向旁路由的探究

  这篇文章是透明代理问题的一个延续,旨在解决 IPv4 & IPv6 双栈家庭网络环境中,将所有终端设备网关指向旁路由,实现所有设备均可正常科学上网的问题。在写这篇博客之前,我在 youtube 上翻阅了许多相关视频,发现很多 UP 主对 IPv6 避而不谈,也有 UP 主建议关闭 IPv6 网络。因此决定聊一下这个话题,算是一个探究吧,希望这篇文章对有这方面需求的小伙伴有一些启发。

一、实现目标及解决思路

1、家庭网络中终端设备一般很少,对主路由的数据交换及网络吞吐能力要求并不高,因此在路由器选择方面,尽可能选择性价比及稳定性高、功耗低的产品。

2、在网络拓扑方面,遵循网络拓扑结构越简单越好,这样当出现故障时,我们更容易排查错误。

3、解决 IPv4 & IPv6 双栈家庭局域网环境下,所有终端设备均可通过旁路由科学上网的问题。

4、我不建议将所有功能(例如科学上网插件、分流规则等)都集中在主路由上,一方面需要将主路由替换为性能较好的软路由,另外主路由的配置会变得比较臃肿,牵一发动全身,不利于故障排查。

5、在这篇文章中,主路由我们使用运营商赠送的光猫,然后引入一块 Armbian 操作系统的旁路由实现全局科学上网问题。

二、网络拓扑结构

以上是本实验环境的网络拓扑结构:

1、主路由使用运营商赠送的华为 MA5671 光猫(IPv4地址:192.168.0.1),光猫的 LAN2/LAN4 口被定义为 IPTV 口,专门用于接运营商赠送的 IPTV 机顶盒。

2、光猫采用路由模式,简单配置 IPv4 dhcp 及 IPv6 相关设置后,局域网内的终端设备即获取到有效的 IP 地址,可以正常上网了,这应该是大多数普通家庭最简单的网络结构。

3、斐讯 N1 刷入 Armbian 操作系统(IPv4地址:192.168.0.2),当作旁路由使用,实现全局科学上网问题。旁路由已经被配置为透明代理,可以正常科学上网。具体可参考《在 Armbian 操作系统上使用 dae(大鹅) 搭建透明代理》或《在 Armbian 操作系统上搭建基于 Hysteria2 协议的透明代理》。

三、修改相关设置,使局域网内客户端网关指向旁路由,实现全局科学上网

1、IPv4 DHCP 相关设置

  由于光猫的 IPv4 DHCP Server 的设置不能修改网关地址,我们关掉光猫的 IPv4 DHCP Server 。

2.关闭光猫 IPv4 DHCP Server.webp

  然后在旁路由上安装 IPv4 DHCP Server,解决 IPv4 网关问题。

# 安装 isc-dhcp-server
apt-get install isc-dhcp-server

# 修改 isc-dhcp-server 配置文件,定义网络接口
vi /etc/default/isc-dhcp-server
INTERFACESv4="eth0"
INTERFACESv6="eth0"

# 在 dhcpd.conf 配置文件尾部添加如下配置
vi /etc/dhcp/dhcpd.conf
subnet 192.168.0.0 netmask 255.255.255.0 {
   range 192.168.0.150 192.168.0.200;                          # 开放的地址池
   option domain-name-servers 223.5.5.5,223.6.6.6;             # NS域名服务器,如果没有就注释掉
   #option domain-name "internal.example.org";                 # 域名
   option routers 192.168.0.2;                                 # 网关地址
   option broadcast-address 192.168.0.255;                     # 广播地址
   default-lease-time 259200;                                  # 默认租期,单位:秒
   max-lease-time 259200;                                      # 最大租期
}

# 重启 isc-dhcp-server
systemctl restart isc-dhcp-server

  这时,重启终端设备后,终端设备的 ipv4 网关便指向了旁路由(192.168.0.2)。

2、IPv6 相关设置

  光猫的 IPv6 设置如下图,从 WAN 口获取 IPv6 前缀,采用无状态模式给局域网分配 IPv6 地址。 华为 MA5671 这款光猫是比较傻瓜的,没有 Router Advertisement (RA) 服务的相关设置。

3.光猫 IPv6 设置.webp

  正常情况下,如果设备中的 Router Advertisement (RA)  服务参数无法修改,设备生产商会将 AdvDefaultPreference 和 AdvRoutePreference 参数的优先级设置为 medium 。

  我们可以在旁路由中使用如下命令查询华为 MA5671 光猫 RA 服务中 AdvDefaultPreference 和 AdvRoutePreference 参数的优先级。

root@armbian:~# ip -6 route show
::1 dev lo proto kernel metric 256 pref medium
240e:380:19b3:65f7::/64 dev eth0 proto kernel metric 256 expires 259193sec pref medium
fe80::ecee:eeff:feee:eeee dev dae0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev dae0 proto kernel metric 256 pref medium
default via fe80::1 dev eth0 proto ra metric 1024 expires 1793sec mtu 1472 hoplimit 64 pref medium

相关知识点:

一个局域网内允许同时存在多个 Router Advertisement (RA) 服务。

AdvDefaultPreference:用于设置整个路由器作为默认网关的优先级。

AdvRoutePreference:用于设置特定路由的优先级。

优先级可以是 low、medium 或 high。medium 是默认值,如果设置为 high 意味着这个路由器比其他默认优先级较低的路由器更有可能被选为默认网关。

  鉴于此,我们可以使用光猫的 Router Advertisement (RA) 服务为局域网设备分配 IPv6 地址,同时在旁路由上安装 Router Advertisement (RA) 服务,将 IPv6 的网关指向旁路由。

# 安装 radvd
apt-get install radvd

# 创建 radvd 配置文件,AdvDefaultPreference 和 AdvRoutePreference 设置为 high
cat > /etc/radvd.conf <<EOF
interface eth0 {
    AdvSendAdvert on;
    MinRtrAdvInterval 75;
    MaxRtrAdvInterval 100;
    AdvDefaultPreference high;
    AdvManagedFlag off;
    AdvOtherConfigFlag off;
    route ::/0 {
        AdvRoutePreference high;
        AdvRouteLifetime 300;
    };
};
EOF

# 修改配置文件属性
chmod 755 /etc/radvd.conf

# 设置开机启动并启动 radvd 服务
systemctl enable radvd
systemctl start radvd

四、验证终端设备的路由情况

1、在Windows 客户端上,使用 tracert 命令追踪路由情况

C:\>tracert 114.114.114.114
通过最多 30 个跃点跟踪
到 public1.114dns.com [114.114.114.114] 的路由:
  1     2 ms     1 ms     2 ms  192.168.0.2
  2     3 ms     2 ms     1 ms  192.168.0.1
  3     ......

  使用 tracert 命令追踪 IPv4 的路由情况,第一跳为旁路由(192.168.0.2),第二跳为光猫(192.168.0.1)。

C:\>tracert 240C::6644
通过最多 30 个跃点跟踪到 240c::6644 的路由
  1     2 ms     1 ms     2 ms  240e:380:19b3:65f7:8149:d672:24d4:7a9f
  2     2 ms     2 ms     2 ms  240e:380:19b3:9800:1510:9453:628b:90b0
  3     ......

  使用 tracert 命令追踪 IPv6 的路由情况,第一跳为旁路由(240e:380:19b3:65f7:8149:d672:24d4:7a9f),第二跳为光猫(240e:380:19b3:9800:1510:9453:628b:90b0)。

2、在 Linux / Armbian 客户端上查看路由情况

root@onecloud:~# ip route show
default via 192.168.0.2 dev eth0
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.159

  从以上结果可以看出,IPv4 默认的网关为旁路由(192.168.0.2)。

root@onecloud:~# ip -6 route show
::1 dev lo proto kernel metric 256 pref medium
240e:380:19b3:65f7::/64 dev eth0 proto kernel metric 256 expires 259163sec pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via fe80::8149:d672:24d4:7a9f dev eth0 proto ra metric 1024 expires 263sec hoplimit 64 pref high
default via fe80::1 dev eth0 proto ra metric 1024 expires 1763sec mtu 1472 hoplimit 64 pref medium

  从以上结果可以看出,IPv6 有两个默认路由,分别为光猫(fe80::1)和旁路由(fe80::8149:d672:24d4:7a9f),由于旁路由 RA 服务的 AdvDefaultPreference 设置为 high ,操作系统会优先使用旁路由。

3、使用 ADB 工具连接 Android 盒子,在盒子上使用 traceroute 命令追踪路由情况

franklin:/ # traceroute 114.114.114.114
traceroute to 114.114.114.114 (114.114.114.114), 30 hops max, 38 byte packets
 1  192.168.0.2 (192.168.0.2)  1.274 ms  1.422 ms  1.039 ms
 2  192.168.0.1 (192.168.0.1)  1.705 ms  1.707 ms  1.367 ms
 3  ......

  使用 traceroute 命令追踪 IPv4 的路由情况,第一跳为旁路由(192.168.0.2),第二跳为光猫(192.168.0.1)。

franklin:/ # traceroute 240C::6644
traceroute to 240C::6644 (240c::6644), 30 hops max, 64 byte packets
 1  240e:380:19b3:65f7:8149:d672:24d4:7a9f (240e:380:19b3:65f7:8149:d672:24d4:7a9f)  1.426 ms  1.200 ms  1.116 ms
 2  240e:380:19b3:9800:1510:9453:628b:90b0 (240e:380:19b3:9800:1510:9453:628b:90b0)  1.659 ms  1.544 ms  1.267 ms
 3  ......

  使用 traceroute 命令追踪 IPv6 的路由情况,第一跳为旁路由(240e:380:19b3:65f7:8149:d672:24d4:7a9f),第二跳为光猫(240e:380:19b3:9800:1510:9453:628b:90b0)。

五、该方案的局限性

  该方案在 WIndows 、Linux 、macOS 等操作系统中可以完美使用,但是对于低版本的 Android 系统可能达不到预期效果。究其原因为 Android 的某些低版本对 IPv6 的支持有限,尤其是在处理路由广告(RA)消息时,可能并没有完整实现对所有 RA 选项的支持。这意味着即使广告了 AdvDefaultPreference high 或 AdvRoutePreference high,Android 设备可能不会显示或使用这些信息。实验过程中我发现其他操作系统均可以将 IPv6 网关指向旁路由,但是 Android 机顶盒始终存在问题,直到我将 Android 机顶盒的固件版本升级到 Android 9,才解决了上述问题。

相关知识点:Android 对 IPv6 支持的演变

1、早期版本(Android 4.x 及更早版本):

这些版本对 IPv6 支持非常有限,主要用于基础的 IPv6 连接,路由广告(RA)消息的处理也比较简单。

例如:Android 4.4 之前的版本可能不会完全支持 RA 消息中的所有选项,比如 AdvRoutePreference。

2、Android 5.x (Lollipop):

增加了对 IPv6 的支持,包括 RA 的处理,但仍然有限。

具体支持的 RA 选项文档很少,但从用户反馈来看,RA 消息中的一些高级选项可能不会完全处理或显示。

3、Android 6.x (Marshmallow) 及以后:

增强了对 IPv6 的支持,包括对更多 RA 选项的处理。

例如:引入了对 IPv6 快速切换和更好的 RA 消息处理,但具体到 AdvRoutePreference 等选项的支持情况仍然不明确。

4、Android 8.x (Oreo) 及以后:

进一步增强了 IPv6 支持,改进了 RA 消息的处理。

例如:引入了对 IPv6 Dual-Stack 的更好支持,但具体到高级 RA 选项,如 AdvRoutePreference,仍然可能存在支持不完整或不显示的问题。


本文出处:HiFeng's Blog
本文链接:https://hicairo.com/post/78.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!