绕过某大学宿舍设备共享检测
基本原理
利用加密隧道传输可能暴露设备特征的非加密流量
(NTP/HTTP/DNS等) ,
直连443端口让HTTPS流量直接流向公网减少服务器带宽消耗,
并降低网页浏览延时.
另外将wan口出去的流量全部统一TTL,
从而实现wan口不包含任何非加密流量且不包含TTL特征.
为什么不伪装
UA和IPID?
HTTP流量走加密隧道出去了无需伪装; 实测IPID不在检测范围内, 也不需要.

准备工作
一台可以刷
OpenWrt的路由器, 最好是官方支持的, 比如Redmi-AC2100/Redmi-AX6S.一台落地
VPS, 地域最好是湖北, 用于和路由器建WireGuard加密隧道, 转发除HTTPS以外的流量. 因为流量大部分都来自于HTTPS, 所以这个机器带宽要求不高, 不下BT这种基本没啥问题, 如果你恰好财力雄厚可以考虑大带宽服务器.
我用的亿安云, 几块钱一个月, 跑满百兆没问题, NAT机配一下端口映射又不是不能用(
本教程基于最新版OpenWrt-23.05.5编写,
使用Nfatbles完成防火墙配置,
旧版使用iptabes不能直接套用.

配置流程
配置转发服务器
以Ubuntu为例, SSH连接上去之后,
编辑/etc/sysctl.conf, 打开路由转发并重启.
1  | net.ipv4.ip_forward=1  | 
安装Wireguard, 网络问题先换源.
1  | apt update  | 
配置WireGuard, 准备wg0.conf.
私钥用wg genkey生成, 用wg pubkey读出公钥,
总共需要两对, 路由器一对, VPS一对.
文件名决定了
WireGuard网络接口的名字, 不要改, 另外ens18需要改为VPS的出口网卡名.
1  | [Interface  | 
准备好之后执行wg-quick up ./wg0.conf启动网络接口,
正常状态类似下图.

某些机器可能需要安装一些依赖, 我这台缺失
openresolv, 使用apt install openresolv安装即可.然后再
wg-quick down ./wg0.conf && wg-quick up ./wg0.conf重启接口.
通过wg show可以查看接口状态(图中因为接口已经连接,
略有不同), 如果没有显示任何内容说明没生效.

配置路由器环境
建议使用官方版OpenWrt, 方便进行固件定制,
在重置路由器后可以不用从头安装软件包,
OpenWrt提供了快捷的固件定制网页.
ImmortalWrt也可以, 这里以OpenWrt为例.
需要添加的软件包,
分别是luci汉化包,iproute2和wireguard
1  | luci-i18n-base-zh-cn  | 
修改首次运行脚本, 如图, 在末尾插入, 实现自动换源.
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.1的lan地址和其他设备冲突.

然后把固件刷入设备即可, 重置路由器也不用重新安装了.
不采用定制固件方式也可以自己去OpenWrt后台自己装, 就是麻烦,
效果一样.
配置nftables
SSH连接到路由器,
在/etc/nftables.d/下新建user_mangle.nft文件,
原有文件可以不动, 也可以把以下内容粘贴到原有文件之后, 效果一样.
第一个链将从lan口来的目的端口为443的流量打上0x233标记,
第二个链将所有从wan口流出的流量的TTL统一为64(理论上还需要修改IPv6的TTL,
但是他们没提供IPv6网络, 就先不管了).
1  | chain user_mangle_mark443 {  | 
配置完成后输入service firewall restart重启nfatbles服务.
报语法错误说明编辑时使用了中文回车(CRLF)而不是Unix回车(LF)
WireGuard连接前准备
先认证让路由器通网,
再去lan口和wan口的高级设置中把使用默认网关取消勾选,
避免自动添加路由带来的干扰.
配置完路由表应只剩lan口和wan口的子网路由,
没有0.0.0.0/0默认路由, 此时路由器处于断网状态.

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

在静态路由的main表中中添加一条wan路由,
目标是VPS的IP,
让连接VPS的流量走wan口出去.
在防火墙新建一个vpn区域,
等下要把WireGuard的接口添加进这个区域.
lan区域需要开启mss钳制,
非常重要,
不开启可能会因为mtu问题会导致电脑无法联网.

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

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


添加WireGuard接口

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

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

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

填入VPS的公钥,
设置允许IP为0.0.0.0/0,
端点IP为VPS的IP,
端口填VPS的监听端口.
如果是公网
IP的VPS, 那么这个端口应该与wg0.conf里的监听端口一致为25053我这里用的是
NAT主机, 端口号为自己映射的外网端口

设置完成后可以在 状态-Wireguard 里查看连接情况,
如果上次握手时间正常的话说明连接成功.
配置路由
编辑/etc/iproute2/rt_tables,
添加一张新的路由表direct, 序号为50,
用于路由直连流量.
1  | #添加完类似这样  | 
添加两条新的路由
main表的0.0.0.0/0默认路由, 用于转发本机所有流量至vpn, 通过vpn接口发往10.0.0.1网关, 这个路由添加完成后路由器和下面的设备就可以联网了, 此时所有流量均通过VPS转发.direct表的0.0.0.0/0默认路由, 用于将直连流量通过wan口发出, 此时direct表不起作用, 还需要添加路由规则, 让带有0x233标记的流量去查询这张路由表.
添加IPv4路由规则, 设置优先级为50,
表为direct,
在高级设置里匹配防火墙标志0x233.


此时所有配置已完成, 443端口也直连外网了.
附上路由表/规则/Nfatbles/接口配置参照.



后记
这个方案理论上还有可以改进的地方, 不过我没有再去尝试了, 喜欢折腾的可以试试.
- 把服务器的
IPv6地址分配到本机使用 - 开放除
443外的其它端口