校园网openwrt配置指南
笔者在这两天重新在一台arm设备上部署了openwrt作为主路由,并恢复了旧版本的配置。作此博客以记录踩过的坑和以防万一boom之后快速恢复。
笔者的设备是 nanopi R5S,处理器是四核64位Cortex-A55的RK3568,4G内存16G eMMc,使用的固件是友善官方提供的 FriendlyWrt 24.10。校园网环境可以获取公网IPv4(但是会被校园网防火墙ban掉所有由校园网外部发起的连接,所以还是只能在校园网内互联),并且公网IPv6只能获取128位地址,因此不经过特殊设置例如NAT6,LAN下设备无法使用IPv6。
NAT66
在 OpenWrt 主页存在一篇关于配置 NAT66 的文档,但这篇文档是不正确的(或者说不完善的)。首先其在 firewall3 和 ip6tables 上不可用,其次根据文档所述操作后,还需要额外配置才能正常使用。现将完整操作记录如下。
在确保 WAN 口能正确获得一个 128 位的IPv6地址后,做如下操作:
1
2
3
4
5
6
7
8
9
# Configure firewall
uci set firewall.@zone[1].masq6="1"
uci commit firewall
service firewall restart
# Configure network
uci set network.WAN6.sourcefilter="0"
uci commit network
service network restart
然后编辑 /etc/sysctl.conf
,添加如下几行:
1
2
3
4
net.ipv6.conf.default.forwarding=2
net.ipv6.conf.all.forwarding=2
net.ipv6.conf.default.accept_ra=2
net.ipv6.conf.all.accept_ra=2
重启设备,不出意外的话 LAN 下设备能够访问 IPv6 网站了。
nginx
笔者在 LAN 下还有一台 nas,开放了若干端口提供诸如 jellyfin 和 qbit 等服务,同时笔者希望在校园网内通过http和https的默认端口访问,因此需要配置反向代理。这里笔者选择了 nginx,但更推荐使用caddy。
由于我们要监听 80 和 443 端口,而这两个端口已经被 uhttpd 占用了,所以要做的的第一件事就是让 nginx 接管 luci。不出意外地,已经存在 luci-nginx
软件包,安装时会自动禁用 uhttpd、安装 uwsgi 等必要以来并以 nginx 接管 luci。值得注意的是,这样配置的 nginx 会在每次启动时重新生成主配置文件,所以在 /etc/nginx/uci.conf
中做的一切修改都会被覆盖。正确的方式是在 uci 中查看和修改。例如 nginx 会生成一个自签名证书,如果想改用自己的证书(下文会提到如何使用 acme 生成),可以这样做:
1
2
3
uci delete nginx._lan.uci_manage_ssl # 删除 uci 默认使用的 self-signed certificate
uci set nginx._lan.ssl_certificate='/path/to/crt' # 修改为自己的crt和key
uci set nginx._lan.ssl_certificate_key='/path/to/key'
最后,可以在 /etc/nginx/conf.d
下创建自己的反向代理配置文件。例如笔者的 jellyfin 配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 443 ssl;
ssl_certificate /etc/nginx/conf.d/example.com.cer;
ssl_certificate_key /etc/nginx/conf.d/example.com.key;
server_name video.example.com;
location / {
proxy_pass http://192.168.1.114:8096;
proxy_http_version 1.1; # 用于支持 syncplay
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 1800s;
proxy_send_timeout 1800s;
proxy_connect_timeout 1800s;
proxy_set_header Host $host; # 用于“受信任的反向代理服务器”
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
}
}
acme
笔者拥有一个域名,并将其解析到了校园网下主路由的 IPv4,以实现校园网内通过域名的访问。但是很多安卓应用(比如jellyfin)不支持 http 和不受信任的 https 证书,此外大多浏览器也会有“不安全”的提示,因此一个受信任的证书是非常必要的。这里笔者使用了 acme 自动地申请和应用证书。
首先,安装 acme:
1
curl https://get.acme.sh | sh -s email=my@example.com
然后在安装目录(默认是~/.acme.sh
)下:
1
2
3
export CF_Key="763eac4f1bcebd8b5c95e9fc50d010b4"
export CF_Email="alice@example.com" # 你的 DNS 解析服务商的 API-key
./acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'
等待执行完毕,在当前目录就可以看到申请到的证书。
acme 同时支持自动地将证书部署到反代服务器:
1
2
3
4
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "/etc/init.d/nginx restart"
可以使用如下指令查看已安装的证书:
1
acme.sh --info -d example.com
至此,可以放心地将除了域名续费以外所有的事情交给 acme 了,它会创建定时任务,每天查看证书到期时间,并在合适的时候更新证书、安装到指定位置并重启反代服务器。
OpenClash
从 OpenClash 主页下载最新的软件包并在 OpenWrt 上安装。之后在 luci 中下载 meta 内核,导入自己的订阅等信息即可。
需要注意的是,OpenClash 默认不启用 IPv6 DNS 解析,如果不手动打开则会导致无法正确解析域名到 IPv6 地址;此外,如果想绕开 NAS 中 BT 的流量,可以 ban 掉 NAS 的 IP 或者 ban 掉指定端口。
最后,笔者希望在 WAN 口向校园网内的设备提供 Clash 服务,方便自己的移动设备和组里的服务器使用。除了取消勾选 OpenClash 中仅在 LAN 提供服务的选项外,还需要在防火墙中允许 WAN 入站数据和区域内转发。以及别忘了设置认证。
Tailscale
正常安装配置即可。启动参数如下:
1
tailscale up --advertise-exit-node --advertise-routes 114.212.0.0/16
然后在输出的 url 中完成登录。
最后,如果需要在校园网外使用域名(解析到 WAN 口 IP)访问路由器和其他服务,需要为 tailscale 创建接口,配置防火墙区域并允许其和 WAN 区域的双向转发。
ttyd
在配置 nginx 后,ttyd 会变得无法使用,需要启用 https 并配置好证书的路径。