关键词:软路由,OpenWrt,多设备上网,锐捷客户端认证,自动认证,IPv6穿透分配,宿舍内网组建。
-
至少三根网线;
-
软路由或多网卡主机(至少满足 512MB RAM + 256MB ROM);
-
无线路由器(可选);
-
USB 驱动器;
-
适当的计算机基础知识。
你需要能够准确理解下面在说什么,并具有一定的变通能力,这里不是所谓的傻瓜式一键教程。
-
该教程基于中山大学广州校区南校园网络环境+学生身份接入测试而得,实际请以所在校区实际为准;
-
校园网在非凌晨时段对全校限速,每台直接接入校园网的设备在限速时段具有下述特征(实验室、机房等单独配网的情况未测试):
-
从任一运营商出口的流量:生活区全局限速 70Mbps;该出口无 IPv6 特征;
-
从 CERNET 出口目标为北京的流量:限速与 1 相同;该出口具有 IPv6 特征,且 IPv6 优先;
-
从 CERNET 出口目标为其它地方的流量:限速相比于 1 减半(问题应该在 CERNET 上,学校应该没有主动限速);该出口 IPv6 特征与 2. 相同;
-
未出口,仅在校内流转的流量(未测试跨校区的流量):全局限速 100Mbps,IPv4 优先,且仅部分服务可使用 IPv6 连通,表现不佳。
- 中山大学 IPv6 分配在 CERNET 上,因此当您访问 CERNET 不可及的目标导致流量路由到运营商网络出口时,您无法使用 IPv6 特性。
- 校园网 IPv4/IPv6 为独立双栈结构,因此您可以顺利地直接访问 IPv6 目标(前提是 CERNET 可及),但上游未通过 RA/DHCPv6 通告 IPv6 DNS 服务器,因此即使下游客户端获得了 IPv6 地址和默认路由,但无法仅依赖 IPv6 完成域名解析,必须保持 IPv4 启用才能完成 IPv6 解析。很多检测网站也因此错误声称 IPv6 无法完全正常使用。您可尝试访问 mirrors6.tuna.tsinghua.edu.cn(清华大学开源软件镜像站仅解析 IPv6 的地址)来验证校园网 IPv6 的工作状态。
- 部分从教学楼接入的设备没有硬性限速,当单个 AP 接入人数少时,可以获得远超 70Mbps 的速度。这也从侧面证明了校园网限速在不同的场景下具有灵活的配置策略,但可以确定的是,几乎所有生活区都硬性限速 70Mbps。
-
-
校园网内在下游设备设置自定义 DNS 服务器无法生效,DNS 已被全局透明劫持,使用 DoH/DoT 将导致无法上网。
您似乎没有充分的且合适的理由更换 DNS。校园网出口依赖检查 DNS 报文来决定流量前往 CERNET 还是运营商网络,部分校内专属服务(如微软激活服务等)只支持使用校内 DNS 解析,因此您似乎没有充分的理由使用自定义 DNS。
- 个人宿舍内网搭建;
- 科学上网;
- 提供更加灵活的网络接入策略,摆脱校园网设备接入数限制;
- 对下游设备应用流量整形,使得流量出口更加合理,保证前台游戏、远程桌面延迟的同时,后台下载任务接近满速运行;
- 提供更加稳定的网络体验。
请先使用电脑接入有线网,检查你的宿舍是否能正常使用有线网。请参阅个人用户有线网络接入 | 中山大学网络与信息中心。
对于使用中国大陆网络的用户,你需要先确保当前电脑能够正常科学上网。你必须使用 TUN 模式使得一些不遵循系统代理的应用也能够拥有科学上网条件。
你应该使用 OpenWrt 在 GitHub 上最新的源码编译适合你的硬件的固件,因为我无法提供完全适用于你所拥有设备的固件,且 OpenWrt 每隔一段时间会发布更新,其中包含了安全修复,作为下游的仓库,这里可能无法及时同步更新,这将造成一定风险。对于重要的网络设备,你应该时刻保持它使用最新的固件以获得安全保障。请访问:openwrt/openwrt。
一些内核特性(例如 kmod-tun)必须在编译时期就启用,否则它们将在后期无法安装。你应当自行编译固件,官方提供的固件文件通常不包含这些内核特性。(你可以使用一些基于 OpenWrt 魔改的开源固件,但是它们可能包含你不需要的冗余功能,且对下述操作不做成功保证,建议你使用官方固件,仅启用个人需要的特性和插件,为你的设备量身打造。)该仓库提供了一份 .config 文件,适用于需要使用 OpenClash、qosify 等插件的情况,该配置文件启用了必要的依赖选项,并默认设置了适用于 x86_64_ext4_only_EFI 的编译产物。你可以使用该仓库提供的 .config 文件替换从官方下载的源码目录下的 .config 文件,用于快速启用那些依赖配置。
请注意:从 25.10 版本开始,OpenWrt 全面转向 apk 包管理体系,OpenWrt 官方下载源和清华大学开源软件镜像站已不提供 opkg 体系所需的文件。请勿在编译时将包管理体系修改为 opkg。
准备好文件后,即可开始按照官方说明开始对固件的编译工作。请注意:你必须在完成 ./scripts/feeds update -a 和 ./scripts/feeds install -a 操作后才能发起 make menuconfig,否则你替换的 .config 文件可能无法按预期表现。你不应当完全信任这份 .config 文件,因为随着版本的更新,有些选项可能失效,建议你花费少许时间检查需要的内核特性是否已正确启用。
完成固件编译后,请按照指引将你的固件以适当的方式刷入你手中的设备。
Update:经过多次编译工作,我准备了一份完整的编译指南。如果你能按照以下步骤复现,应该能够以较快的速度顺利完成编译。同时我将在 Release 中提供当前最新版的适用于 x86_64 的且包含下述步骤中所述特性的固件。由于个人精力有限,仅当最新版本存在安全更新时才会更新 Release 中提供的固件。如果你的设备不是 x86_64,则你可能必须按照下述步骤完成固件编译。我已尽个人最大努力尽可能以教科书式的、高信息密度的语言描述过程,若你仍有疑惑,建议你先查阅文档,然后咨询一些大语言模型。
我的环境如下:
Windows Subsystem for Linux(WSL)- Ubuntu Default Distribution,24 个逻辑处理器,理论可用 16094 MB 内存,可用硬盘空间为 55 GB。下述配置步骤将以该环境作为示例。
因此,对于您的个人设备,您必须至少提供以下配置条件才能以较快的速度完成编译工作:
- 多个核心的 CPU;
- 尽可能大的 RAM,使得 Linux 环境至少能够使用 8 GB及以上的内存;
- 充分大的磁盘空间,使得 Linux 环境的根目录至少能够使用 55 GB 及以上的存储空间;
- 适当的网络环境,使得在 Linux 环境能够以稳定的状态访问
git.openwrt.org和github.com。
-
按照 Microsoft 官方文档,完成对 WSL 的初始化配置。
-
进入 WSL 环境,执行
sudo nano /etc/apt/sources.list.d/ubuntu.sources,随后将文件替换为以下内容并保存:Types: deb URIs: https://mirror.sysu.edu.cn/ubuntu/ Suites: resolute resolute-updates resolute-backports Components: main universe restricted multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg # 安全提示:不建议将下方的链接也更改为镜像站,镜像站同步安全更新存在延迟。 Types: deb URIs: https://security.ubuntu.com/ubuntu/ Suites: resolute-security Components: main universe restricted multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg然后执行
sudo apt update,等待操作完成。 -
执行下述命令以在全新环境中完成对编译依赖的配置:
sudo apt install -y bzip2 flex libz-dev make subversion unzip which build-essential clang bison gcc-multilib g++-multilib gettext libssl-dev swig
-
在每次会话启动后,执行
echo $PATH,检查返回的结果是否包含空格,请通过export PATH=<Your variable>移除那些包含空格的项目; -
执行
cd,切换到 Linux 内部文件系统的家目录,然后执行:wget https://github.com/openwrt/openwrt/archive/refs/tags/v25.12.4.tar.gz
链接因当前版本而不同,请前往 OpenWrt 仓库的 Release 页面获取最新链接。然后执行
tar xvf v25.12.4.tar.gz以解压该压缩包。随后执行cd openwrt-25.12.4。 -
执行
./scripts/feeds update -a,等待操作完成;然后执行./scripts/feeds install -a,等待操作完成。 -
执行
make menuconfig,在接下来的页面完成下述设置:勾选:通常是指通过选中项目以后,按下空格键使得对应项目前的勾选状态变为星号 <*>。
- 在
Target System和Subtarget中选择适合你设备的架构; - 前往
LuCI:- 前往
1.Collections,勾选luci; - 前往
2.Modules:- 勾选
luci-compat; - 前往
Translations,勾选Simplified Chinese (zh_Hans);
- 勾选
- 前往
- 前往
Base system:- 取消勾选
dnsmasq,勾选dnsmasq-full;
- 取消勾选
- 前往
Utilities:- 前往
Shells,勾选bash; - 前往
Compression,勾选unzip;
- 前往
- 前往
Network:- 勾选
ipset; - 前往
File Transfer,勾选curl; - 前往
Routing and Redirection,勾选ip-full;
- 勾选
- 前往
Languages,前往Ruby,勾选ruby,ruby-yaml; - 前往
Kernel modules:- 前往
Network Support,勾选kmod-tun,kmod-inet-diag; - 前往
Netfilter Extensions,勾选kmod-nft-tproxy;
- 前往
然后,Exit and Save。
- 在
-
执行
make download,等待操作完成。 -
执行
vi package/feeds/packages/rust/Makefile,将第 79 行set=llvm.download-ci-llvm设置为false。 -
执行
make -j N,其中 N 的值请遵循下述约束使用尽可能大的值,值越大编译速度越快:- N 的值不能超过当前 Linux 当前可用核心数 + 1;
- N 的值越大,编译过程中占用的 RAM 越大,如果设置的 N 太大导致超过最大 RAM 限制使得编译进程被杀死,你必须重启 WSL 环境,然后重新定位到工作目录,执行
make -j N,尝试调小 N 的值; - 有时你可能遇到一些错误。如果你按照上述指引操作,编译错误的概率应该会大大降低,如果你需要定位具体错误以寻求相关帮助,请给
make命令添加V=s选项; - 参考:对于我的示例环境,N = 18 是恰到好处的充分利用资源的设置,你应该关闭 Windows 上运行的绝大多数程序以给 WSL 预留足够的资源。25 分钟无报错顺利完成编译。
-
编译好的产物存放在
./bin/targets/。
请转到当前电脑正在使用的 Clash Verge 的配置目录,取出 clash_verge.yaml 文件,它形如:
请按照 OpenWrt 官方指引,将固件以恰当的方式刷入你的设备。
对于 x86设备,如遇到文件系统错误导致调整 rootfs 分区大小操作失败,请按以下方法处理。
重启至 Ubuntu LiveCD,执行终端:
lsblk -f可能得到:
sda ├─sda1 vfat └─sda2 ext4例如此处的
/dev/sda2即是需要扩容的 rootfs 分区,请检查该分区是否被挂载:mount | grep sda若
/dev/sda2已挂载,请执行卸载:sudo umount -l /dev/sda接下来请按顺序执行下述命令:
sudo e2fsck -f -y /dev/sda2 sudo resize2fs -f /dev/sda2 sudo e2fsck -f -y /dev/sda2 sudo parted /dev/sda (parted) print执行到此处时,若询问
Fix/Ignored,输出F回车确认,记住/dev/sda2的number(这里是2),然后继续执行:(parted) resizepart 2 100% (parted) quit sudo resize2fs /dev/sda2 sudo e2fsck -f /dev/sda2如果最后没有报错,或得到 harmless 的结果,则执行
reboot以启动 OpenWrt。
以具有三网口(eth0 作为 WAN,eth1 和 eth2 作为 LAN)软路由为例:
- 选择合适的 LAN 口与电脑连接,确保电脑可获取到类似
192.168.1.*的 IPv4 地址; - 电脑 Web 访问
192.168.1.1--> Log in(无密码) --> 按照提示设置密码后重新登录; - 转至 http://192.168.1.1/cgi-bin/luci/admin/network/network 的接口选项卡,确认当前连接的端口,然后按以下截图配置:
切换到设备选项卡,然后配置 br-lan,如图所示:
-
(可选)将电脑单独与无线路由器(不接 WAN 的状态)相连,将路由器地址改成
192.168.3.1; -
将软路由的 eth0 与宿舍墙面端口相连,eth1 与无线路由器 WAN 口相连,电脑与无线路由器 LAN 口相连。
-
在电脑上用终端通过 SSH 连接路由,使用 SCP 将 MiniEAP 的 apk 包传入路由器
/tmp/目录(已在 Release 上传适用于 x86 的包,若需要构建其它平台,请参考以下方法构建。首先为你的设备下载对应的 SDK 文件(清华大学开源软件镜像站 - OpenWrt Downloads)并解压
cd /path/to/your/sdk git clone --depth 1 --branch main https://github.com/RenAhsAcme/SYSU-Network-Solution.git package/minieap make menuconfig # choose `minieap` in section `Network` make package/minieap/compile V=s
然后取出 MiniEAP apk 产物。
你可以参阅 [OpenWrt Wiki] Using the SDK 了解更多信息。
-
然后执行下述命令:
apk add --allow-untrusted /tmp/upload.apk minieap -u (NetID用户名) -p (NetID密码) -n (WAN口的实际硬件名称,这里是eth0) -w -b 3 --module rjv3
-
确认能够请求到认证成功的信息,然后按 Ctrl + C退出,接着执行:
vi /etc/minieap.conf
-
进入 vi 的插入编辑模式,去掉
no_auto_reauth=1这一行(如无,请忽略),然后退出保存,接着执行:cat > /etc/init.d/minieap << 'EOF' #!/bin/sh /etc/rc.common START=99 USE_PROCD=1 start_service() { procd_open_instance procd_set_param command /usr/sbin/minieap procd_set_param respawn procd_set_param stdout 1 procd_set_param stderr 1 procd_close_instance } stop_service() { /usr/sbin/minieap -k } EOF chmod +x /etc/init.d/minieap killall minieap /etc/init.d/minieap enable /etc/init.d/minieap start
此时查看下游设备应该可以正常上网。
- 转到 vernesong/OpenClash,按照 Wiki 等相关指引完成适合你的科学上网配置。
以下思路为过往探索时所进行的一些工作,但由于个人当前设备及网络需求发生了极其复杂的变化,该规则灵活性不足,在极端情况下可能影响用网体验,因此不再建议使用。本部分内容仅供参考。
利用流量整形实现在下游设备上大流量任务进行的同时保证小包传输延迟不发生剧烈抖动,适用于保证前台游戏延迟体验的同时在后台进行近乎满速的大流量下载任务,远程桌面同时下载大包保证不发生画面卡顿。如果需要,你还可以部署多设备竞争条件,使得速度分配更加公平。灵感来源于校园网对全校流量实施的深度优化,确保所有人公平用网的手段。
如使用该仓库提供的 .config 文件完成编译,得到的固件默认安装 qosify,请通过以下步骤完成配置。
-
请修改
/etc/config/qosify文件如下:config defaults list defaults /etc/qosify/*.conf option dscp_prio video option dscp_icmp +besteffort option dscp_default_udp besteffort option prio_max_avg_pkt_len 500 config class besteffort option ingress CS0 option egress CS0 config class bulk option ingress LE option egress LE config class video option ingress AF41 option egress AF41 config class voice option ingress CS6 option egress CS6 option bulk_trigger_pps 200 option bulk_trigger_timeout 3 option dscp_bulk CS1 config interface wan option name eth0 # 你的实际WAN接口 option disabled 0 option bandwidth_up 66mbit # 改成真实带宽90~95% option bandwidth_down 66mbit option overhead_type none option ingress 1 option egress 1 option mode diffserv4 option nat 1 option host_isolate 1 option autorate_ingress 0 option ingress_options "dual-dsthost nat" option egress_options "dual-srchost nat ack-filter" option options "besteffort triple-isolate no-squash-dscp" config device wandev option disabled 0 option name eth0 option bandwidth 66mbit -
请新建并修改
/etc/nftables.d/qosify-extra.nft文件如下:chain qosify_postrouting { type filter hook postrouting priority mangle; meta length < 200 counter ip dscp set cs6 ct state new counter ip dscp set cs6 meta length > 1200 counter ip dscp set cs1 ct bytes > 10000000 counter ip dscp set cs1 # Tailscale 优先,如果你需要使用内网穿透服务。 udp dport 41641 ip dscp set cs6 udp sport 41641 ip dscp set cs6 } -
然后,请执行以下命令重启相关服务以使配置生效:
/etc/init.d/firewall restart /etc/init.d/qosify restart
本部分内容初衷是为了解决极端网络环境下 Tailscale 穿透成功率低的问题,但在常规用网(如在学校内不同地点的互联)环境中并不存在该问题,因此该部分所述内容可能具有伪需求之嫌。如果您没有这方面的极端需求,可以忽略这里的描述。本部分内容仅供参考。
由于本人做网络拓扑时引入了两层 NAT,导致从运营商网络发起穿透的成功率不高。因此考虑在 OpenWrt 再部署一个 Tailscale 以提高内网穿透成功率。如果你已经能正常穿透,请跳过这部分内容。
-
Tailscale 下载页面选 Other,跳转到 Stable release track
-
用
wget获取文件直链,然后按如下解压:opkg update opkg update tar tar xvf tailscale_VERSION_ARCH.tgz
-
把可执行文件移到
sbin里,如下:cp tailscale_VERSION_ARCH/tailscale /usr/sbin/ cp tailscale_VERSION_ARCH/tailscaled /usr/sbin/ chmod +x /usr/sbin/tailscale* -
写守护脚本
/etc/init.d/tailscale#!/bin/sh /etc/rc.common START=99 USE_PROCD=1 start_service() { mkdir -p /var/run/tailscale procd_open_instance procd_set_param command /usr/sbin/tailscaled \ --state=/etc/tailscale/tailscaled.state \ --socket=/var/run/tailscale/tailscaled.sock procd_set_param respawn procd_close_instance }
-
调用启动
/etc/init.d/tailscale enable /etc/init.d/tailscale start -
执行
tailscale up,然后在浏览器验证令牌 -
在 Interface 部分给硬件
tailscale0建一个tailscale0的 interface,不需要任何 Manage。 -
在 Firewall 部分给这个 Interface 建一个 Zone,策略为输入 Drop,输出 Accept,区域内转发 Accpet。
进入 SYSU 后,发现前人给到的资源太过松散,于是折腾了一些时间,做一个通用的一站式方案出来,希望能帮到你。
如果你还有灵感,请在 Issue 中告诉我。
你应当遵循该仓库包含的其它文件的所有开源协议。特别感谢他们对开源社区的贡献。
如果上述内容侵犯了您的相关权益,您可以通过邮件联系我删除。
由于 Pull Request 之前发生过潜在的隐私泄露风险,Pull Request 的不可删除特性,为了保护我的隐私,已阻止对 Pull Request 的访问。如果您希望贡献仓库,请将修改完成的文件上传到 Issue,谢谢!




