前景提要

来到这个学校已经有一段时间了,总体而言对我来说过的还是比较滋润的,除了一件事——校园网

我的校园网环境比较特殊:

  • 账号限制:校园网需要跳转到浏览器才能登录,对于我的一些老设备来说,无法直接登录。
  • MAC地址绑定限制:一个账号只能绑定最多2个MAC地址,但是我在日常使用中需要绑定更多的设备。
  • 内网隔离:不同设备之间连接校园网会有内网隔断,即使获取了同一个大网段的IP也无法直接通信,这导致我不同设备之间无法直接共享网络。
  • 只能无线接入:宿舍年久失修,没有有线网络接口,只能通过WiFi连接校园网。

不过在这个学期,我的师兄向我传授了一个联网的解决方案——WireGuard。有了这个工具,我就解决了登录的问题。

同时,在这个学期,我的同班同学,在闲鱼上捡垃圾捡到了一台能刷FNOS系统的小主机,以及一台不能刷OpenWrt的新华三路由器,这让我对破除上面的限制有了新的希望。

我的目标很简单:让连接路由器的所有设备都能通过FNOS的网络上网,而且不需要每台设备都手动设置代理

设备配置

  1. 一台闲鱼购买的小主机(刷了FNOS系统) 小主机
  2. 一台新华三路由器(硬路由) 路由器

问题分析

为什么不能直接共享网络?

我这里的校园网采用了端口隔离、私有VLAN等技术,从二层(数据链路层)上隔离用户。这意味着,即使两台设备连接在同一个交换机上,获取了同一个大网段的IP,它们之间也无法直接通信。

我除去小主机和路由器以外,只剩下一台Windows游戏本,指望他的移动热点功能不现实。(至少我手上的NS OLED不知道为什么连不到Windows游戏本的移动热点)

为什么不在FNOS里面通过Docker部署OpenWrt?

我最初尝试在FNOS里通过Docker部署OpenWrt作为旁路由,但遇到了几个问题:

  1. 前面提到了我只能连WIFI,不能连有线网络,这导致了我需要进行更多的配置。
  2. Docker的macvlan网络模式会导致宿主机无法直接与容器通信,即使改成host模式也无法解决。
  3. 校园网的WireGuard认证在容器内无法正常工作,导致连容器里面的IP地址都拿不到。

当然,也有可能是我过于铸币了,导致了我无法成功部署OpenWrt。

为什么不直接购买软路由?

当初觉得小主机和硬路由的方案至少从性能上肯定会比同价位的软路由好。(但是配置上配置死我了。。。)

解决方案探索

第一阶段:NAT共享网络

核心思路是让FNOS像一台普通电脑共享WiFi一样,把网络”借”给路由器。

也就是FNOS的WiFi网络会通过NAT转发给路由器,通过FNOS的LAN口接入到路由器的WAN口。

这里我使用的是iptables来配置NAT规则,其中enp2s0是FNOS的有线网卡,wlan0是FNOS的WiFi网卡。

配置步骤如下:

bash
# 配置有线网卡静态IP
sudo ip addr add 192.168.100.1/24 dev enp2s0
sudo ip link set enp2s0 up
# 开启IP转发
sudo sysctl -w net.ipv4.ip_forward=1
# 配置NAT规则
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o enp2s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i enp2s0 -o wlan0 -j ACCEPT

问题:Linux内核默认禁止无线网卡进行转发,这个方案行不通。

其实,一般的无线网卡配置到这里的时候其实已经差不多了,只需要开启无线网卡的 4addr 模式。

bash
iw dev wlan0 set 4addr on

但是,好巧不巧,我的无线网卡不支持 4addr 模式,导致了我无法直接共享网络。

所以,我们需要找到其他方法来共享网络。

第二阶段:HTTP代理

既然不能直接转发,那就用代理的方式。通过在网上的搜索,我尝试了tinyproxy和privoxy这两款代理软件,结果如下:

代理软件HTTPHTTPS备注
tinyproxyCONNECT方法问题
privoxy成功!HTTP和HTTPS都能正常工作

配置步骤如下:

bash
# 安装privoxy
apt-get update && apt-get install privoxy -y
# 最简配置
cat > /etc/privoxy/config << 'EOF'
listen-address 0.0.0.0:8888
permit-access 192.168.100.0/24
permit-access 127.0.0.1
EOF
# 启动服务
systemctl restart privoxy

等等!privoxy虽然能用,但是经过ping测试

bash
time curl -x http://127.0.0.1:8888 https://www.baidu.com -I -k
HTTP/1.1 200 Connection established
HTTP/1.1 200 OK
...
real 1m0.183s

发现它的速度比tinyproxy慢了10多倍,这严重影响了日常使用体验。

这里我们需要寻找既能支持HTTPS的代理软件,又能提高解析速度的代理软件。

第三阶段:SOCKS5代理

在这里,我选择了SOCKS5代理,因为SOCKS5协议更轻量,对HTTPS的透传更完善。

bash
# 使用Docker运行SOCKS5代理
docker run -d \
--name=socks5 \
--restart=always \
--network host \
-e "PROXY_USER=" \
-e "PROXY_PASSWORD=" \
serjs/go-socks5-proxy:latest

关键点:必须使用--network host模式,否则会遇到Docker NAT导致的connection reset by peer错误。

测试结果:

bash
time curl -x socks5h://127.0.0.1:1080 https://www.baidu.com -I
HTTP/1.1 200 OK
...
real 0m0.175s

速度从60秒降到0.175秒,提升了300多倍!

第四阶段:切换5GHz WiFi

在调试过程中发现,我的无线网卡虽然信号强,但重传率高达20%,严重影响速度。

通过扫描发现校园网有5GHz信号:

bash
nmcli dev wifi list | grep student

切换到5GHz后,重传率大幅下降,速度从19Mbps提升到50-70Mbps。

第五阶段:透明代理

最后一步是实现”透明”代理,让连上WiFi的设备无需任何设置就能上网。

这需要用到redsocks,它可以把透明代理流量转成SOCKS5请求:

bash
# 安装redsocks
apt-get install redsocks -y
# 配置redsocks
cat > /etc/redsocks.conf << 'EOF'
base {
log_debug = on;
log_info = on;
log = "file:/var/log/redsocks.log";
daemon = on;
redirector = iptables;
}
redsocks {
local_ip = 0.0.0.0;
local_port = 12345;
ip = 127.0.0.1;
port = 1080;
type = socks5;
}
redsocks {
local_ip = 0.0.0.0;
local_port = 12346;
ip = 127.0.0.1;
port = 1080;
type = socks5;
}
EOF
# 添加iptables规则
iptables -t nat -A PREROUTING -i enp2s0 -p tcp --dport 80 -j REDIRECT --to-port 12345
iptables -t nat -A PREROUTING -i enp2s0 -p tcp --dport 443 -j REDIRECT --to-port 12346

最终网络架构

手机/电脑 → 路由器 → FNOS(host模式 SOCKS5:1080) → 5GHz WiFi → 校园网
↑(网线) ↑(redsocks透明代理)

测速

关键配置

  • FNOS有线网卡:192.168.100.1(作为路由器的网关)
  • 路由器WAN口:静态IP 192.168.100.2
  • SOCKS5代理:监听1080端口(host网络模式)
  • redsocks:将80/443端口流量重定向到SOCKS5

最后的踩坑总结

1. Docker网络模式很重要

默认的bridge模式会导致splice: connection reset by peer错误,必须使用host模式。

2. HTTPS需要特殊处理

HTTP代理对HTTPS的支持不如SOCKS5完善,SOCKS5原生支持TLS透传。

3. 无线网卡转发限制

Linux内核默认禁止无线网卡进行转发,在自己无线网卡不支持4addr模式时,需要使用代理软件在用户态处理。

4. 5GHz vs 2.4GHz

2.4GHz信道拥挤,重传率高,严重影响速度。如果条件允许,优先使用5GHz。

5. iptables规则要持久化

重启后iptables规则会丢失,需要保存:

bash
iptables-save > /etc/iptables/rules.v4

总结

虽然过程弯弯绕绕,基本每次遇到在死钻研的问题都要会好久时间,不懂得变通,要直到搜出来一些特殊情况的时候才懂得绕弯子。

但是,到了最后,我还是成功地实现了透明代理共享网络,实现了校园网自由。

这个过程让我深刻理解了:

  • 网络分层的实际意义
  • 代理协议(HTTP vs SOCKS5)的区别
  • Docker网络模式的影响
  • Linux网络栈的工作原理

希望这篇文章能帮助到同样在校园网环境下挣扎的朋友们!

喜欢这篇文章?打赏一下作者吧

爱发电
支付宝
微信
搜索