试用xray xtls,对比v2ray

前排声明,本人不了解xx-net, shadowsocks, v2ray等软件,没有安装过上述软件。下面的内容是在山上捡到的u盘里面的一段文字。

阅读本文需要一定的基础,我不会讲解每个软件的起源,功能,使用方法,技术思路,只是我的日记。

本文配置中的UUID为后来修改

又有一些开发者闹翻了,因为开源协议的问题,一群开发者从 v2fly 社区出走,建立了 xray,目前,xray 可以看作是 v2ray 的超集(当前时间21年3月12日),以后可能会合并或各自发展新思路。

关于分叉的事情,我是举双手赞成的。在 ss 被重点针对的 2018 年,类似的软件很少,导致被检测后,很多人面临着断网的问题。后来,v2ray 的文档快速发展,使其被大多数人使用。但是很长时间内,v2ray 都是唯一满足需求的软件,我常常担心如果 v2ray 也被针对,该怎么办。开发者之间闹翻了,好啊,更多的软件会涌现出来,让人有更多的选择。

#回顾我与v2ray的经历,总结一下

我是 2018 年春季从 ss 换到 v2ray 的,当时网络上有一些文章研究 ss 流量特征,介绍了怎么精确识别 ss 流量,我也看不懂,也不想看,也不想思考,只想稳定的上网。然而事与愿违,新建的 ss 只能正常用几分钟,然后速度会被限制在 20kb/s。这个问题困扰我很久了。当时我在 Digital Ocean 租用 vps,换 ip 倒是比较方便,但是 20kb 左右的速度实在是令人难受。诶,你要是完全阻断,我也好下定决心研究一下,换一个方法,但是你只是限速,丢包,就让我这样的懒人不想动手。忘了是什么导致我最终放弃 ss 的了,不过我依旧记得那个下午,我在 B213 这间教室,换到了 v2ray。嗯,稳定了一些。

当时 v2ray 还是 3.x 的版本,文档写的真是差,我很诧异为什么功能那么强大,那么复杂,花样那么多的 v2ray,几乎没有文档。后来接触了一些人,他们这样讲:“ss 就是因为文章太多,会用的人太多,招来杀身之祸。我们 v2ray 要低调,不要叫太多人用”。好家伙,别人开发软件都是希望使用者越多越好,你们反过来。

v2ray 比 ss,要复杂的多,软件体积也大,使用速度也慢一些。同样的环境,v2ray 走 tcp 的 ping 也要高上几毫秒(我知道 ping 是 icmp 报文,但是这类软件,我们测试 tcping),如果你要伪装一下,混淆一下,那就会慢很多。ping 高了,速度慢了,cpu 负载高了,内存开销也大了。几年前的一些低端路由器会因为 rom/ram 小而无法使用原版 v2ray ……还要特别压缩一下。

刚使用 v2ray 时,我直接尝试了复杂的方案:caddy + wss。刚被 ss 检测所折磨,我想换一个稳定一点的,加一些伪装。结果令人难以接受:学生也租不起什么强大的 vps,也不奢望 cn2 线路。Digital Ocean 50美元的学生优惠让我使用5美元一个月的乞丐版 vps,线路不好,性能也不强。caddy + wss 跑起来有些吃力。与 tcp 方式相比,caddy + wss 伪装多了一些步骤,自然延迟大。于是换到了纯 tcp。这套配置一用就是 2 年多。不要盲目认为 websocket 减少握手次数就好,也不要认为 mux 真的有用,真实的网络环境很复杂,多试试不同的方案。

这两年,v2ray 有了一些新的协议,新的伪装,但是我一直没动。上网嘛,稳定是最主要的,加载慢可以干点别的,喝杯茶网页就打开了。这期间也经历过一些重点时间段,群里一些人的线路被封。通过他们的经历,我认为:防火墙一定能识别你的流量。网络上的流量,每一段的起点和终点都一清二楚,用排除法也能知道谁在干什么。平时没封你,一是检测要消耗较大的算力,网络关键节点总是跑检测,对整个网络性能有很大影响,也费电;二是不想封你。华夏zf对外网不是完全干扰的。教育网一直可以裸连 Google,Youtube。我在学校使用教育网时,还有一段时间能通过 ipv6 直连 pornhub(是的,pornhub 测试过 ipv6,而且学校的教育网直连秒开)。

说一个有趣的事情:很多关键时段,大陆网络干扰严重,这时期会有一大批一大批的机场完蛋。在这种时候,我的网络反而是最快的。原因:用的人少了,不挤了。大约在十多年前,大陆对通往海外的网络连接采取干扰措施,使得访问海外流量减少,大陆与海外的网络建设也就慢了下来。目前大陆到美国的光纤,别说8亿网民使用,就是部分网民翻墙,都不够。中国移动最差劲。就是没有网络长城,中国移动的用户怕是也连不上 Google。

因为我的fq服务器是自用,而且不信愚蠢的法轮功,这些年没断过。也不想换配置。但是!!!今天发现 xray 支持 udp 了。这吸引了我,v2ray 的 udp 还是通过转换实现的,xray 说自己的 udp 是真的,那我就要试一试了。偶尔玩游戏还要买加速器,如果梯子能同时作为网游加速器用,那真的很好。

顺带说一句,我真的很不喜欢 xray 这个网站的文字,给我的感觉:很跳,不成熟,充满了小孩子气。

#安装与使用 xray

明天再写,今天敲了一天键盘,想活动活动。

13 日更新:

这 xray 翻墙软件的取名真不合适,Google 搜 xray 第一个条是同名的另一个工具,渗透测试用的,第二条是维基百科关于x光的介绍。接下来是一堆拍x光的相关内容。这感觉就像我自己写了一个工具,起名叫 Tesla 一样。不合适不合适。

我在这里贴一个 xray 的官方仓库吧,免得小伙伴找错:https://github.com/XTLS/Xray-core。同时,还有社区版 v2ray 的仓库地址:https://github.com/v2fly/v2ray-core

按照官方文档,最基本的安装是脚本安装,以下命令是在有 systemd 的 Debian 下执行的,其他环境请自己改动。

sudo bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

任何情况下我本人都不建议使用脚本安装这类软件。尤其是需要 root 权限来执行。万一脚本里有什么坏指令,就 GG 了。

先新建一个文件夹,避免污染环境

mkdir xray && cd xray

然后获取安装脚本,看看这个东西都做了什么

wget https://github.com/XTLS/Xray-install/raw/main/install-release.sh

less install-release.sh 

(就在我看脚本的时候,想起了锅里还煮着粥……关了火,现在只能吃锅巴了)

发现这个脚本里还有很多可以修改的安装配置。按照你想要的配置修改后,安装

sudo bash install-release.sh

后来安装时,发现这个仓库被墙了,那就要用代理安装,幸运的是脚本里已经提供了代理接入

sudo bash install-release.sh -p "socks5://127.0.0.1:54321"
#初看 xray

默认的配置文件在/usr/local/etc/xray/,虽然 xray 完全兼容v2ray,但是尝试 xray 就是为了其特点。

性能这种东西,机场主更关心一些,只要软件能跑起来,就能满足大多数个人用户了。xray 默认提供了一些配置模板,在 https://github.com/XTLS/Xray-examples,本来想试试 VLESS + tcp,结果人家:

那就加上 tls,使用最简配置。

我这里用 caddy 了,caddy 还会自动申请并维持 tls 证书,方便又简单。没有用过 caddy 的可以按照caddy 官方文档去安装 caddy。

#配置 caddy
usla.acytoo.com {
    root * /home/acytoo/example_site
    file_server
    log {
        output file /home/acytoo/access.log
    }
}

上面是 caddy 的配置,我将日志储存在用户目录下,但是 caddy 的默认用户是 caddy,而 caddy 用户没有 acytoo 用户目录下文件的读写权限,所以我们要手动创建日志,并将权限赋予 caddy 用户。

cd

touch access.log

sudo chown caddy:caddy access.log

sudo systemctl restart caddy

这样,caddy 配置完毕并启动。我的服务器绑定的域名是 usla.acytoo.com,服务器用户名是 acytoo,在用户目录下,有一个叫 example_site 的文件夹,就是伪装网站的根目录。在伪装网站的根目录下,有一个 index.html 伪装网页。index.html 内容如下

<!DOCTYPE html>
<html>
    <body>
        <br><br>
        <center>
        <h1>这里什么都没有</h1>
        <h2>但是你可以访问这个<a href="https://acytoo.com">acytoo.com</a></h2>    
        </center>
    </body>
</html>

接下来就重启caddy,看看我们的网站有没有顺利建成。

sudo systemctl restart caddy

不错,一个“网站”已经跑起来了。

#配置服务器端 xray

接下来找到 caddy 为我们申请的 tls 证书

sudo find / -name usla.acytoo.com.key
找到证书,把证书 key 和 crt 的地址复制到 xray 的配置文件里。下面是 VLESS + tls + tcp 的配置文件,VLESS + xtls 的配置文件在最后面。
{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "port": 57913,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "a808524e-80fc-482f-8c18-b0e0a0026a09",
            "level": 0,
            "email": "acytoo@example.com"
          }
        ],
        "decryption": "none",
        "fallbacks": [
          {
            "dest": 80
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "alpn": [
            "http/1.1"
          ],
          "certificates": [
            {
              "certificateFile": "/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/usla.acytoo.com/usla.acytoo.com.crt",
              "keyFile": "/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/usla.acytoo.com/usla.acytoo.com.key"
            }
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom"
    }
  ]
}

重新启动xray,看看是不是正常运行

sudo systemctl restart xray
sudo systemctl status xray

失败了……

查看原因,发现是证书的权限不对

看看caddy的执行用户是谁

结合 caddy 的文档,caddy2 中,默认执行 caddy 的是一个叫 caddy 的用户,这是为了避免暴露太多权限,我们修改 xray 的执行用户,安装 xray 时我们选择的执行用户是 nobody,现在把 nobody 改成 caddy。

sudo nano /etc/systemd/system/xray.service

把 User 的值改成 caddy。修改过后的 service 文件是这样的。

[Unit]
Description=Xray Service
Documentation=https://github.com/xtls
After=network.target nss-lookup.target

[Service]
User=caddy
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/usr/local/bin/xray run -config /usr/local/etc/xray/config.json
Restart=on-failure
RestartPreventExitStatus=23
LimitNPROC=10000
LimitNOFILE=1000000

[Install]
WantedBy=multi-user.target

然后重载systemd配置文件,启动xray,查看xray的状态,这次成功运行了。

sudo systemctl daemon-reload

sudo systemctl start xray

sudo systemctl status xray
#配置客户端 xray

也不安装了,直接下载 linux amd64 版本的包,解压。不同系统请自行选择软件,配置文件如下,把配置文件放在你解压后的目录就好。我把本地配置文件命名为 local_config.json ,你可以任意命名这些文件,只要修改相应的命令即可。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "port": 35791,
      "listen": "127.0.0.1",
      "protocol": "socks",
      "settings": {
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "usla.acytoo.com",
            "port": 57913,
            "users": [
              {
                "id": "a808524e-80fc-482f-8c18-b0e0a0026a09",
                "encryption": "none",
                "level": 0
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls"
      }
    }
  ]
}

本地启动 xray,下面的命令在你下载的xray的目录中执行。

./xray --config=./local_config.json

然后测试是否连通

curl --proxy socks5://127.0.0.1:35791 ipinfo.io

已经连通,ip已经是代理服务器的ip地址。

安卓端,v2rayNG 已经很好的支持 xray,手动输入 VLESS 配置就可以用。老实讲我目前没有注意到 xray 与 v2ray 用起来有什么区别。不知道为何大家一窝蜂涌向 xray。

#xray 对比 v2ray

#软件体积对比

两者的最新版本(21年3月13日),amd64 版本,体积对比如下

xray 说它把 v2ray 和 v2ctl 的功能合并了。简单说下,v2ray 是提供代理功能的软件,v2ctl 通常用来验证配置文件是否正确。两者都是 golang1.16 打包的。go 语言默认是静态编译,所有依赖的库都会塞进去,所以这个结果符预期。v2ray 和 v2ctl 两者都用了 json 库,据说 json 库体积较大。以前在路由器上用过极致压缩的 v2ray,只有 4MB 多,删除了 json 等库。配置文件需要特殊生成,我觉得要压缩体积,这种方法很好。v2ray 把 v2ctl 单独分出来的思想:没必要把不常用的功能模块长期装载到 RAM 中。于是 v2ctl 单独分出来。这样虽然在 ROM 里的体积大了,但是在 RAM 中的体积小了。而且如果你能确保配置文件格式正确,是可以删除 v2ctl 的。这样看来, v2ray 反而体积小。

不过,无论是 xray 还是 v2ray,都要做成兼容各种软件,支持各种协议的“大一统",服务端与客户端也要融合在一起。这样真的好吗?

#软件性能对比

想测试以下使用同一配置文件,以及不同配置文件的性能区别,包括延迟,内存占用,速度等。在同一服务器上,同一时间测试应该比较靠谱。奈何现在已经14号凌晨1点了。

13号下午去陪姥姥,今天会去奶奶家聚餐,凌晨1点我想着活动活动身体,腰疼……也不知道什么时候能写完“日记”。

14 日更新:

感觉无法对比。瞎比较下试试吧。

vps 是白嫖的 GCP,300 美元用 90 天,我开了几个小鸡,因为香港和台湾等比较快的机器给朋友分享过。而我为了测试的准确性,只能选择 LA 这种很慢的机房,保证只有我一个人用。下午的网络连接状况不太好,YouTuebe 能自动720p,手动切换到1080p 也还行,没有明显的卡顿,更高就不行了。

v2ray 的进程我有过好几个月不重启的时候,与新开的进程在 cpu 开销与内存占用方向区别也不大,长期使用稳定性很好。我就不各自重启进程了。找了同一段视频,但是不是同时,分别使用 v2ray 与 xray 观看,同样的服务器同样的本地,保证没有浏览器缓存。

两者的区别不大,上下波动都很小。但是,我发现 xray 的回落端口设置与其功能似乎有关系。因为我是用 caddy 做伪装网站,caddy 设置了自动 tls,即访问 http 80 端口的连接会自动跳转到 https 443,443 端口被 caddy 占用,所以上面的配置中,我没有按照例子配置那样将 xray 的进站端口设置为 443,而是空闲的 57913,而回落目标端口,我直接设置了 443,为了减少 caddy 的开销。结果,回落端口设置为 443 时,经常会打不开网页,Youtube 视频无法加载的状况。默认的日志中没有任何显示。查看 caddy 的日志,也没有任何意料之外的访问,即没有回落。将回落端口设置为 80 时,则一切正常。

xray 的日志的确更好看,能直接看出哪个链接是哪个用户发出的:uuid 与用户设置的邮箱相对应,在日志里直接显示用户邮箱,对多用户共用且查看日志的人挺有用的。日志含有太多私人内容,我就不截图了。

根据需求选择软件,根据时间安排是否替换已有软件。管他白猫黑猫。

 

16 日更新:

v2ray 更新到了 4.36.1, xray 更新到了 1.4.0。去 xray 的网站看了看,作者对 xtls 极为推崇,了解一下这个 xtls 到底是什么东西,我打算试试他的“终极配置”。

开源软件一大缺点就是改动频繁,为了避免歧义,我将截稿时的“终极配置”截图,以后当“终极配置”属于别的配置的时候,大家也会知道,曾经的王者。

看了“终极配置”,发现是一些配置一起用,包括 VLESS + xlts, trojan, VLESS + wss, vmess + tcp, vmess + ws,都是很好的协议,但是我用不上,所以只保留了 xtls。如果有人想全部试试,记得 caddy 或 nginx 的反代设置,他例子里没有,我上面的 caddy 配置也没加这个。

{
  "log": {
    "loglevel": "error"
  },
  "inbounds": [
    {
      "port": 57913,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "a808524e-80fc-482f-8c18-b0e0a0026a09",
            "flow": "xtls-rprx-direct",
            "level": 0,
            "email": "acytlss@example.com"
          }
        ],
        "decryption": "none",
        "fallbacks": [
          {
            "dest": 443,
            "xver": 1
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "xtls",
        "xtlsSettings": {
          "alpn": [
            "http/1.1"
          ],
          "certificates": [
            {
              "certificateFile": "/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/usla.acytoo.com/usla.acytoo.com.crt",
              "keyFile": "/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/usla.acytoo.com/usla.acytoo.com.key"
            }
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom"
    }
  ]
}

本地配置先按照示例中改,想加上本地 DNS 与分流,但是 v2ray 的本地 DNS 一般,不知道 xray 有什么改进,先测试几天。记得安卓端要改 xtls。

{
  "log": {
    "loglevel": "error"
  },
  "inbounds": [
    {
      "port": 54321,
      "listen": "127.0.0.1",
      "protocol": "socks",
      "settings": {
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "usla.acytoo.com",
            "port": 57913,
            "users": [
              {
                "id": "a808524e-80fc-482f-8c18-b0e0a0026a09",
                "flow": "xtls-rprx-direct",
                "encryption": "none",
                "level": 0
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "xtls",
        "xtlsSettings": {
          "serverName": "usla.acytoo.com"
        }
      }
    }
  ]
}

19 日更新:

17 日换上了透明代理,手机与电脑不需要任何设置,只要连接翻墙路由器,就能直接访问较为完整的互联网,感兴趣的可以移步 xray 透明代理