树莓派软路由配置 IPv6 网络

树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。

网络环境:树莓派有线网卡 eth0 作为 WAN 口连接 IPv4 + IPv6 双栈的校园网,USB 无线网卡 wlx1cbfceb110dc 作为无线 AP 提供局域网,USB 网卡的驱动和 AP 的搭建见 【补档】树莓派折腾记录

网桥透传法

由于我的 IPv6 网络并没有透明代理的需求,所以其实在两个网卡间搭个网桥,把树莓派作为二层网络设备(类似交换机)使用即可。主要问题在于限制网桥只走 IPv6 流量,这个使用 ebtables 即可,局域网中的网络设备会联系校园网的网关获取到 IPv6 地址等信息。

部署完后才发现,校园网的 IPv6 也是需要登录认证的,所以这样整的话每次联网都需要手动登录,所以最终弃用了 QAQ.

主要参考:http://www.xingbin.net/blog_channel8/C/CampusNetwork_IPv6/

建立网桥:sudo brctl addbr ipv6br

启动网桥:sudo ifconfig ipv6br up

只允许 IPv6 数据包通过网桥:sudo ebtables -t broute -A BROUTING -p ! ipv6 -j DROP

这一步如果遇到了 RULE_APPEND failed (No such file or directory): rule in chain BROUTING. 之类的错误的话,可能是因为使用了基于 nf_tables 而不是 xtables 的 ebtables,(参见:https://sources.debian.org/src/iptables/1.8.2-4/debian/NEWS/),此时使用 ebtables-legacy 即可。

添加 eth0 进入网桥:sudo brctl addif ipv6br eth0

添加 wlx1cbfceb110dc 进入网桥:sudo brctl addif ipv6br wlx1cbfceb110dc

注意: 建议先设置 ebtables 再添加网卡,否则直接将网卡添加进网桥的话会导致 IPv4 流量都进入网桥,从而无法正常连接以及丢失 SSH 连接。

以上配置重启后会消失,需要可持久化的话可以参考 http://blog.yesterday17.cn/post/pi-router/ 中的配置。

NAT for IPv6

IPv6 网络中本不应使用 NAT,然而校园网中获得的 IPv6 地址使用 ifconfig 查看是 prefixlen 128 的(或许是由 prefixlen 64 的地址生成的?这块儿我不是很明白),并且对每一个 IP 都会要求身份认证,给连入宿舍局域网中的设备带来了一定的麻烦。于是选择搭建 NAT 网络,共用同一个校园网 IPv6 地址。

局域网中使用唯一本地 IPv6 单播地址 (ULA, Unique Local IPv6 Unicast Address, RFC 4193),要求拥有固定前缀 fd00::/8,然后是 40 位随机 Global ID(关于随机的必要性见:https://blogs.infoblox.com/ipv6-coe/3-ways-to-ruin-your-future-network-with-ipv6-unique-local-addresses-part-2-of-2/)。然而为了手打地址方便,我还是使用了有某种实际意义的地址:fd22:41b7:e060::/64至少没用全零

首先开启 IPv6 内核转发,编辑 /etc/sysctl.conf

/etc/sysctl.conf
1
2
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.accept_ra=2

关于 accept_ra 的设置参考:https://sysctl-explorer.net/net/ipv6/accept_ra/,大概是因为开启转发后会自动关闭 Accept Router Advertisements,设置值为 2 可以强制开启。

接着使用 dhcpcd 配置内网无线 AP 网卡的固定静态地址,在 /etc/dhcpcd.conf 中添加 static ip6_address,编辑后如下:

/etc/dhcpcd.conf
1
2
3
4
interface wlx1cbfceb110dc
static ip_address=192.168.22.1/24
static ip6_address=fd22:41b7:e060::/64
nohook wpa_supplicant

重启 dhcpcd 生效:sudo systemctl restart dhcpcd.service

然后使用 dnsmasq 配置地址分配相关服务,这里在内网同时开启 SLAAC 和 DHCPv6,编辑 /etc/dnsmasq.conf 后如下:

/etc/dnsmasq.conf
1
2
3
4
5
6
7
8
interface=wlx1cbfceb110dc
dhcp-range=192.168.22.100,192.168.22.200,255.255.255.0,24h
dhcp-range=fd22:41b7:e060::1,fd22:41b7:e060::fe,slaac,1h
dhcp-option=3,192.168.22.1
dhcp-option=6,192.168.22.1
dhcp-option=option6:dns-server,[fd22:41b7:e060::]
enable-ra
dhcp-authoritative

重启 dnsmasq 生效:sudo systemctl restart dnsmasq.service

再通过 ip6tables 在 POSTROUTING 链上做一个 SNAT 即可:

1
sudo ip6tables -t nat -A POSTROUTING -s fd22:41b7:e060::/64 -o eth0 -j MASQUERADE

上面配置了树莓派为 DNS 服务器,树莓派使用 Clash 和 Adguard Home 搭建 IPv4 与 IPv6 双栈 DNS 服务,上游服务器也均为双栈 DNS 服务器,重连设备获取 IP 后即可正常使用了。

如果要指定 DNS 服务器可以在 dnsmasq 中类似配置,以 TUNA DNS666 服务器为例:dhcp-option=option6:dns-server,[2001:da8::666]

配置的 SLAAC 支持使 Android 手机也能正常使用 IPv6 服务。

经测试,内网设备使用 IPv6 单栈也可以正常访问双栈或 IPv6 单栈网页。

一些测试网站

参考

作者

Centaurus99

发布于

2022-09-02

更新于

2022-09-03


评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×