家中 IPv6 网络路由配置

技术背景

Raspberry Pi 3

Raspberry Pi,也称树莓派,简写为 RPi,是一块信用卡大小的开发板。RPi3 具有一块 1 GHz 主频的 CPU,一个 100 Mbps 的网口和四个 USB 2.0,并提供了 2 GHz Wi-Fi 支持。

IPv6

取代 IPv4 的下一代网络协议,更长的网络地址提供了更多设备的支持。由于各种限制,时至今日仍未普及,但推广仍在继续。学习 IPv6 相关的知识是如今网络使用者必须要面对的事。

SLAAC

无状态地址自动配置(SLAAC),当连接到 IPv6 网络时,IPv6 主机可以使用邻居发现协议(NDP)对自身进行自动配置。SLAAC 有两种方式,一种是路由通告(RA),一种是 DHCPv6。RA 是 IPv6 的主要配置模式,并通过 RDNSS 对 DNS 服务器进行广播。DHCPv6 除了无状态外,也可以进行有状态自动配置。目前大多数设备已经支持 RDNSS,Android 仅支持 RDNSS,Windows 在 10 创意更新后支持了 RDNSS。

起因

这两天在大改家中的网络结构,目前有一块好友赠送的 Netgear R7500v1 和我之前使用的 Netgear WNR2000v4,前者因为 OpenWrt 不支持 5 GHz Wi-Fi,后者因为存储空间太小,因此只能使用吃灰半年多的树莓派来作为 IPv6 隧道的路由。Netgear R7500v1 作为主要路由器,调整之后放置在家里的中心,信号得到了很好的改善,几乎可以覆盖整个屋子。Netgear WNR2000v4 作为桥接路由器,用来无线接收主路由器的信号,实现类似于 WDS 的功能,放在客厅来供电视和另一个电脑的网络接入,减少了多余的两条网线。树莓派直接插在主路由器上,通过 tinc 实现原生 IPv6 接入,作为 IPv6 的路由及网关。

配置过程

前置条件

主路由器仅进行了默认设置,其中高级选项中的 IPv6 选项直接禁用掉。

配置无限桥接路由

桥接路由器刷了 OpenWrt 开发分支的固件,试验了很多次都无法实现 WDS,最后参照原来的 Wiki 使用 relayd 实现了同一网段桥接。

  1. 将该路由器网段与目标网段分离(如:目标网段为 192.168.1.0/24,则当前网段为 192.168.2.0/24)

  2. 启用 Wi-Fi

1
2
3
uci set wireless.@wifi-device[0].disabled=0
uci commit wireless
wifi
  1. 扫描 Wi-Fi 获得网络名称(可选)
1
iw dev wlan0 scan
  1. /etc/config/network 中添加 wwan
1
2
3
4
5
config interface 'wwan'
option ifname 'wlan0'
option proto 'static'
option ipaddr '192.168.1.3' # 目标网段的 IP
option netmask '255.255.255.0' # 目标网段掩码
  1. /etc/config/wireless 中添加无线网络信息,连接到目标网络
1
2
3
4
5
6
7
config wifi-iface 'default_radio0'
option device 'radio0'
option network 'wwan'
option mode 'sta'
option ssid 'wifi' # 网络名称
option encryption 'psk2' #加密方式
option key '404notfound' # 网络密码
  1. 重启无线网络
1
wifi down; wifi
  1. 安装并启用 relayd
1
2
3
opkg update
opkg install relayd
/etc/init.d/relayd enable
  1. /etc/config/network 中添加 relay
1
2
3
config 'interface' 'stabridge'
option 'proto' 'relay'
option 'network' 'lan wwan'
  1. 编辑 /etc/config/dhcp 关闭 dhcpd,在 config 'dhcp' 'lan' 中的最后一行添加 option 'ignore' '1' 即可

  2. 为了实现 IPv6 正常配置,在 /etc/config/network 中修改 lan 中如下配置

1
2
option ra        relay
option dhcpv6 relay
  1. reboot,然后查看是否存活

  2. 附加说明:以后要修改该路由器配置,从上层路由连接到的可以访问你配置的地址,否则需要手动设置为该网段(192.168.2.0/24)的地址

配置树莓派

  1. 刷入 openSUSE Tumbleweed 的镜像,可以从这里获得相关信息

  2. 连接至主路由器,电源和网络

  3. 找到树莓派的网络地址,通过 SSH 连接,用户名 root,密码 linux

  4. eth0 接口配置为静态,并添加 IPv6 网络地址(及就是路由地址,使用 /64 网段)

/etc/sysconfig/network/ifcfg-eth0
1
2
3
4
5
6
7
8
9
10
BOOTPROTO='static'
MTU=''
REMOTE_IPADDR=''
STARTMODE='auto'
BROADCAST=''
ETHTOOL_OPTIONS=''
IPADDR='192.168.1.2/24' # IPv4
NAME=''
NETWORK=''
IPADDR_0='1234:5678:90ab:cdef::1/64' # IPv6
  1. 配置隧道部分

  2. 启用转发

/etc/sysctl.conf
1
net.ipv6.conf.all.forwarding = 1
  1. 安装 radvd
1
zypper in radvd
  1. 配置 radvd
/etc/radvd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface eth0
{
AdvSendAdvert on;

# 广播的 IPv6 地址
prefix 1234:5678:90ab:cdef::/64
{
};

# 这里是 DNS 服务器地址
RDNSS 2001:4860:4860::8888 2001:4860:4860::8844
{
};
};
  1. 启动并启用自动启动
1
2
systemctl start radvd
systemctl enable radvd
  1. 测试(记得在上层路由路由你的地址)

附加部分

虽然 Windows 在创意更新中支持了 RDNSS,但是实际测试中没有想象中的顺利。在反复尝试之后,Windows 仍没有获取到 DNS 信息,故只能手动设置,且 Windows 对 IPv6 的优先程度还是有些奇怪。

参考链接