文章

校园网openwrt配置指南

校园网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 并配置好证书的路径。

本文由作者按照 CC BY 4.0 进行授权