Featured image of post Openwrt 硬路由实现校园网共享和多号多拨

Openwrt 硬路由实现校园网共享和多号多拨

本文记录了用一台Openwrt硬路由实现校园网/校园宽带共享,多号多拨,负载均衡,端口转发,校园网流式传输,IPv6配置等实践

0x00 前言

好耶!是路由器

0x01 硬件准备

学校宿舍的网络环境是需要认证的,所以需要一个路由器来实现局域网内的设备共享校园网。同时,由于学校网络环境要认证,或者是后续多号多拨的需求,需要一个能够刷 Openwrt 的路由器。

本文使用的是 Imou LC-HX3001,这是一款移动定制版的MT7981芯片的路由器,在23年10月不到80块就能拿下,支持免拆刷入 Openwrt,具体刷机方法可以参考 这里

Imou LC-HX3001

当然没必要选择这款路由器,即使是mt7981也有多款路由器可以选择,比如 小米 WR30U/T/M360 T7 等等。

同时,需要电脑和网线,学校断电的话可能需要一个 UPS,可以DIY一个。

0x02 编译 Openwrt

选择哪个分支

由于 Imou LC-HX3001 并未被Openwrt 合入主线支持,所以可以选择 immortalwrt,这是一个基于 Openwrt 的分支,支持了很多新的硬件。

TL;DR: 如果你不想编译,可以直接从 ImmortalWrt Firmware Selector 下载固件。

由于硬路由的CPU性能有限,而mt7981是支持硬件加速的,所以可以选择 immortalwrt-21.02 分支,这个分支支持了很多硬件加速的功能,比如 mtk-eip93mtk-crypto 等等。

最终选择了 immortalwrt-mt798x 这个分支,这个分支是基于 immortalwrt-21.02 的,支持了 mt7981 的硬件加速和更多的硬件支持。由于因为Mediatek Sdk的 openwrt feeds 还没支持 op23,这个分支目前停留在 immortalwrt-21.02 ,参见 Issue #180

immortalwrt-mt798x 的支持列表可以参考 这里

编译

1
2
3
4
5
git clone --depth=1 https://github.com/hanwckf/immortalwrt-mt798x.git
cd immortalwrt-mt798x
# 更新 feeds
./scripts/feeds update -a
./scripts/feeds install -a

然后可以通过 make menuconfig 来配置固件,这里选择目标设备的机型即可。

1
2
3
# 对于mt7981,使用mt7981-ax3000.config
cp -f defconfig/mt7981-ax3000.config .config
make menuconfig

make menuconfig

如果需要多号多拨,负载均衡等功能,可以在 Network 中选择 luci-app-syncdialluci-app-mwan3 插件加入编译。

然后就可以开始编译了

1
make -j8 V=s # 8线程编译

编译完成后,可以在 bin/targets/ 目录下找到编译好的固件。

0x03 刷入 U-boot

U-boot是一款开源的引导加载程序,可以用来刷入Openwrt。由于不同的路由器有不同的U-boot,所以需要先刷入支持Openwrt的U-boot。对于软路由可以省略这一步。

不同设备刷入U-boot的方法不同,但 MT798x 的路由器可以拆机焊接TTL线,通过串口进入官方MTK控制台(采用custom U-Boot layout)。即可刷入Openwrt,但由于支持有限,所以需要先刷入 支持OpenWrt U-Boot layout 的U-boot。

部分路由器可以直接通过Web解锁ssh进而刷入U-boot。具体需要Google你的路由器型号。

部分U-boot提供了不死 U-boot的功能,不死U-boot是指其集成了Web服务,可以在固件损坏时通过按键(Reset或Mesh)启动该web服务,通过浏览器上传固件到路由器的内存,然后写入SPI或其他非易失存储器,从而恢复固件,达到不死的效果。

0x04 刷入 Openwrt

长按重置键进入U-boot模式,由于U-boot没有DHCP,需要给电脑设置一个静态的IP地址,插入网线连接电脑和路由器LAN口,电脑设置静态IP为192.168.1.2,子网掩码255.255.255.0,网关192.168.1.1,然后在浏览器访问192.168.1.1,上传固件,选择和固件对应的布局,然后刷入。

0x05 配置 Openwrt

网络配置

通过SSID为ImmortalWrt的开放Wifi连接到路由器,然后在浏览器访问192.168.1.1,进入Openwrt的管理界面LUCI

首先设置Openwrt的管理员密码,然后设置SSID密码。在网络->无线中分别设置2.4G5GSSID,加密方式选择mixed WPA2/WPA3 PSK, SAE,密码设置为8-63位的密码。

网络->无线设置

然后在网络->接口中设置上网方式了,这里需要根据学校的网络环境来设置,在南航可以使用PPPoE拨号上网,在接口中编辑WAN,协议选择PPPoE,然后填写学号和密码,服务名称填写nuaa,然后保存应用。即可获取到IPv4地址。 南航亦可以使用DHCP上网,电脑会自动获取到IP地址,这时候可以在接口中编辑WAN,协议选择DHCP,然后保存应用。即可获取到IPv4地址。但此时还需要通过网页认证。可以写一个脚本来完成。值得注意的是,通过宿舍网口似乎在广播域内存在多个DHCP服务器,只有10.98.0.0/15的IP地址才能跳转到NUAA认证页面使用校园网。脚本中还需要加入重复DHCP直到获取这个网段的IP地址的逻辑。

如果不喜欢192.168.1.0/24这个局域网网段,可以在网络->接口中编辑LAN,然后修改IPv4地址子网掩码DHCP服务器地址池,然后保存应用。

多号多拨

对于一个校园网账号只能同时在线2-3个设备,如果有多个账号,可以通过多号多拨来实现多个账号同时在线,达到带宽叠加的效果,实测在多线程下载时,带宽可以叠加。但是由于学校的网络环境不稳定,可能会导致某个账号掉线,所以需要设置一个定时任务来检测账号是否掉线,如果掉线则重新拨号。

luci-app-syncdial 是一个Openwrt的插件,可以实现多号多拨自动配置和重拨,可以在系统->软件中搜索luci-app-syncdial,然后安装。但最好在编译时就将其集成进固件。

安装完成后,可以在网络->多号多拨中配置多号多拨,选择单线多拨,设置四个wan口,然后保存并应用。随后在网络->接口中可以看到四个VWAN,分别设置协议为PPPoE,然后填写不同学号和密码,服务名称填写nuaa,然后保存应用。即可获取到IPv4地址。注意这里要在编辑WAN的时候在高级设置中将使用网关跃点设置为四个不同的数值如 11,12,13,14,这样可以在负载均衡中区分他们。

使用网关跃点

负载均衡

Refer: OpenWrt中利用MWAN3负载均衡实现带宽叠加

luci-app-mwan3 实现负载均衡,以便实现多号多拨的带宽叠加。否则默认只会通过一个WAN口上网。

安装luci-app-mwan3,然后在网络->负载均衡中配置负载均衡,需要依次配置接口,成员,策略规则

接口列表中,删除所有默认接口。并在下方新增,输入接口名称(vwan0-vwan3注意:接口名称必须与 网络->接口 页面配置的接口名一致),勾选已启用,保存并应用。使用MWAN3策略的各接口网关跃点必须不同。

切换至 “成员” 选项卡,删除所有现有成员,并在左下角 “新增” 处,输入成员名称 “wan0_m1_w1”(其中,m1表示跃点数为1,w1表示权重为1,并非一定要按此格式命名,也可自行命名),单击回车按键。

在弹出的成员配置页面,输入跃点数和权重。如果希望均匀分配wan0~wan3 四个出口链路,则每个成员的跃点数和权重均设置同样的值(如1)即可。

编辑完成后,点击右下角 “保存” 按钮,并返回值概览。

重复上述步骤,依次添加wan0_m1_w1~wan3_m1_w1共4个成员。全部添加完毕后,在成员概览页面,点击右下角的 “保存并应用” 按钮。

切换至 “策略” 选项卡,删除所有现有策略,并在左下角 “新增” 处,输入策略名称 wan_balance(也可自行命名),把所有成员添加到策略中,保存并应用。

切换至 “规则” 选项卡,可选择自行添加规则,或直接对现有的default_rule_v4default_rule_v6https规则进行修改。对每个规则,选择策略为wan_balance,保存并应用。由于目前学校不给宿舍分配ipv6,所以只需要配置default_rule_v4即可。

这样就完成了负载均衡的配置。每个网口的权重一致,所以每个网口的流量会均匀分配25%。

负载均衡

端口转发

网络->防火墙—>端口转发中可以配置端口转发,比如将WAN4627端口转发到LAN的你的电脑的3389端口,这样就可以在校园网内远程桌面连接你的电脑了。

连接时要使用WANIP地址和暴露WAN的端口4627

添加RDP端口转发

DDNS

但是WAN口的IP地址是动态的,所以需要使用DDNS来动态解析WAN口的IP地址,这样就可以通过域名来连接你的路由器了。

这一步需要你有个域名,可以在dnspodcloudflare等域名服务商购买。

安装luci-app-ddns-go,然后在服务->DDNS-go中启用,进入DDNS-go的配置页面,首先选择DNS服务商,然后填写Token

alt text

IPv4地址的获取方式选择通过网卡获取,选择WAN,然后填写域名,在最底部保存。之后就可以通过域名解析到你的校园内网IPv4地址了。

0x06 请给我一个IPv6

校园宽带

不幸的是,南航校园网在宿舍区有线上网拨号不会获得IPv6地址,所有对于需要IPv6的应用,有两个选择:

一是使用树莓派这种带无线网卡的设备,连接到SSID nuaa.wifi6,这样会获取到双栈IPv4IPv6地址,然后在树莓派上配置WireGuard,实现对路由器内网设备的访问。这种方法还需要NAT64/NAT66,不是很方便。而且无线网速度不如有线,共享出来也没有意义。

二是办校园宽带,实测移动宽带可以通过DHCPv6获取IPv6-PD地址,前缀长度为60,足够用于SLAAC和DHCPv6分配IPv6地址。

无状态 IPv6 地址自动配置(SLAAC)是 IPv6 地址自动配置的一种方式,它不需要 DHCPv6 服务器,而是通过路由器发送的 RA(Router Advertisement)包来配置 IPv6 地址。在 OpenWrt 上,只需要在 WAN 口配置 IPv6 地址为 DHCPv6,并在 LAN 口配置 IPv6 地址为 无状态 即可。

对于第二种方法,需要在网络->接口中编辑WAN,协议选择DHCPv6,然后保存应用。即可获取到IPv6地址。

网络->接口->全局网络选项中把IPv6 ULA 前缀的值清空.

全局网络选项

LAN中设置DHCP服务器->IPv6设置中设置 RA 服务为混合模式,DHCPv6 服务为混合模式 IPv6设置

同时使用DHCPv6SLAAC的优点在于,DHCPv6可以为主机提供更多的配置信息,如DNS服务器地址,而SLAAC只能为主机提供IPv6地址。主机可以选择使用SLAAC来配置IPv6地址,然后使用DHCPv6来提供DNS服务器地址。

IPv6 RA 设置启动SLAACRA 标记受管配置(M)|其他配置(O)

在IPv6中,路由器通告(RA)包含两个重要的标志:受管配置标志(M)和其他配置标志(O)

受管配置标志(M):当设置为1时,表示主机应使用DHCPv6获取其IPv6地址。当设置为0时,表示主机应使用无状态地址自动配置(SLAAC)来获取其IPv6地址。

其他配置标志(O):当设置为1时,表示主机应使用DHCPv6获取除IPv6地址外的其他配置信息,如DNS服务器地址。当设置为0时,表示主机不应使用DHCPv6获取其他配置信息。

这两个标志可以组合使用,

IPv6 RA 设置

保存并应用,局域网内的设备就可以获取到IPv6地址了。

局域网VPN

为了能愉快地在教室或者是任意场合摸鱼访问宿舍局域网上的各种服务,比如NAS,或者通过路由器的校园网出口访问校园网内的服务,比如图书馆的数据库,需要实现虚拟局域网,把不同的局域网通过路由器连接起来。

这里我使用Tailscale,Tailscale是一个基于WireGuard的虚拟局域网服务,可以实现不同设备之间的互联,而且支持IPv6,自动穿透NAT,在设备均为IPv6的情况下,可以建立对等连接。

根据 Tailscale官方文档,可以在Openwrt上安装Tailscale,然后在Tailscale的网站上注册一个账号,然后在路由器上运行tailscale up,然后在其他设备上运行tailscale up,即可实现设备之间的互联。