本文介绍使用Openwrt路由器在校园网下发IPv6地址的两种方式。我立足于浙江大学紫金港校区西区的情况,但应该也适用于浙大其他校区和其他中国大学的一般情况。一般情况下来说,这方法不适用于家庭宽带用户。
1 有线网+NAT66
从2024年7月开始,浙江大学有线网放弃了L2TP连接方式,而是也采用了跟ZJUWLAN一样的Web认证,并且继续提供IPv6地址。不过,由于提供的IPv6地址是/128位的,这导致该地址无法下发给其他设备。/128位的IPv6地址只能通过配置NAT66的方式来完成下发。
网上有许多校园网配置NAT66的教程,但是由于不清晰的写作方式、无用的步骤和过时的配置方式导致它们大多令人困惑或者根本不起作用。
1.1 准备工作
找到一根网线,一端插在墙上的网线口上,另一端插在路由器的Wan口上。使用电脑连接上路由器后,应该会弹出Web认证提示,完成认证后即可上网。
1.2 让Wan口获取IPv6地址
大多数路由器默认有一个DHCP接口和DHCPv6接口,此时DHCP接口获取到了IPv4地址,但DHCPv6接口并未获取IPv6地址。
在Luci界面的DHCPv6接口设置中,“请求指定长度的IPv6前缀”选择“禁用”,再点击“保存&应用”,此时应该可以让DHCPv6接口获取到IPv6地址,而且是一个/128位的IPv6地址。
1.3 NAT66的配置
目前,网上流行的大多数配置NAT66或IPv6动态伪装的教程都是过时、繁琐且无用的。而且严格来说这种方法是叫NAT66(NAT IPv6 to IPv6)或者IPv6 NAT,而不叫NAT6。以下我介绍两种简单的办法,主要适用于22.03及以上使用了nftables防火墙的Openwrt系统版本,这里我推荐方法一。如果低于此版本或使用iptables防火墙的OpenWrt系统,请使用方法二。
1.3.1 方法一:SSH配置
这种方法来自OpenWrt的官方教程,非常简单易用。这也告诉我们一个道理:有时候与其在各种论坛上搜索各种第三方教程,不如直接参考官方的使用说明。由于nftables防火墙自带了NAT6功能,所以也不再需要安装其他的软件包。
1.在上游区域启用 IPv6 伪装
ssh到路由器,运行:
uci set firewall.@zone[1].masq6="1"
uci commit firewall
service firewall restart
2.在上游接口上禁用 IPv6 源过滤
ssh后运行:
uci set network.wan6.sourcefilter="0"
uci commit network
service network restart
3.编辑 LAN 接口选项
DHCP服务器-IPv6设置:RA服务选择“服务器模式”,DHCPv6服务选择“服务器模式”,禁用NDP代理。
IPv6 RA设置,默认路由器选择“强制的”。
在完成以上步骤后,下游设备应该能够通过IPv6上网了,尽管在相关的连接口并不会显示公网IPv6地址。
1.3.2 方法二:NAT配置助手
在软件包里更新软件列表,搜索一个软件包叫luci-app-nat6-helper,安装后刷新管理页面,在“服务”里多出一个软件叫“NAT6配置助手”。安装该软件会自动安装相关依赖,如果此事没有发生则请手动安装。点击“启用”和“执行IPv6初始化脚本”,该软件会自动配置NAT6,完成后重启路由器使其生效。此时路由器应该就能下发IPv6地址到设备了。
1.4 已知问题:微信视频通话画面卡顿和BT下载困难
目前我已知的问题是通过这种NAT66配置方式会导致微信视频通话时双方画面卡顿,声音是正常的。PC端和手机端都有这个问题。由于其他的主流视频聊天应用不存在类似问题,这厮这里倾向于认为是微信方面的视频通话实现方式跟默认NAT66配置方式存在某种冲突而导致。
建议使用其他其他视频通话应用,或者不要微信视频通话时走路由器。如果依赖于微信视频通话的话,请不要使用NAT66配置方式。
同时,BT下载也比较困难,不仅没有无线中继快,而且经常没有任何速度。
2. 无线中继
在像校园网这样的特殊网络环境下,我们还可以通过无线中继的方式来配置路由器。在理论上,无线中继的延迟要大于有线网连接,但这种差异不是你会感受到的,即便你是FPS游戏玩家。
2.1 创建无线网络
使用您的路由器的5G频段搜索网络,连接信号最好的无线网络。
浙江大学校园网的无线网目前提供两种连接,一种叫ZJUWLAN,采用Web认证方式,不提供IPv6地址;另一种叫ZJUWLAN-Secure,采用WPA2-EAP认证方式,提供/64位的IPv6地址。
我们要连接的是ZJUWLAN-Secure,加密选择“WPA2-EAP“,算法“自动”,EAP类型选择“PEAP”,认证为“EAP-GTC”。填写自己的校园网账户和密码,不填写匿名身份。
如果您的固件没有“WPA2-EAP”选项,请安装完整版的wpad-XXXX并卸载软件包里的wpad-basic-XXXX。请自己选择wpad的实现方式,23.05版本的OpenWrt的默认选择是mbedtls。如果您的路由器连不上网,您可以暂时连接手机无线热点来完成此步骤,或者在编译阶段就选择好软件包。
2.2 创建wwan6网络接口
确保有两个网络接口,一个是wwan的DHCP,一个是DHCPv6,这两个接口分别获取IPv4和IPv6地址。DHCP接口在连接Wifi的时候就创建好了,这时一般要自己新建一个DHCPv6接口,名称可以填写为wwan6,注意分配好跟wan和wan6相同的防火墙区域。创建好wwan6口后,该接口应该能直接获取到了/64的IPv6地址。假如通过常规的中继模式可以让下游设备获取到IPv6地址,那么配置到这里就完成了。常规中继模式的配置方式可参见这篇文章,一般来说就是在wan6口或wwan6口和Lan口的相关设置中的三种模式全部选择“中继模式”。
假如发现中继模式无法顺利获取IPv6地址,请参考2.3。遗憾的是,浙江大学的无线中继就属于此类情况。
2.3 伪装PD前缀(可选)
使用“伪装PD前缀”的方式来确保IPv6地址下发到设备。这里没有采用NAT6的方式,因为在能够获取/64位的IPv6地址的情况下,伪装PD前缀是更好的解决方案。《odhcpd 中继模式原理、局限以及解决方案》一文解释了校园网/64的IPv6地址无法正常下发的原因,并且提供了两种解决方案。以下是对该文所提供的伪装PD前缀解决方案的引用。家庭宽带用户如果发现路由器本身能获取IPv6地址但却无法下发到设备,也可以采用有线网+伪装PD前缀的解决方案。
使用SSH软件连接路由器编辑 /etc/odhcp6c.user
文件,可使用命令:
vi /etc/odhcp6c.user
如果您不知道如何编辑文件,请寻找一个好的教程。复制以下代码,并粘贴到该文件之中:
#!/bin/sh
log() {
logger -t "odhcp6c[fake-ipv6pd]" "$@"
}
reset_envs() {
local entry
local raroutes=""
local userprefix=""
for entry in $RA_ROUTES; do
local route="$entry"
local addr="${entry%%/*}"
entry="${entry#*/}"
local mask="${entry%%,*}"
entry="${entry#*,}"
local gw="${entry%%,*}"
entry="${entry#*,}"
local valid="${entry%%,*}"
entry="${entry#*,}"
local metric="${entry%%,*}"
if [ "$addr" != "::" ]; then
local prefix="$addr/$mask"
log "found ipv6 prefix $prefix"
userprefix="$userprefix $prefix"
continue
fi
log "preserve ra route $route"
raroutes="$raroutes $route"
done
RA_ROUTES="$raroutes"
USERPREFIX="$userprefix"
}
fake_ipv6pd() {
local device="$1"
local action="$2"
[ "$action" != "ra-updated" ] && return
[ -n "$PREFIXES$USERPREFIX" ] && return
[ -z "$ADDRESSES$RA_ADDRESSES" ] && return
reset_envs
[ -n "$ADDRESSES$RA_ADDRESSES$PREFIXES$USERPREFIX" ] && setup_interface "$device"
}
fake_ipv6pd "$@"
保存后运行 /etc/init.d/network restart
让路由器重新配置网络,或者直接重启路由器,过一会儿路由器应该就能下发IPv6地址了。
2.4 ZJUWLAN-Secure的断流情况(可选)
最后我讨论一下ZJUWLAN-Secure的特殊情况,其他用户不必阅读这部分。近段时间,我发现路由器连接ZJUWLAN-Secure WIFI有断流的现象,每隔大约8小时24分断一次,具体表现为连接虽然保持,但其实没有流量。在反复研究检索后,发现问题出在WPA2-EAP认证的PMKSA缓存中。缓存的默认有效期就是8小时24分,而有效期一过就要重新验证,但实际上重新验证的过程由于某种未知原因并不会完成,这就导致了断流的出现。具体日志为:
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: CTRL-EVENT-EAP-STARTED EAP authentication started
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=4 -> NAK
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=25
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: CTRL-EVENT-EAP-METHOD EAP vendor 0 method 25 (PEAP) selected
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: EAP-TLV: TLV Result – Success – EAP-TLV/Phase2 Completed
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: PMKSA-CACHE-REMOVED dc:da:80:1c:e8:21 0
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: PMKSA-CACHE-ADDED dc:da:80:1c:e8:21 0
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: WPA: Key negotiation completed with dc:da:80:1c:e8:21 [PTK=CCMP GTK=CCMP]
虽然日志看起来没有异常,但是一次成功的连接的最后一条相关日志应该是CTRL-EVENT-CONNECTED。
有一位国外用户报告了相同的现象,但该用户给出的解决方案对本人的情况无效。我尝试禁用PMKSA缓存,但完全不起作用。PMKSA缓存似乎是被服务端控制的,而不是客户端。由于这种断流原因,最近我已经转而使用有线网+NAT6的方式。
3. 结论
以上就是在校园网环境下获取IPv6地址的两种方式。由于在许多校园网环境中有线网的IPv6并不进行常规的限速,而无线中继中的IPv6似乎进行常规的限速,所以我们更推荐有线网+NAT66的配置方式。
假如家庭宽带用户的路由器获得了有PD前缀的IPv6,那么一般路由器会默认自动配置好。假如获得了没有PD前缀的/64位的IPv6地址,尤其是光猫拨号和路由器中继的情况,一般中继模式的配置即可胜任,具体办法可参考这篇文章。