校园网的墙越修越高,最近知乎以及其他部分网站或应用完全无法访问。本文将介绍校园网如何封杀这些网站,以及如何通过部署Xray代理绕开这些限制。
本文由于发布的地理位置原因将不注明任何引用出处,如您认为本文存在侵权请联系作者。
注意:任何将本文谈到的技术用于非法用途的后果自负。
校园网的封锁手段
要想对校园网进行行为管理来实现封锁,常见的有封锁IP、DNS污染、深度包检测(DPI)、CA证书欺骗等方式。
封锁IP
由于TCP/IP报文的源地址、目的地址、源端口号、目的端口号都是明文传送的,基于IP封锁的方式很容易实现。在校园网网关处部署防火墙,通过禁止特定IP和端口的连接,即可实现屏蔽某网站或应用,也可以轻松实现只屏蔽特定人群的某网站或应用。
缺点显而易见,这种封锁方法较为粗糙,容易误杀(而且很多网站是通过CDN分发的,封锁后会一并封了使用该CDN的其他网站)。
DNS污染
DNS即域名服务器,当设备通过某个网址进行连接时,首先会通过DNS查询网址对应的IP地址,再通过IP地址进行通信。于是只需要在校园网内搭建所需的DNS服务器,并且将所有机器上网时DHCP分配的DNS指向它,或者也可以在防火墙处将所有DNS流量(53端口的UDP协议流量)重定向到这台DNS服务器,就可以根据网络管理需要将网站解析到需要的IP地址(例如解析到127.0.0.1或者0.0.0.0会造成网站无法访问)。
DNS污染的封锁方式比较灵活,部署方便,早些年运营商经常通过这种方式在家庭宽带里插入广告,基本不存在误杀,但可以通过修改HOSTS文件,或者使用加密的DNS服务DNS over HTTPS(DoH)或DNS over TLS(DoT)绕过。
深度包检测(DPI)
DPI基于中间人攻击,很多时候可能不是想完全屏蔽某网站,只是想阻止网站上一些对学生有负面影响的内容,这时候就可以使用DPI技术。DPI技术通过检测数据包里的特定内容(例如关键字),将具有内容的连接重置,就可以阻止学生访问具有特定内容的页面;而将特定内容替换,就可以伪造学生看到的页面。
这种方式部署相对麻烦,对防火墙资源消耗较大,而且在HTTPS和TLS广泛应用的今天,页面内容基本上是加密的难以破解和伪造。
CA欺骗
HTTPS和TLS这样的加密技术,在协商会话秘钥时会交换非对称加密的公钥来确保连接安全,而为了确保双方的公钥可信,通常会使用权威CA机构的私钥对公钥进行签名,由于浏览器和操作系统内附带了CA机构的公钥,可以验证签名是否可信,用以防止中间人攻击,这样一来就使得DPI技术变得不可能。但部分校园网可能会要求学生安装特定客户端,也可以在机房电脑上操作,安装自签名的CA证书,这样便可以实现中间人攻击。
反代理技术
当然也有不少人尝试通过代理服务器访问外部网络,于是就有了代理检测的技术。
被动检测
在远古时期,人们都直接使用特征明显的VPN或者SOCK5代理以及HTTP代理,这些流量可以在防火墙端部署被动探测,根据其特征直接进行屏蔽。一般来说此类协议除非经过特殊许可,否则很容易被封禁。
主动检测
后来出现的Shadowsocks和Vmess等协议,通过尽量减少协议的特征来达到欺骗防火墙的目的。
于是主动检测技术出现了,通过伪造成客户端登录、重放数据包等方式,诱使代理服务器做出错误的应答从而精准打击。
针对这一类技术,目前的解决方案通常为使用TLS加密,加密后的流量虽然特征很强,但和HTTPS流量一致,无法完全封锁,同时伪装技术的升级也使得服务器不会做出错误的应答。
Xray代理
简介
V2ray上是一个高性能代理应用,主要具有如下优点:
- 开源。V2Ray是Project V的核心工具,源代码开源;
- 多协议支持。传输层支持TCP、mKCP、WebSocket等,上层协议支持Socks、Shadowsocks、以及自定义的VMess等;
- 多入口和多出口。V2Ray可同时支持多个入站和出站协议,每个协议独立工作;
- 多平台支持。原生支持Windows、Linux、MacOS三大常用平台,安卓、iOS两大移动平台有丰富的第三方工具;
- 隐蔽性。V2Ray流量可伪装成网页流量,更难被检测和干扰。
Xray继承自V2ray,是V2ray的一个超集。
一个Debian包维护者发现XTLS库的LICENSE不是BSD许可,提了一个issue希望作者 @rprx 能修改方便打包,详见https://github.com/XTLS/Go/issues/9。由这个issue引发了广泛讨论,rprx认为目前许可不是问题,也有不少人认为协议是立场的体现,各执一词。
最终V2ray(V2fly社区)维护者经过投票确认XTLS不符合V2ray的MIT协议,并在V2ray-core 4.33.0版本移除了XTLS。rprx和其拥护者行动起来,很快就创建了Project X项目和Xray子项目(Xray取名来自XTLS和V2ray的结合),并发布了Xray-core的多个版本。这便是Xray的大致由来。
详见项目主页:https://xtls.github.io/
本文着重讲解如何通过VLESS和Trojan协议建立代理服务器。
VMess协议
VMess 是一个无状态协议,即客户端和服务器之间不需要握手即可直接传输数据,每一次数据传输对之前和之后的其它数据传输没有影响。 VMess 的客户端发起一次请求,服务器判断该请求是否来自一个合法的客户端。如验证通过,则转发该请求,并把获得的响应发回给客户端。 VMess 使用非对称格式,即客户端发出的请求和服务器端的响应使用了不同的格式。
VMess同时支持转发UDP和TCP数据包,并且协议自带堆成加密,同事也支持额外的混淆。
Trojan协议
Trojan不使用自定义的加密协议来隐藏自身。相反,使用特征明显的TLS协议(TLS/SSL),使得流量看起来与正常的HTTPS网站相同。TLS是一个成熟的加密体系,HTTPS即使用TLS承载HTTP流量。使用正确配置的加密TLS隧道,可以保证传输的
- 保密性(无法得知传输的内容)
- 完整性(一旦试图篡改传输的密文,通讯双方都会发现)
- 不可抵赖(无法伪造身份冒充服务端或者客户端)
- 前向安全(即使密钥泄露,也无法解密先前的加密流量)
对于被动检测,Trojan协议的流量与HTTPS流量的特征和行为完全一致。而HTTPS流量占据了目前互联网流量的一半以上,且TLS握手成功后流量均为密文,几乎不存在可行方法从其中分辨出Trojan协议流量。
对于主动检测,当防火墙主动连接Trojan服务器进行检测时,Trojan可以正确识别非Trojan协议的流量。此时Trojan不会断开连接,而是将这个连接代理到一个正常的Web服务器。在防火墙看来,该服务器的行为和一个普通的HTTPS网站行为完全相同,无法判断是否是一个Trojan代理节点。
VLESS协议
VLESS是一种无状态的轻量级数据传输协议,被定义为下一代V2ray数据传输协议。作者对该协议的愿景是 “可扩展性空前,适合随意组合、全场景广泛使用,符合很多人的设想、几乎所有人的需求,足以成为v2ray的下一代主要协议,乃至整个XX界的终极协议。” ,由此可见VLESS协议的强大。
VLESS和VMESS区别如下:
- VLESS协议不依赖于系统时间,不使用alterId。一些人的V2ray用不了,最后找出原因是电脑时间和服务器只相差两分钟,简直要让人抓狂;VLESS协议去掉了时间要求,双手举赞;
- VLESS协议不带加密,用于上网时要配合TLS等加密手段;
- VLESS协议支持分流和回落,比Nginx分流转发更简洁、高效和安全,可以实现类似Trojan的伪装;
- 使用TLS的情况下,VLESS协议比VMESS速度更快,性能更好,因为VLESS不会对数据进行加解密;
- VLESS协议的加密更灵活,不像VMESS一样高度耦合。
同时VLESS协议支持XTLS方式加密,避免了对HTTPS流量的重复加密
XTLS的原理是:使用TLS代理时,https数据其实经过了两层TLS:外层是代理的TLS,内层是https的TLS。XTLS无缝拼接了内外两条货真价实的TLS,使得代理几乎无需再对https流量进行数据加解密,只起到流量中转的作用,极大的提高了性能。
Xray的安装
准备工作
- 准备一台能够不受限制访问网络的服务器,比如你要访问知乎,那么你就可以在宿舍准备一台不间断运行的树莓派,你也可以购买阿里云等的VPS,但是价格比较高。
- 安装操作系统。这里推荐使用Linux发行版,也会使用Debain系统进行演示,其余系统方法类似,不再赘述。同时为这台服务器配置一个静态的内网IP以便使用。
- 配置NAT防火墙。对于宿舍用户而言,NAT防火墙指的就是你的路由器,路由器会阻止你的传入连接,我们需要打开它。查看你的电脑IP,找到默认网关,将地址填入浏览器后登录路由器(密码通常在路由器背面),在里面找到虚拟服务器或者端口转发,将外网1043端口转发至刚才的服务器IP的443端口(这里外部之所以不使用443是因为家庭带宽默认封禁443端口,如果你是VPS用户可以使用)。
- 下载Xray,直接去https://github.com/XTLS/Xray-core下载即可。里面找到Release,选择最新版,然后Assert的地方找到对应操作系统和处理器的版本复制下载地址。然后在服务器上通过
wget 地址
即可下载。下载完成后解压,将geoip.dat、geosite.dat、xray移动到/usr/local/bin
目录下(需要root),然后新建/usr/local/etc/xray
用于存放配置文件。
域名申请
我们需要用到TLS加密,这时候需要向权威CA机构申请证书,会用到域名(不申请也可以直接IP连接,但是无法确保连接的安全性)。
这里推荐找一家支持DNS API的域名提供商,以便于证书自动续签,例如国内可以使用DNS Pod,如果不想实名验证的话,购买国外的注意找支持你的常用支付方式的(很多商家只支持信用卡或者Paypal),这里我不推荐花生壳动态解析,一来不付费它并不是很稳定,二来它技术很老连DNS API都不支持。
如果你是宿舍动态IP,可以参考我另一篇文章通过DNS API配置动态解析。
如果你是VPS用户,直接申请完域名后,添加子域名的A记录到你的VPS的IP地址即可。
证书申请
证书申请我们使用Let's Encrypt或者ZeroSSL的免费证书,这些证书一次可以申请三个月,但是会通过DNS API自动续签。这里以申请ECC证书为例(你也可以申请RSA证书,但是它安全性和速度都没有ECC证书好)
- 建立目录
/etc/acme.sh/你的域名
用于存放证书。 - 通过
curl https://get.acme.sh | sh
安装申请脚本,然后重新登录使环境变量生效。 - 设置DNS API环境变量
export DP_Id="你的ID"
与export DP_Key="你的Key"
。 - 申请证书
acme.sh --issue --dns dns_dp -w /etc/acme.sh -d 你的域名 --keylength ec-256
,如果让你登录的话,运行acme.sh --register-account -m 你的邮箱
。 - 配置自动安装
acme.sh --installcert -d 你的域名 --ecc --cert-file /etc/acme.sh/你的域名/chain.pem --key-file /etc/acme.sh/你的域名/privkey.pem --fullchain-file /etc/acme.sh/你的域名/fullchain.pem --reloadcmd "systemctl restart xray"
。这里我们还没有配置xray的服务,所以会报错。
这样证书就申请完毕了。
配置文件
在/usr/local/etc/xray
下建立配置文件config.json
内容如下(此时您应该注意到这个配置文件不是用来刷知乎的)
[========]
,然后根据注释自定义调整:
{
"log": {
"loglevel": "warning",
"access": "/var/log/xray/access.log", //记录访问的网站日志,如不需要可以删除
"error": "/var/log/xray/error.log"
},
"dns": {
"servers": [
"https+local://1.1.1.1/dns-query", //配置直接连接的DoH域名解析
"https+local://dns.google/dns-query"
]
},
"inbounds": [
{
"tag": "vless-in",
"port": 443,
"protocol": "vless",
"listen": "0.0.0.0",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"settings": {
"clients": [
{
"id": "UUID", //请生产随机UUID后填入
"flow": "xtls-rprx-direct",
"level": 0
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 875, //回落到Trojan端口
"xver": 1
}
]
},
"streamSettings": {
"network": "tcp",
"security": "xtls",
"xtlsSettings": {
"alpn": [
"http/1.1",
"h2"
],
"certificates": [
{
"certificateFile": "/etc/acme.sh/你的域名/fullchain.pem",
"keyFile": "/etc/acme.sh/你的域名/privkey.pem"
}
],
"minVersion": "1.3"
}
}
},
{
"tag": "trojan-in",
"listen": "127.0.0.1",
"port": 875,
"protocol": "trojan",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"settings": {
"clients": [
{
"password": "密码", //请生成随机密码后填入
"level": 0
}
],
"fallbacks":[
{
"dest": 80 //回落到nginx的伪装网站
}
]
},
"streamSettings": {
"network": "tcp",
"security": "none", //由于VLESS入口已经有加密这里不需要再加密
"tcpSettings": {
"acceptProxyProtocol": true
}
}
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom",
"settings": {
"domainStrategy": "UseIPv4" //强制域名使用自带DNS解析以便使用DoH
}
},
{
"tag": "blocked",
"settings": {},
"protocol": "blackhole"
}
],
"routing": {
"rules": [
{
"type": "field",
"inboundTag": [
"vless-in",
"trojan-in"
],
"ip": [
"geoip:private", //屏蔽私有IP确保安全
"geoip:cn" //屏蔽特定IP确保安全
],
"outboundTag": "block"
},
{
"type": "field",
"inboundTag": [
"vless-in",
"trojan-in"
],
"domain": [
"geosite:cn" //屏蔽特定域名确保安全
],
"outboundTag": "block"
}
]
}
}
配置xray服务
建立文件/etc/systemd/system/xray.service
如下
[Unit]
Description=Xray Service
Documentation=https://github.com/xtls
After=network.target nss-lookup.target
[Service]
User=root
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/usr/local/bin/xray -config /usr/local/etc/xray/config.json
Restart=on-failure
RestartPreventExitStatus=23
[Install]
WantedBy=multi-user.target
然后systemctl enable xray & systemctl start xray
启动xray服务。
配置伪装网站
接下来安装nginx配置伪装网站,直接apt-get update & apt-get install nginx -y
即可。
然后在/var/www/html
放入你的伪装网站,注意只支持html静态网站,如果需要PHP等动态页面请自行配置。网上随便下一个模板即可,推荐视频或者音乐网站模板。
接下来在浏览器直接输入域名加上端口号,应该可以打开你的伪装网站。
客户端的配置
Windows客户端有Clash(不支持VLESS)和V2rayN。
Android客户端有V2rayNG和Clash(不支持VLESS)。
iOS客户端有Shadowrocket和Quantumult X(不支持VLESS)。
如果你想使用Quantumult X和Clash,我们推荐你先通过V2rayN配置好节点,然后导入订阅转换器转换成对应订阅(注意不要导入VLESS节点),注意选择合适的配置文件。
对于类Linux系统例如安卓,协议可以选择xtls-rprx-splice配置内核转发数据包加速。如果使用V2rayN和V2rayNG的话可以配置绕过特定网站,V2rayNG也可以配置绕过指定应用。
然后你就可以用校园网愉快地刷知乎了。
Enjoy it!