硬路由+树莓派双栈分流校园网/校园宽带

把校内网站分流到校园网,其余流量走校园宽带,避免反复切换网络

背景

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

使用NetworkManagerdispatcher脚本,当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 这类脚本,自动化配置路由器。