在 OpenWrt 上使用 WPA2-EAP 连接校园网并通过 NAT6 配置 IPv6


快过年了,不要再讨论什么 NAS、HTPC、OpenWrt 了。你带你的大机箱回到家并不能给你带来任何实质性作用,朋友们兜里掏出一大把钱吃喝玩乐,你默默的在家里摆弄你的破群晖。亲戚朋友吃饭问你收获了什么,你说我组了一个 RAID 0 的 ALL IN ONE,亲戚们懵逼了,你还在心里默默嘲笑他们,笑他们不懂你的刮削器,不懂你的 Auto Backup,也笑他们看爱奇艺还要忍受会员专属广告。你父母的同事都在说自己的子女一年的收获,儿子买了个房,女儿买了个车,姑娘升职加薪了,你的父母默默无言,说我的儿子装了个黑盒子,开起来嗡嗡响、家里电表走得越来越快了。

前言

为了给国庆的时候找点事做,以及未来若干年的宿舍网络环境,我决定稍微折腾一下校园网。同时,为了避免一段时间后出问题却找不到北,也简单记录一下操作的流程。

我使用的设备是 Cudy TR3000 128MB,安装了 OpenWrt 24.10.3。相应的 Sysupgrade 镜像可以从 OpenWrt Firmware Selector 中找到,但 Cudy 的官网中只有 256MB 版本的升级所需中间固件,没有 128MB 版本的,不过在互联网上随便找下就可以得到。

OpenWRT 基本配置

1
2
3
4
5
6
7
8
# 替换 opkg 下载源到 tuna
sed -i 's_https\?://downloads.openwrt.org_https://mirrors.tuna.tsinghua.edu.cn/openwrt_' /etc/opkg/distfeeds.conf

# 安装 luci-i18n
opkg update
opkg install luci-i18n-base-zh-cn
# 更新所有包
opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade

计划任务示例(定时重启)

1
2
# 每天 5:30 重启, 延迟 70s, 修改文件时间以帮助系统获取准确时间, 重启
30 5 * * * sleep 70 && touch /etc/banner && reboot

连接校园网

我所在的环境只提供无线连接校园网的方式,要么选择使用深澜的那一套认证方式,要么使用 WPA2-EAP。前者已经有人做过了,不过显然后者更简单一点,因为之前“Openwrt 不支持 WPA2-Enterpise 无线中继”这一点在今天已经不成立了。

为了使用 WPA2-EAP,需要删去形同 wpad-basic 或者 wpad-mini 之类的包并安装 wpad。但是路由器还没有互联网连接呢,总不能手动安装包括依赖在内的所有包吧?在手动操作了几次之后,我意识到一个简单的方法是使用路由器的无线网卡连上手机热点(

1
2
3
4
# 建议在连接到热点之后再删除原有的 wpad
# 我遇到的情况是删除原有 wpad 后就无法在 LuCI 中使用 WPA 连接到热点了...
opkg remove wpad-basic-mbedtls
opkg install wpad

安装完 wpad 后,在 LuCI 中操作,通过网络→无线→无线概况→扫描加入网络时仍然只有给出 WPA 密钥、而非期望的 WPA2-EAP 那套身份和密码的形式。可以随便写个 WPA 密钥,后续在接口配置中再做修改。编辑新得到的网络,在接口配置→无线安全中选择加密“WPA2-EAP (强安全性)”,EAP 类型选择“PEAP”,身份认证选择“EAP-MSCHAPv2”,并在鉴权和密码中填写对应内容。如果没有意外,这样就可以登录到校园网了。

如果比较倒霉,在 LuCI 中找不到 WPA2-EAP,同时还确信当前安装的 wpad 就是支持 WPA2-EAP,可以尝试直接修改 /etc/config/wireless,比如

1
2
3
4
5
6
config wifi-iface 'something_like_this'
option encryption 'wpa2'
option eap_type 'peap'
option auth 'EAP-MSCHAPv2'
option identity 'your_identity'
option password 'your_password'

配置 NAT6 完成 IPv6 连接测试

为了正常使用 IPv6,还需要在网络→接口增加一个额外的 DHCPv6 客户端,记作 wwan6。在得到 IPv6 地址后,理论上路由器就可以使用 IPv6 了,可以通过网络→网络诊断进行测试。据说教育网环境下分配的 IPv6 地址并不会附赠 PD 信息,我没有深究我所处的地方是不是也是这样,不过就当是这样吧。为了让同一个 LAN 中的其他设备也能够使用 IPv6,大家普遍采用的方案是使用 NAT6。

编辑得到的 wwan6 接口,在常规设置中,请求 IPv6 地址设置为“尝试”,请求 IPv6 前缀设置为“已禁用”。由于 OpenWrt 24.10.3 已经有了 nftables,所以默认支持配置 NAT6。在网络→防火墙→常规设置中,将转发设置为“接受”,并在区域中设定区域内转发为“接受”,得到 wan→ACCEPT,在高级设置中启用“IPv6 伪装(IPv6 Masquerading)”。

最后需要配置网关,创建 /etc/hotplug.d/iface/99-ipv6 并写入

1
2
3
#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
route -A inet6 add default gw `(ip -6 route | grep default | awk '{print $5,$6,$7}' | sed -n '1p')`

设置权限并重启使之生效

1
2
chmod +x /etc/hotplug.d/iface/99-ipv6
reboot

出于众所周知的原因,https://test-ipv6.com 这种难以直连的测试网站会受到诸多其他因素的影响,除此以外可以使用 https://test6.ustc.edu.cn 之类的 IPv6 only 网站进行测试。当然 ping -6 也是可以的。

使用 Nikki 作为透明代理

1
2
3
4
5
6
7
# only needs to be run once
wget -O - https://github.com/nikkinikki-org/OpenWrt-nikki/raw/refs/heads/main/feed.sh | ash

# for opkg
opkg install nikki
opkg install luci-app-nikki
opkg install luci-i18n-nikki-zh-cn

很不幸地,128 MB 的小水管在安装 Nikki 之后就显得很吃力了,以至于更新时 opkg 会吐槽剩余空间不足。

在不够幸运情况下,可能会因为网络问题难以得到 GeoIP 的数据。一个可能的解决方法是使用其他下载源,Nikki 也提供了替换下载地址的方法。以 https://github.com/Loyalsoldier/geoip 为例,在服务→Nikki→混入配置→GeoX配置中给出格式和对应的链接就可以了。

同时,需要把“外部控制配置”和“入站配置”之类存在密码的地方进行一些修改,总不能用默认的吧。

如果比较在意 DNS 泄露的问题,可以按照 https://gist.github.com/DepletedPrism/551bd5ff99045029135ce7ba8fdf017b 做类似的修改。

一个可能的问题是使用 SSH 连接 GitHub 时会提示 Connection closed by x.x.x.x port 22,此时可以让路由器额外考虑一下 22 端口,或者在 HTTPS 端口上使用 SSH。后者的方案可以参考 Github 文档,在文件 ~/.ssh/config 中写入

1
2
3
4
Host github.com
Hostname ssh.github.com
Port 443
User git

之后可以通过 ssh -T git@github.com 来验证配置是否有效。

后记

在 2025 年,我在配置 OpenWrt 时第一时间选择的方法是问问 ChatGPT。然而 LLM 在这一类问题中表现的并不好,在一些方向性的内容可能有指导意义,但具体的命令或是配置方法上仍有严重的幻觉。更好的做法是找到一些靠谱的教程然后一步步走,希望往后 AI 的发展能解决好这个问题。

配置 IPv6 的初衷是,深*校园网的计费策略仅统计 IPv4 流量,然而事实是即使存在完整的 IPv6 连接,也并不意味着 IPv4 流量就此绝迹了,实际体验下来一个月仍然存在不少 IPv4 流量(倒不如说根本没多少 IPv6 流量吧)。更广泛的做法是,使用代理将所有的出站流量通过 IPv6 转发,但此时需要额外做的工作也不少。另一种方法是,在校园网的不计费区域连接一台网络设备,并通过这台设备上网。具体怎么做,以后再说吧。

Changelog

2025.12.14

  • 因为手贱重置了路由器,被迫重新配置了一遍,顺手补充了一些细节。

参考资料