通过Xray代理在校园网内愉快刷知乎

通过Xray代理在校园网内愉快刷知乎

校园网的墙越修越高,最近知乎以及其他部分网站或应用完全无法访问。本文将介绍校园网如何封杀这些网站,以及如何通过部署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的安装

准备工作

  1. 准备一台能够不受限制访问网络的服务器,比如你要访问知乎,那么你就可以在宿舍准备一台不间断运行的树莓派,你也可以购买阿里云等的VPS,但是价格比较高。
  2. 安装操作系统。这里推荐使用Linux发行版,也会使用Debain系统进行演示,其余系统方法类似,不再赘述。同时为这台服务器配置一个静态的内网IP以便使用。
  3. 配置NAT防火墙。对于宿舍用户而言,NAT防火墙指的就是你的路由器,路由器会阻止你的传入连接,我们需要打开它。查看你的电脑IP,找到默认网关,将地址填入浏览器后登录路由器(密码通常在路由器背面),在里面找到虚拟服务器或者端口转发,将外网1043端口转发至刚才的服务器IP的443端口(这里外部之所以不使用443是因为家庭带宽默认封禁443端口,如果你是VPS用户可以使用)。
  4. 下载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证书好)

  1. 建立目录/etc/acme.sh/你的域名用于存放证书。
  2. 通过curl https://get.acme.sh | sh安装申请脚本,然后重新登录使环境变量生效。
  3. 设置DNS API环境变量export DP_Id="你的ID"export DP_Key="你的Key"
  4. 申请证书acme.sh --issue --dns dns_dp -w /etc/acme.sh -d 你的域名 --keylength ec-256,如果让你登录的话,运行acme.sh --register-account -m 你的邮箱
  5. 配置自动安装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!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注