背景
NUAA的校园网只有通过WLAN连接才能获得教育网IPv4/IPv6地址,而有线连接只能获得校园网 IPv4 地址。并且本科生只有 50Mbps 带宽可选。
校园宽带倒是有 300Mbps 带宽,分配的是移动 IPv4/IPv6 地址,并不能访问学校内网资源。
所以这实际上是个简单的分流问题,只需要把校内网站分流到校园网,其余流量走校园宽带即可。
连接WLAN
首先是连接WLAN,并完成校园网认证。
抓包得知,校园网认证是通过一个GET请求完成的,请求附带了用户名和密码,内网IPv4地址,以及连接的AP编号,因为是在宿舍楼,AP编号不会变,所以抓一次包就能搞定。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #!/bin/bash
sudo ip link set wlan0 up
sudo nmcli device wifi connect 'nuaa.wifi6'
# 获取wlan0的IPv4地址
IP=$(ip -4 addr show wlan0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
# 校园网认证账号密码, AC_ID是AP编号
ACCOUNT=""
PASSWORD=""
AC_ID="nuaa_jjl_me60_2"
URL="http://211.65.106.6:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2C$ACCOUNT&user_password=$PASSWORD&wlan_user_ip=$IP&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=$AC_ID&jsVersion=3.3.2&v=5364"
curl --interface wlan0 $URL
|
使用NetworkManager
的dispatcher
脚本,当wlan0连接成功后执行这个脚本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| #!/bin/bash
# /etc/NetworkManager/dispatcher.d/10-wifi-connect.sh
IFACE=$1
STATUS=$2
if [ "$IFACE" == "wlan0" ]; then
case "$STATUS" in
up)
# WiFi已连接,执行你的脚本
/path/to/your/script.sh
;;
esac
fi
|
建立HTTP代理
需要一个有有线/无线网卡的设备,树莓派再合适不过了。把树莓派WLAN连接到校园网,有线连接到硬路由,然后在硬路由设置分流规则即可把流量经由树莓派在WLAN出网。
树莓派上运行一个HTTP代理绑定到wlan0即可。
这里使用 sing-box 搭建HTTP代理。
按照官方文档安装 sing-box
1
| bash <(curl -fsSL https://sing-box.app/deb-install.sh)
|
然后新建配置文件 config_server.json
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
| {
"inbounds": [
{
"type": "http",
"tag": "http-in",
"listen": "::",
"listen_port": 1973,
"users": [
{
"username": "cafebabe",
"password": "deadbeef"
}
],
"tls": {},
"set_system_proxy": false
}
],
"outbounds": [
{
"type": "direct",
"bind_interface": "wlan0",
"domain_strategy": "prefer_ipv6"
}
]
}
|
然后启动 sing-box
1
| sing-box start -c /path/to/config_server.json
|
也可以作为服务运行
新建/etc/systemd/system/sing-box.service
1
2
3
4
5
6
7
8
9
10
| # /etc/systemd/system/sing-box.service
[Unit]
Description=Sing-Box Service
[Service]
WorkingDirectory=/path/to/
ExecStart=/usr/bin/sing-box run -c /path/to/config_server.json
[Install]
WantedBy=multi-user.target
|
然后启动服务
1
2
| systemctl enable sing-box
systemctl start sing-box
|
这样树莓派就成为了一个HTTP代理,绑定到wlan0
,监听1973
端口。
配置路由器
在路由器上设置分流规则,把校内网站流量走树莓派HTTP代理,其余流量走校园宽带。同样使用功能强大的 Sing-box
。
首先需要获取一份你自己的 Sing-box 配置文件,在里面的 outbounds
部分添加一个 http
类型的出站代理,指向树莓派的 HTTP 代理。
1
2
3
4
5
6
7
8
| {
"type": "http",
"tag": "CAMPUS",
"server": "192.168.1.218", // 树莓派的IP
"server_port": 1973, // 树莓派的端口
"username": "cafebabe",
"password": "deadbeef",
},
|
也可以添加一个选择器,方便决定是否分流
1
2
3
4
5
6
7
8
| {
"type": "selector",
"tag": "NUAA",
"outbounds": [
"DIRECT",
"CAMPUS"
]
},
|
接下来是规则集部分,添加一条规则,把所有NUAA的流量走NUAA选择器
在 route
字段 rules
中添加
1
2
3
4
5
6
7
8
9
10
11
| {
"domain_suffix": [
"nuaa.edu.cn"
],
"ip_cidr": [
"2001:da8:1006::/48",
"211.65.96.0/20",
"202.119.64.0/20"
],
"outbound": "NUAA"
},
|
这个IP段是南航教育网的IP段,其他学校的话可以查一下 Whois
最后在路由器上启动 Sing-box
1
| sing-box start -c /path/to/config_router.json
|
也可以使用 ShellCrash 这类脚本,自动化配置路由器。