https://github.com/SunBK201/UA3F

方案原理与分析

关于某大学校园网共享上网检测机制的研究与解决方案

全新方案-懒人福音-无需手动编译修改UA-校园网防检测

ShellClash 加密防检测教程

Shadowsocks-libev 部署教程

讨论组

某大学的校园网讨论组

相关文档

Welcome to the OpenWrt Project

Home · Dreamacro/clash Wiki

OpenWrt 云编译

https://github.com/CoolLoong/AutoBuild-Actions

https://github.com/DFlinmo/Actions-immortalWrt-UA2F

个人编译项目

https://github.com/SunBK201/OpenWrt-R4S-glibc

<aside> ⚠️ 仅供参考

</aside>

OpenWrt 本地编译(推荐)

<aside> 💡 如果是使用 Clash 加密 + TTL 伪装方案,无需手动编译,直接访问 https://firmware-selector.openwrt.org 下载所需固件即可,刷入固件后,可以手动安装 Clash,并配置防火墙。

</aside>

<aside> ⚠️ 请保证全局魔法环境,编译失败的大多数原因是网络问题。

</aside>

<aside> ⚠️ 请保证全局魔法环境,编译失败的大多数原因是网络问题。

</aside>

<aside> ⚠️ 请保证全局魔法环境,编译失败的大多数原因是网络问题。

</aside>

<aside> ⚠️ 如果你使用的是虚拟机进行编译,建议使用 Clash For Windows 并开启 TUN Mode 即可接管虚拟机流量进行代理。

</aside>

<aside> ⚠️ 编译操作系统建议使用 Ubuntu LTS,操作系统语言建议使用英文。

</aside>

Build system usage

# 系统软件包更新
sudo apt-get -y update
sudo apt-get -y upgrade
# 安装依赖关系与编译工具链
sudo apt install -y ack antlr3 aria2 asciidoc autoconf automake autopoint binutils bison build-essential \\
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \\
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \\
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \\
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip libpython3-dev qemu-utils \\
rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
# 下载 OpenWrt 源码 (下面二者选其一)
git clone <https://github.com/openwrt/openwrt.git> && cd openwrt
git clone <https://github.com/coolsnowwolf/lede> && cd lede
~~# openwrt-22.03 已将 iptables 移除,为避免兼容性问题,暂时切换到 openwrt-21.02~~
~~git checkout openwrt-21.02~~
git checkout openwrt-23.05
# 更新 feeds 软件源
./scripts/feeds update -a

# 安装 feeds 软件包
./scripts/feeds install -a

加入 UA2F 模块

<aside> ⚠️ Clash 加密 + TTL伪装方案 与 UA2F + TTL伪装方案 二选一

</aside>

<aside> ⚠️ 2021.11.02 作者对恶性 bug 进行了修复,已经经过测试,修复成功,以后无需手动进行防火墙配置,全部会自动进行配置

</aside>

git clone <https://github.com/Zxilly/UA2F.git> package/UA2F

make menuconfig
~~# 选上三个模块: libmnl, libnetfilter-queue, iptables-mod-nfqueue, 搜索就能找到
# network->firewall->iptables-mod-filter
# network->firewall->iptables-mod-ipopt
# network->firewall->iptables-mod-u32~~

# 勾选上ua2f,在配置面板中搜索就可找到
# network->Routing and Redirection

# 然后保存退出
# 这一步可能时间比较长,要耐心
make kernel_menuconfig

# 然后将
# Networking support -> 
# Networking options -> 
# Network packet filtering framework (Netfilter) -> 
# Core Netfilter Configuration -> 
# Netfilter NFNETLINK interface
# Netfilter LOG over NFNETLINK interface
# Netfilter connection tracking support
# Connection tracking netlink interface
# NFQUEUE and NFLOG integration with Connection Tracking 打开

<aside> ⚠️ 上一步可以跳过,但需要在对应内核 config 文件中手动加入 CONFIG_NETFILTER_NETLINK_GLUE_CT=y,除非你知道这是什么,否则不建议你手动添加

</aside>

使用 UA2F 自定义 User-Agent(可选)

make menuconfig 中,使用 option 设置。

Untitled

加入 LuCI

**LuCI**
		**--> 1. Collections**
				--> luci
		**--> 2. Modules
				--> Translations**
						--> Chinese Simplified (zh_Hans)
		--> luci-compat

加入 OpenClash

<aside> ⚠️ Clash 加密 + TTL伪装方案 与 UA2F + TTL伪装方案 二选一

</aside>

<aside> ⚠️ 如果你的路由器性能不足可以使用 ShellClash 来代替 OpenClash

</aside>

svn checkout <https://github.com/vernesong/OpenClash/trunk/luci-app-openclash> package/luci-app-openclash
make menuconfig

# 选择以下模块
**LuCI**
		**--> 1. Collections**
				--> luci
		--> luci-compat
		**--> 3. Applications**
				--> luci-app-openclash
Base system
		--> Customize busybox options
				--> dnsmasq-full (cancel the above 'dnsmasq' option)

加入 RKP-IPID 模块

<aside> ⚠️ 通过 IPID 进行检测的可能性极低,此模块不建议加入。

</aside>

git clone <https://github.com/CHN-beta/rkp-ipid.git> package/rkp-ipid
make menuconfig
# 选上三个模块: kmod-ipt-u32, iptables-mod-u32, iptables-mod-filter, 搜索就能找到

# 然后勾选上 ipid
# 位于 kernel-modules->Other modules 下

# 然后保存退出

加入防 TTL 检测依赖

make menuconfig
# 选上两个模块: iptables-mod-ipopt, kmod-ipt-ipopt,搜索就能找到
# 然后保存退出

其它依赖

Network -> ipset
Firewall -> iptables-mod-conntrack-extra

编译

# 预下载编译所需的软件包
make download -j$(nproc) V=s
# 编译
make -j$(nproc) || make -j1 || make -j1 V=s
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin make -j$(($(nproc) + 1)) || PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin make -j1 V=s

编译后的固件文件在:openwrt/bin/targets 下面。

到这里编译就结束了,刷入固件后就可以进行以下配置。


防检测配置

防火墙配置

<aside> ⚠️ 请按照以下规则顺序,若顺序与以下不符,可能配置不起效。

</aside>

# 通过 rkp-ipid 设置 IPID
# 若没有加入 rkp-ipid 模块,此部分不需要加入
iptables -t mangle -N IPID_MOD
iptables -t mangle -A FORWARD -j IPID_MOD
iptables -t mangle -A OUTPUT -j IPID_MOD
iptables -t mangle -A IPID_MOD -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -d 127.0.0.0/8 -j RETURN
# 由于本校局域网是 A 类网,所以我将这一条注释掉了,具体要不要注释结合你所在的校园网内网类型
# iptables -t mangle -A IPID_MOD -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A IPID_MOD -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A IPID_MOD -d 255.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -j MARK --set-xmark 0x10/0x10

~~# ua2f 改 UA~~
# ua2f 最新版本已实现自动配置,无需手动配置防火墙
~~iptables -t mangle -N ua2f
#由于本校局域网是 A 类网,所以我将这一条注释掉了,具体要不要注释结合你所在的校园网内网类型
# iptables -t mangle -A ua2f -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A ua2f -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A ua2f -d 192.168.0.0/16 -j RETURN # 不处理流向保留地址的包
iptables -t mangle -A ua2f -p tcp --dport 443 -j RETURN # 不处理 https
iptables -t mangle -A ua2f -p tcp --dport 22 -j RETURN # 不处理 SSH 
iptables -t mangle -A ua2f -p tcp --dport 80 -j CONNMARK --set-mark 44
iptables -t mangle -A ua2f -m connmark --mark 43 -j RETURN # 不处理标记为非 http 的流 (实验性)
iptables -t mangle -A ua2f -m set --set nohttp dst,dst -j RETURN
iptables -t mangle -A ua2f -j NFQUEUE --queue-num 10010

iptables -t mangle -A FORWARD -p tcp -m conntrack --ctdir ORIGINAL -j ua2f
iptables -t mangle -A FORWARD -p tcp -m conntrack --ctdir REPLY~~

# 防时钟偏移检测
iptables -t nat -N ntp_force_local
iptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_local
iptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN
iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.1.1

# 通过 iptables 修改 TTL 值
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64

~~# iptables 拒绝 AC 进行 Flash 检测~~(Flash 时代已成为历史)
~~iptables -I FORWARD -p tcp --sport 80 --tcp-flags ACK ACK -m string --algo bm --string " src=\\"<http://1.1.1>." -j DROP~~

Clash 配置

<aside> ⚠️ Clash 加密 + TTL伪装方案 与 UA2F + TTL伪装方案 二选一

</aside>

<aside> ⚠️ 如果你的路由器性能不足可以使用 ShellClash 来代替 OpenClash

</aside>

<aside> ⚠️ 请先阅读下面的文档 👇👇👇

</aside>

<aside> ⚠️ 请先阅读下面的文档 👇👇👇

</aside>

Home · Dreamacro/clash Wiki

请阅读完此文档再进行下面的配置

GitHub - vernesong/OpenClash: A Clash Client For OpenWrt

请阅读完此文档再进行下面的配置

<aside> ⚠️ 请先阅读上面的文档 👆👆👆

</aside>

<aside> ⚠️ 请先阅读上面的文档 👆👆👆

</aside>

Untitled

Untitled

对于有能力对流量进行加密的同学,请将下面的规则加入配置中:

- DST-PORT,80,Proxy

<aside> ⚠️ proxy 部分不一定为proxy,具体取决于你的配置,你需要改写为你自己的加密节点

</aside>

没有能力加密的同学,加入下面的规则:

- DST-PORT,80,REJECT

UA2F 配置

<aside> ⚠️ Clash 加密 + TTL伪装方案 与 UA2F + TTL伪装方案 二选一

</aside>

<aside> ⚠️ 以下配置只适用于最新版,由于最新版存在bug,暂时不要使用以下配置

</aside>

<aside> ⚠️ UA2F 版本的不同可能导致配置失效,下面的 UA2F 配置是最新版本的配置,因此请保证你的 UA2F 是最新的版本。

</aside>

<aside> ⚠️ UA2F 最新版 iptables 规则已经实现自动配置,无需再手动添加,但默认不是开机自启,需要手动开启开机自启。

</aside>

# 手动启动 ua2f
uci set ua2f.enabled.enabled=1
uci commit ua2f
service ua2f start

# 手动关闭 ua2f
service ua2f stop

UA2F 最新版默认自启,不再需要手动添加防火墙规则,有特殊需要可自行选择相应的配置策略:

# 开机自启
uci set ua2f.enabled.enabled=1
uci commit ua2f
# 自动配置防火墙(默认开启)(建议开启)
uci set ua2f.firewall.handle_fw=1
uci commit ua2f
# 处理内网流量(默认开启),防止在访问内网服务时被检测到。(建议开启)
uci set ua2f.firewall.handle_intranet=1
uci commit ua2f
# 处理 443 端口流量(默认关闭),443 端口流量一般为加密得 https 流量,443 端口出现 http 流量的概率较低(建议关闭)
uci set ua2f.firewall.handle_tls=1
uci commit ua2f

<aside> ⚠️ 第三、四条规则必须在第二条规则开启的条件下才会生效

</aside>

# 处理微信的 mmtls 流量(默认关闭)(建议关闭)
uci set ua2f.firewall.handle_mmtls=1
uci commit ua2f

验证

访问:

UA检测-HTTP

如果你的真实UA是(服务器获取的 UA)出现(两个端口都出现):

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

说明配置正确.

<aside> ⚠️ 只需要关注真实UA(服务器获取的 UA),下面的“浏览器UA”无需关注。

</aside>

<aside> ⚠️ 进行测试时确保你可能使用的代理客户端没有代理 UA 测试网站,因为代理客户端会加密流量导致 UA2F 不会去修改加密请求。

</aside>

<aside> ⚠️ UA2F + TTL伪装方案 是通过将 UA 修改来让网关认为 UA 是统一的,Clash 加密 + TTL伪装方案 是通过加密的方式来让网关观察不到 UA,因此这里通过访问 UA 测试网站进行验证只适用于 UA2F + TTL伪装方案。

</aside>


其他配置(如 TTL)建议 wan 口抓包验证:

tcpdump -i eth0 -w test.cap

注意

<aside> ⚠️ UA2F 可能会与 SSRP+ 等魔法道具冲突,因此要做好取舍。 具体表现为 80 端口修改失效,其它部分端口正常

</aside>

<aside> ⚠️ UA2F 也可能会和 mwan3 冲突,也不要开启 Flow Offloading 加速以及其他 QoS 工具

</aside>