OpenWrt 编译与防检测部署教程

date
Mar 3, 2021
slug
openwrt-compile
status
Published
tags
Network
summary
type
Post

方案原理与分析

关于某大学校园网共享上网检测机制的研究与解决方案
关于本校的校园网,相信大家都知道是禁止单一账号下多设备同时访问互联网的,具体表现为1个账号只能同时让1台有线设备和1台无线设备接入互联网,这给我们一些拥有多设备的同学带来了很大的不便,因此不少同学想到了使用家用路由器的方式来解决这个为问题,然而校园网会进行共享上网检测,一旦发现一个IP下有多个不同设备的流量,就会封禁账号2-8小时不等,害的同学们怨声载道。 然而奇怪的是本校内竟无应对此检测的方案,俗话说得好,道高一尺魔高一丈,肯定是有办法解决这个问题的。 因此本人出于学术兴趣,针对本校校园网共享上网检测机制进行了研究分析,并针对该机制提出了一些解决方案。 校园网网络硬件设备:锐捷三层交换机(目前已知 校园网认证系统:Drcom Web Portal 认证 校园网网络防火墙安全方案:深信服 对于家用的上网资费,平均一年就要数百甚至上千元人民币,而校园网的资费一般都很低,如果一个宿舍只用一个账号一个路由器就可以实现全员上网的话,那ISP肯定要亏死,因此肯定会封禁像路由器这种设备的。 目前已知的(可能)存在的有: 基于 IPv4 数据包包头内的 TTL 字段的检测 基于 HTTP 数据包请求头内的 User-Agent 字段的检测 DPI (Deep Packet Inspection) 深度包检测技术 基于 IPv4 数据包包头内的 Identification 字段的检测 基于网络协议栈时钟偏移的检测技术 Flash Cookie 检测技术 下面我会对这些技术的实现原理作出进一步说明 存活时间(Time To Live,TTL),指一个数据包在经过一个路由器时,可传递的最长距离(跃点数)。 每当数据包经过一个路由器时,其存活次数就会被减一。当其存活次数为0时,路由器便会取消该数据包转发,IP网络的话,会向原数据包的发出者发送一个ICMP TTL数据包以告知跃点数超限。其设计目的是防止数据包因不正确的路由表等原因造成的无限循环而无法送达及耗尽网络资源。 这是一个比较有效且合理的检测技术,IPv4数据包下存在 TTL(Time To Live)这一字段,数据包每经过一个路由器(即经过一个网段),该TTL值就会减一。 不同的操作系统的默认 TTL 值是不同的,Windows 是 128,
关于某大学校园网共享上网检测机制的研究与解决方案
全新方案-懒人福音-无需手动编译修改UA-校园网防检测
About RSS 关于某大学校园网共享上网检测机制的研究与解决方案 OpenWrt编译与防检测部署教程 阅读过上面两篇文章的同学可以发现,手动编译OpenWrt是一件很痛苦的事。 显然对于一些动手能力不强的同学来说,通过 UA2F 修改UA是比较困难的。而且,UA2F从设计层面上也存在一些问题,例如无法处理网卡分包等情况。 因此,我们需要一种更加简单的方案,既能无需编译OpenWrt,又能更好的满足我们的需求。 之前我曾经提到过我们可以通过加密流量来实现防检测,但我当时并没有采取这个策略,因为进行全局加密网络流畅度影响太大, 而进行部分加密目前市面上还没有很好的解决方案(之前是这么认为),目前大多数加密软件都是基于规则的加密,但支持的多为针对域名的加密。 然而我们的需求是针对http应用层的加密,这类加密方案目前支持的不多。 经过我深入了解,Clash 中 DstPort 是我们最理想的规则选项,我们可以指定代理目标端口为http的80端口从而实现http应用层的加密。 此外,除了针对http的加密外,我们还可以通过支持Mitm的网络调试工具对http中UA进行重写以达到修改UA的目的。 基于上面的分析,我总结了以下方案: 使用Clash,添加规则: - DST-PORT,80,proxy 加入以上规则即可实现针对80端口的加密 使用Clash,添加规则: - DST-PORT,80,proxy 加入以上规则即可实现针对80端口的加密 使用Quantumult X/Surge等支持重写的工具,添加重写规则: # Quantumult X ^http:// url request-header (\r\n)User-[A|a]gent:.+(\r\n) request-header $1User-Agent: F$2 # Surge ^http:// header-replace User-Agent F 加入以上规则即可实现针对UA的重写 使用Quantumult X/Surge等支持重写的工具,添加重写规则: # Quantumult X ^http:// url request-header (\r\n)User-[A|a]gent:.+(\r\n) request-header $1User-Agent: F$2 # Surge ^http:// header-replace User-Agent F 加入以上规则即可实现针对UA的重写 使用OpenClash,添加规则: - DST-PORT,80,proxy 如果在OpenWrt加入这条配置,那么就无需进行其他终端的配置了。 对于 TTL 和 NTP 方面,我们无需进行手动编译,常见的OpenWrt固件都能够默认支持。 对于 IPID,我认为无需关注,基于IPID的检测我认为是不现实且很少见的。 如果有疑问可以加讨论组: Telegram Copyright © SunBK201 Ushiromiya

讨论组

相关文档

OpenWrt 云编译

个人编译项目

⚠️
仅供参考

OpenWrt 本地编译(推荐)

💡
如果是使用 Clash 加密 + TTL 伪装方案,无需手动编译,直接访问 https://firmware-selector.openwrt.org 下载所需固件即可,刷入固件后,可以手动安装 Clash,并配置防火墙。
⚠️
请保证全局魔法环境,编译失败的大多数原因是网络问题。
⚠️
如果你使用的是虚拟机进行编译,建议使用 Clash For Windows 并开启 TUN Mode 即可接管虚拟机流量进行代理。
⚠️
编译操作系统建议使用 Ubuntu 22.04 LTS,操作系统语言建议使用英文
# 系统软件包更新
sudo apt-get -y update
sudo apt-get -y upgrade
# 安装依赖关系与编译工具链
sudo apt install build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev \
python3-distutils python3-setuptools rsync swig unzip zlib1g-dev file wget
# 下载 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

加入 UA3F 模块

git clone https://github.com/SunBK201/UA3F.git package/UA3F
make menuconfig # 勾选 Network->Web Servers/Proxies->ua3f

加入 UA2F 模块

⚠️
UA2F 与 UA3F 二选一
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 打开
⚠️
上一步可以跳过,但需要在对应内核 config 文件中手动加入 CONFIG_NETFILTER_NETLINK_GLUE_CT=y,除非你知道这是什么,否则不建议你手动添加

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

make menuconfig 中,使用 option 设置。
notion image

加入 LuCI

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

加入 OpenClash

⚠️
Clash 的加入针对 DPI 检测,如果没有 DPI 检测无需加入
⚠️
如果你的路由器性能不足可以使用 ShellClash 来代替 OpenClash
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 模块

⚠️
通过 IPID 进行检测的可能性极低,此模块不建议加入
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
非 WSL 使用此命令编译
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
WSL2 使用此命令编译
编译后的固件文件在:openwrt/bin/targets 下面。
到这里编译就结束了,刷入固件后就可以进行以下配置。

防检测配置

  • 进入 OpenWRT 系统设置, 勾选 Enable NTP client(启用 NTP 客户端)和 Provide NTP server(作为 NTP 服务器提供服务)
  • NTP server candidates(候选 NTP 服务器)四个框框分别填写 ntp1.aliyun.comtime1.cloud.tencent.comstdtime.gov.hk 、pool.ntp.org

防火墙配置

⚠️
写于 2025.11,目前下面的大多数配置已无需加入,因为大部分插件已实现自动配置
⚠️
请按照以下规则顺序,若顺序与以下不符,可能配置不起效。
# 通过 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 配置

⚠️
如果你的路由器性能不足可以使用 ShellClash 来代替 OpenClash
⚠️
请先阅读下面的文档 👇👇👇
⚠️
请先阅读下面的文档 👇👇👇
⚠️
请先阅读上面的文档 👆👆👆
⚠️
请先阅读上面的文档 👆👆👆
notion image
notion image
对于有能力对流量进行加密的同学,请将下面的规则加入配置中:
- DST-PORT,80,Proxy
⚠️
proxy 部分不一定为proxy,具体取决于你的配置,你需要改写为你自己的加密节点
没有能力加密的同学,加入下面的规则:
- DST-PORT,80,REJECT
此规则会自动抛弃所有发往 80 端口的数据包,因此对网络体验影响大

UA3F 配置

按照此图点击启用即可,无需额外配置。
notion image

UA2F 配置

⚠️
⚠️
UA2F 版本的不同可能导致配置失效,下面的 UA2F 配置是最新版本的配置,因此请保证你的 UA2F 是最新的版本。
⚠️
UA2F 最新版 iptables 规则已经实现自动配置,无需再手动添加,但默认不是开机自启,需要手动开启开机自启。
# 手动启动 ua2f
uci set ua2f.enabled.enabled=1
uci commit ua2f
service ua2f start

# 手动关闭 ua2f
service ua2f stop

使用到的模块

 

notion image

© SunBK201 2020 - 2026