宿舍校园网配网指南

0、前言

众所周知,校园网在大多数学校都是又贵又烂。我们学校允许拉运营商宽带,但是千兆网(在没有活动的情况下)价格不菲,学校提供的无线网已经能有无线 300Mbps、有线 100Mbps(问就是我们这栋楼设备老旧)的速度;再加上如果拉运营商宽带,访问校内资源就需要连接 VPN,因此我选择忍气吞声使用校园网,在现有网络设施的基础上尽量让自己用得舒服点。

1、准备工作

1.1、网络环境分析

  • 设备数限制:3 设备,判断方式:MAC 地址;
  • 认证方式:锐捷 Web 认证,学号+密码(偶尔会有验证码,现在不知道啥情况,登录必跳验证码);
  • 连接方式:有线网口每寝室 2 个(我桌子底下正好有一个),无线网分为 2.4Ghz 和 5Ghz 两个,公开网络,连接后跳转到认证页面;
  • IPv6:有线网会自动分配 IPv6;无线网没有,需要手动指定,我测试过程中未成功获取。

1.2、需求分析

  • 物联网设备需要连接 2.4Ghz WiFi,并且没有 GUI 给我输入认证信息,再加上设备比较多,限制 3 设备完全不够用,因此需要接一个路由器使用
  • 有线网只有 100M,但是无线网有接近 300M;有线网有 IPv6,无线网没有(我不会手动分配 XD),因此最好是 IPv4 走无线,IPv6 走有线。
  • 使用软路由作为 NAS。

2、采购

采购分了两三次,因为之前也没折腾过类似的东西,需求也是在折腾过程中逐渐明确。下表列出了大致开销:

  1. 软路由:J1900,4G+128G,共 240;
  2. 无线网卡:MT7921,价格 50;
  3. 软路由主板:为什么又买了一次我后面再说,价格 120;
  4. 网线:4 根 6 类千兆,共 20;
  5. 电源延长线:DC5525,价格 15;
  6. 无线路由:小米 4A 千兆,价格 50;
  7. 自配电源:DC5521,共 40;
  8. 电源转接头:DC5521 母转 DC5525 公,价格 5。

共 540 元。

如果复刻方案且不踩坑,需要花费:

  1. 软路由+电源:330;
  2. 无线路由+电源:70;
  3. 网线(实际使用三根):15。

共 415 元。

其他硬件如插座等不计入其中。

3、部署流程

3.1、配置软路由

首先用网线按照如下方法连接:

Text
1
电脑 <-> 软路由 <-> 有线网口

部署过程中不需要把路由器塞到规划好的位置,先放在外面会比较方便,毕竟后面可能还需要改变接线。

如果卖家已经刷好系统,直接登录即可,否则需要自行安装软路由系统。这里使用基于 OpenWRT 的 iStoreOS。

在终端中 curl 任意网址,会显示一个重定向页面,复制其中:

Text
1
http://<IP>:<PORT>/eportal/index.jsp?wlanuserip=aaaa&wlanacname=bbbb&ssid=cccc&nasip=dddd&snmpagentip=eeee&mac=ffff&t=wireless-v2&url=gggg&apmac=&nasid=hhhh&vid=iiii&port=jjjj&nasportid=kkkk

类似的链接并打开,登录校园网账号,即可上网。

提示:
原理是使用电脑浏览器替代软路由打开 Web 认证,而上述链接是由软路由请求获得的,携带的是软路由的 MAC 地址,因此如果校园网支持无感认证(即绑定 MAC),使用此方法认证后软路由即可作为路由器,给子网中的设备提供网络。

然后正常配置 Docker、OpenClash 等即可。

软路由一般没有无线网卡,这里不推荐购买 MT7921,这块网卡存在散热问题。可以使用 MT7925 等无重大缺陷的网卡。

在购买网卡后,我发现主板上的 MiniPCIe 接口是全高的,而网卡是半高的,然后什么都不懂的我尝试用钳子将螺丝柱拧下再拧至半高位置的孔上(后面才知道不能这样做),不但没有成功,还把一个小电阻磕下来了,再次通电时发现无法正常启动。

提示:
正确方法是接上 MiniPCIe 半高转全高的铁片。

转接片

于是我重新换了一块主板,新的主板正好是半高 MiniPCIe 插槽,于是顺利装上。

此时内网测速:980Mbps。

3.2、配置无线网

插上无线网卡后如果有对应驱动,iStoreOS 可以自动识别并在菜单栏中显示“无线”选项。

我本打算使用这块无线网卡提供 WiFi,结果:

  • 这块网卡不支持 2.4Ghz/5Ghz 同时开启,只能二选一;
  • 物联网设备一般只支持 2.4Ghz;
  • 移动设备需要 5Ghz 以获得更快的网速;
  • 我的手机连接软路由的 2.4Ghz WiFi 会有诡异的现象,网速只有 6Mbps。

综上,忍受了数天后我决定买一个无线路由器提供无线网。

我的软路由只有 2 个网口,一个 LAN 一个 WAN,而无线路由是 4 个网口,三个 LAN 一个 WAN,因此我是这样接线的:

Text
1
电脑 <-> 无线路由 <-> 软路由 <-> 有线网口

这样实际只需要 3 根网线。多的一根就当备用了,一起买的也不好退

启动无线路由后进入配置向导,选择“有线中继”模式即可将无线路由作为 AP 使用。

此时内网测速:950Mbps。可见中间多了一台无线路由,并没有显著影响内网速度。

3.3、无线路由刷 OpenWRT

软路由上使用 AdGuard 提供 DNS 服务,查看日志发现有大量 api.miwifi.com 的请求,屏蔽了之后还是感觉怪怪的,遂刷机。

使用脚本:

GitHub - acecilia/OpenWRTInvasion
https://github.com/acecilia/OpenWRTInvasion

输入路由器后台地址和密码,等待片刻即可开启 SSH 和 Telnet。

参考:

小米路由器 4A 千兆版(R4A)刷 OpenWRT 官方固件(附 Telnet 连接失败解决方案)
https://www.right.com.cn/forum/thread-6074185-1-1.html)

成功刷入 Breed 后,进入 192.168.1.1 刷入固件。此后长按机身 Reset 键恢复出厂设置,也是回到刷完固件之后的状态。

这次我打开了无线路由的 DHCP,这样可以在无线路由的后台管理设备,而不是在软路由。

无线路由器就支持同时开启 2.4Ghz 和 5Ghz,我将 SSID 分开设置,以免物联网设备被自动切换到 5Ghz WiFi。

3.4、软路由无线中继

在无线页面点击扫描:

扫描

选择校园网 WiFi 加入:

加入 WiFi

学校无线网一般是双频分开,建议选择 5Ghz,并填写对应的 BSSID,以免切换到更远的 AP:

输入信息

如果有已认证的、空余的 MAC 地址,可以直接填入,无需再次用上述方法认证:

指定 MAC

然后就可以保存提交了。

4、后记

MT7921 太烂了,连上无线网后一开始能跑接近 300M,然后协议速度开始慢慢降,最后降到只有 6Mbps,我现在老老实实用有线网了。

学校的有线网 IPv6 有的时候会离奇消失,重启 WAN6 就能解决,于是找到一个脚本:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
FLAG_FILE="/tmp/ipv6_prefix_change_flag"
FLAG_VALUE=$(cat $FLAG_FILE 2>/dev/null)
if [ "$FLAG_VALUE" = "1" ]; then
    logger -t prefix_change "Script is already running. Skipping execution."
    exit 0
fi
echo "1" > $FLAG_FILE
IPV6_DEFAULT_ROUTE=$(ip -6 route | grep default 2>/dev/null)
if [ -z "$IPV6_DEFAULT_ROUTE" ] ; then
    logger -t prefix_change "IPv6 route missing detected. Reconnecting wan6 interface."
    ifdown wan6
    ifup wan6
fi
echo "0" > $FLAG_FILE

丢到一个目录下,设置计划任务每分钟检测一次即可。

效果(日志):

Text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# IPv6 正常,脚本无输出
Xxx Xxx xx xx:xx:xx xxxx cron.err crond[xxxxx]: USER root pid xxxx cmd /path/to/ipv6_monitor.sh
# IPv6 异常,重启接口
Xxx Xxx xx xx:xx:xx xxxx user.notice prefix_change: IPv6 route missing detected. Reconnecting wan6 interface.
Xxx Xxx xx xx:xx:xx xxxx daemon.notice netifd: Interface 'wan6' is now down
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Withdrawing address record for xxxx:xxxx:xxxx:xxxx::a on eth0.
Xxx Xxx xx xx:xx:xx xxxx daemon.notice netifd: Interface 'wan6' is setting up now
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Withdrawing address record for xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx on eth0.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Registering new address record for xxxx:xxxx:xxxx:xxxx::a on eth0.*.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Registering new address record for xxxx::xxxx:xxxx:xxxx:xxxx on eth0.*.
Xxx Xxx xx xx:xx:xx xxxx daemon.notice ttyd[18127]: rops_handle_POLLIN_netlink: DELADDR
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: read /etc/hosts - 12 names
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: read /tmp/hosts/dhcp.cfg01411c - 4 names
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq-dhcp[1]: read /etc/ethers - 0 addresses
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Registering new address record for xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx on eth0.*.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Withdrawing address record for xxxx:xxxx:xxxx:xxxx::a on eth0.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Withdrawing address record for xxxx::xxxx:xxxx:xxxx:xxxx on eth0.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Registering new address record for xxxx:xxxx:xxxx:xxxx::a on eth0.*.
Xxx Xxx xx xx:xx:xx xxxx daemon.notice netifd: Interface 'wan6' is now up
Xxx Xxx xx xx:xx:xx xxxx user.notice firewall: Reloading firewall due to ifup of wan6 (eth0)
Xxx Xxx xx xx:xx:xx xxxx daemon.notice ttyd[18127]: rops_handle_POLLIN_netlink: DELADDR
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Withdrawing address record for xxxx::xxxx:xxxx::1 on utun.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Leaving mDNS multicast group on interface utun.IPv6 with address xxxx::xxxx:xxxx::1.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Joining mDNS multicast group on interface utun.IPv6 with address xxxx::xxxx:xxxx:xxxx:xxxx.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Registering new address record for xxxx::xxxx:xxxx:xxxx:xxxx on utun.*.
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: read /etc/hosts - 12 names
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: read /tmp/hosts/dhcp.cfg01411c - 4 names
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq-dhcp[1]: read /etc/ethers - 0 addresses
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Leaving mDNS multicast group on interface utun.IPv6 with address xxxx::xxxx:xxxx:xxxx:xxxx.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Joining mDNS multicast group on interface utun.IPv6 with address xxxx::xxxx:xxxx::1.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Registering new address record for xxxx::xxxx:xxxx::1 on utun.*.
Xxx Xxx xx xx:xx:xx xxxx daemon.info avahi-daemon[xxxx]: Withdrawing address record for xxxx::xxxx:xxxx:xxxx:xxxx on utun.
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: exiting on receipt of SIGTERM
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: started, version 2.89 cache disabled
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: DNS service limited to local subnets
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: compile time options: IPv6 GNU-getopt no-DBus UBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset no-nftset auth cryptohash DNSSEC no-ID loop-detect inotify dumpfile
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: UBus support enabled: connected to system bus
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq-dhcp[1]: DHCP, IP range 192.168.100.100 -- 192.168.100.249, lease time 12h
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: using nameserver 127.0.0.1#1145
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: using only locally-known addresses for test
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: using only locally-known addresses for onion
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: using only locally-known addresses for localhost
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: using only locally-known addresses for local
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: using only locally-known addresses for invalid
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: using only locally-known addresses for bind
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: using only locally-known addresses for lan
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: read /etc/hosts - 12 names
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq[1]: read /tmp/hosts/dhcp.cfg01411c - 4 names
Xxx Xxx xx xx:xx:xx xxxx daemon.info dnsmasq-dhcp[1]: read /etc/ethers - 0 addresses
Xxx Xxx xx xx:xx:xx xxxx user.notice nlbwmon: Reloading nlbwmon due to ifup of wan6 (eth0)
Xxx Xxx xx xx:xx:xx xxxx user.notice cifs-mount: Reloading cifs-mount due to ifup of wan6 (eth0)
文章作者
Hsukqi Lee
发布于

2024-09-30

修改于

2024-11-16

许可协议

CC BY-NC-ND 4.0

评论

昵称
邮箱
网址
暂无