绕过某大学宿舍设备共享检测

基本原理

利用加密隧道传输可能暴露设备特征的非加密流量 (NTP/HTTP/DNS等) , 直连443端口让HTTPS流量直接流向公网减少服务器带宽消耗, 并降低网页浏览延时. 另外将wan口出去的流量全部统一TTL, 从而实现wan口不包含任何非加密流量且不包含TTL特征.

为什么不伪装UAIPID?

HTTP流量走加密隧道出去了无需伪装; 实测IPID不在检测范围内, 也不需要.

image-20241023200522750

准备工作

  • 一台可以刷OpenWrt的路由器, 最好是官方支持的, 比如 Redmi-AC2100/Redmi-AX6S.

  • 一台落地VPS, 地域最好是湖北, 用于和路由器建WireGuard加密隧道, 转发除HTTPS以外的流量. 因为流量大部分都来自于HTTPS, 所以这个机器带宽要求不高, 不下BT这种基本没啥问题, 如果你恰好财力雄厚可以考虑大带宽服务器.

我用的亿安云, 几块钱一个月, 跑满百兆没问题, NAT机配一下端口映射又不是不能用(

本教程基于最新版OpenWrt-23.05.5编写, 使用Nfatbles完成防火墙配置, 旧版使用iptabes不能直接套用.

image-20241023211354698

配置流程

配置转发服务器

Ubuntu为例, SSH连接上去之后, 编辑/etc/sysctl.conf, 打开路由转发并重启.

1
net.ipv4.ip_forward=1

安装Wireguard, 网络问题先换源.

1
2
3
apt update
apt upgrade
apt install wireguard

配置WireGuard, 准备wg0.conf.

私钥用wg genkey生成, 用wg pubkey读出公钥, 总共需要两对, 路由器一对, VPS一对.

文件名决定了WireGuard网络接口的名字, 不要改, 另外ens18需要改为VPS的出口网卡名.

1
2
3
4
5
6
7
8
9
10
11
[Interface
PrivateKey = [VPS端的私钥]
Address = 10.0.0.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens18 -j MASQUERADE
ListenPort = 25053
MTU = 1280

[Peer]
PublicKey = [路由器端的公钥]
AllowedIPs = 10.0.0.0/24

准备好之后执行wg-quick up ./wg0.conf启动网络接口, 正常状态类似下图.

image-20241023193625966

某些机器可能需要安装一些依赖, 我这台缺失openresolv, 使用apt install openresolv安装即可.

然后再wg-quick down ./wg0.conf && wg-quick up ./wg0.conf重启接口.

通过wg show可以查看接口状态(图中因为接口已经连接, 略有不同), 如果没有显示任何内容说明没生效.

image-20241023192926429

配置路由器环境

建议使用官方版OpenWrt, 方便进行固件定制, 在重置路由器后可以不用从头安装软件包, OpenWrt提供了快捷的固件定制网页.

ImmortalWrt也可以, 这里以OpenWrt为例.

下载适用于您设备的 OpenWrt 固件

需要添加的软件包, 分别是luci汉化包,iproute2wireguard

1
2
3
4
5
luci-i18n-base-zh-cn
luci-i18n-firewall-zh-cn
luci-i18n-opkg-zh-cn
ip-full
luci-proto-wireguard

修改首次运行脚本, 如图, 在末尾插入, 实现自动换源.

1
sed -i 's/downloads.openwrt.org/mirrors.ustc.edu.cn\/openwrt/g' /etc/opkg/distfeeds.conf

也可以修改一下lan_ip_address="192.168.31.1", 避免默认192.168.1.1lan地址和其他设备冲突.

image-20241023195206214

然后把固件刷入设备即可, 重置路由器也不用重新安装了. 不采用定制固件方式也可以自己去OpenWrt后台自己装, 就是麻烦, 效果一样.

配置nftables

SSH连接到路由器, 在/etc/nftables.d/下新建user_mangle.nft文件, 原有文件可以不动, 也可以把以下内容粘贴到原有文件之后, 效果一样.

第一个链将从lan口来的目的端口为443的流量打上0x233标记, 第二个链将所有从wan口流出的流量的TTL统一为64(理论上还需要修改IPv6TTL, 但是他们没提供IPv6网络, 就先不管了).

1
2
3
4
5
6
7
8
9
10
chain user_mangle_mark443 {
type filter hook prerouting priority mangle; policy accept;
iifname br-lan tcp dport 443 meta mark set 0x233 counter;
iifname br-lan udp dport 443 meta mark set 0x233 counter;
}

chain user_mangle_ttl64 {
type filter hook postrouting priority mangle; policy accept;
oifname wan ip ttl set 64 counter;
}

配置完成后输入service firewall restart重启nfatbles服务.

报语法错误说明编辑时使用了中文回车(CRLF)而不是Unix回车(LF)

WireGuard连接前准备

先认证让路由器通网, 再去lan口和wan口的高级设置中把使用默认网关取消勾选, 避免自动添加路由带来的干扰.

配置完路由表应只剩lan口和wan口的子网路由, 没有0.0.0.0/0默认路由, 此时路由器处于断网状态.

image-20241023210350526

配置wanDNS服务器为公网IP服务器, 比如114, 因为后续路由器的DNS流量也全部走加密隧道, 内网DNS服务器不可用.

image-20241023211113288

在静态路由的main表中中添加一条wan路由, 目标是VPSIP, 让连接VPS的流量走wan口出去.

image-20241023212054307

在防火墙新建一个vpn区域, 等下要把WireGuard的接口添加进这个区域.

lan区域需要开启mss钳制, 非常重要, 不开启可能会因为mtu问题会导致电脑无法联网.

image-20241023212600795

允许lan侧流量转发至vpn, 允许vpn侧流量转发至wan侧, 并开启vpnIP动态伪装, 设置完效果如图.

image-20241023212309762

编辑防火墙-通信规则, 新增一条Allow-Direct规则, 允许打上0x233标记的流量从lan区域转发到wan区域.

image-20241023213346203

image-20241023213350568

添加WireGuard接口

image-20241023214001566

填入路由器端的公私钥, 设置IP. 勾选无主机路由, 那一步在静态路由里配过了, 自动有时候会出问题.

image-20241023214035874

设置MTU1280, 与VPS保持一致, 取消勾选使用默认网关.

image-20241023214542384

防火墙设置为之前新建的vpn区域

image-20241023214748515

填入VPS的公钥, 设置允许IP0.0.0.0/0, 端点IPVPSIP, 端口填VPS的监听端口.

如果是公网IPVPS, 那么这个端口应该与wg0.conf里的监听端口一致为25053

我这里用的是NAT主机, 端口号为自己映射的外网端口

image-20241023214439453

设置完成后可以在 状态-Wireguard 里查看连接情况, 如果上次握手时间正常的话说明连接成功.

image-20241023215420360

配置路由

编辑/etc/iproute2/rt_tables, 添加一张新的路由表direct, 序号为50, 用于路由直连流量.

1
2
3
4
5
6
7
8
9
10
11
12
13
#添加完类似这样
# reserved values
#
128 prelocal
255 local
254 main
253 default
50 direct
0 unspec
#
# local
#
#1 inr.ruhep

添加两条新的路由

  1. main表的0.0.0.0/0默认路由, 用于转发本机所有流量至vpn, 通过vpn接口发往10.0.0.1网关, 这个路由添加完成后路由器和下面的设备就可以联网了, 此时所有流量均通过VPS转发.

  2. direct表的0.0.0.0/0默认路由, 用于将直连流量通过wan口发出, 此时direct表不起作用, 还需要添加路由规则, 让带有0x233标记的流量去查询这张路由表.

image-20241023220050209

添加IPv4路由规则, 设置优先级为50, 表为direct, 在高级设置里匹配防火墙标志0x233.

image-20241023220907699

image-20241023221035510

此时所有配置已完成, 443端口也直连外网了.

附上路由表/规则/Nfatbles/接口配置参照.

image-20241023221308269

image-20241023230514961

image-20241023221448546

后记

这个方案理论上还有可以改进的地方, 不过我没有再去尝试了, 喜欢折腾的可以试试.

  • 把服务器的IPv6地址分配到本机使用
  • 开放除443外的其它端口