Featured image of post 从V2ray迁移到Hysteria

从V2ray迁移到Hysteria

我真是受够了信息时代闭关锁国了

最近网络封锁可以说越来越紧了,热门线路的v2ray早已达到了开了没多久就被封的地步。原本以为自己的偏远线路不会引起注意,但没想到在两会召开之际,昨天晚上电脑一上线,发现我的v2ray ws+tls被封了。这也意味着自从去年10月以来有热门线路ws+tls被封的报告以来, 现在的墙已可精准识别所有不管热门还是偏远线路的所有的v2ray协议。个人认为即使套上uTLS也只能缓解,这只是包中的一个特征,在启用深度包检测的情况下,终究还是会有其他特征被挖掘暴露出来。这种自动猫捉手动老鼠的游戏是无尽的,是时候说再见了。

协议选择

自从v2ray内部开发者大分裂后,现在翻墙协议已是五花八门满天星的状态。比如ss的TCP协议更新到了2022版,kcp协议更是一直存活,v2ray也加上了uTLS抵抗封锁。另外,还有无数人部署自己的小协议,就仗着用的人少流量少不会被注视到,而可惜的是这些小协议都很少有客户端支持。因此个人考虑协议时, 考虑的是协议要满足这几点:

  • 使用人数众多,且在最近几次封锁中均存活。这个过滤下来其实只有两个协议了。XRay和Hysteria
    • XRay的工作方式主要为“回落”。即xray监听443端口,当于服务器建立TCP连接时,对客户端发送的前几个进行分析,如果识别为不XRay协议,则将流量转发至原本的443部署的服务。如果识别为XRay协议且协议为TLS网络流量,则在验证完成后,作为一个单纯的流量代理中转,使用请求TLS加密单纯进行流量拷贝。 而对于其他流量,XRay的处理方式与V2ray相同。这也是为什么XRay兼容V2ray的原因。在走XTLS的情况下,由于之后的包为单纯的数据拷贝,因此其相对V2ray特征更少,更容易抵抗墙的大流量嗅探分析
    • Hysteria则可以说是ss KCP协议的进一步加强,它基于并魔改了谷歌的QUIC协议,来使得这个“速度快、抗干扰、有加密”的协议更加适合纯代理的场景。由于有了TLS的加密,它和服务器的传输更像是一个HTTPS的UDP传输,也没有了ss KCP中“没有特征就是特征”的弱点
  • win+linux+android都有客户端支持
    • 很可惜的是,虽然我向别人推荐时一般更推荐XRay(教程更为成熟对方自己可根据文档自行Debug),但由于XRay作者本人的人品原因和MPL协议的版权集中,导致XRay在Linux圈中打包积极性并不高。相比于V2Ray直接就被很多发行版官方源支持,XRay只有少数的发行版的第三方源提供了打包。 GUI客户端更是没人做(原本qv2Ray的作者支持,但后来也是被气得直接永久停更)。相较之下,虽然较简陋,但Hysteria还是可以做到稳定的全端GUI支持

通过以上比较,通过几番斟酌后,新的代理协议最终选择为Hysteria

Hysteria部署

接下来就是正文了,Hysteria部署也不算很难,基本按照官方教程部署即可。首先登上自己的vps,切换至相应用户的相关文件夹,从github的release下载Hysteria最新的release。最新版本的发布页详见此Github页面, 在最新版的Assets里寻找Linux 64位版本可执行文件:hysteria-linux-amd64下载。下面以1.3.3版本为例:

1
2
3
mkdir {存放的文件夹} && cd {存放的文件夹}
wget https://github.com/apernet/hysteria/releases/download/v1.3.3/hysteria-linux-amd64
mv hysteria-linux-amd64 hysteria

随后,新建一个config.json,Hysteria需要你的服务器有一个域名,并提供内部的acme.sh或直接使用已有证书两种方式进行部署。由于个人已自行架设网页并用certbot生成证书(详情请参考vps服务器配置),因此这里仅介绍直接使用已有证书的方式, 其他方式可参照官方教程

对于certbot生成的证书,一般保存在/etc/letsencrypt/live/{你的域名}/底下。因此,相关的配置文件为:

1
2
3
4
5
6
{
  "listen": ":{监听端口}",
  "cert": "/etc/letsencrypt/live/{你的域名}/fullchain.pem",
  "key": "/etc/letsencrypt/live/{你的域名}/privkey.pem",
  "obfs": "{传输加密密码}"
}

但是,出于安全性考虑,一般代理服务是部署在低权限用户上的,它并没有权限访问证书文件。所以这里还需要赋予我们低权限用户相关证书文件的读权限。切换到root用户,执行以下命令:

1
2
3
4
5
chmod a+r /etc/letsencrypt/live
chmod a+r /etc/letsencrypt/archive
# 证书的key文件一般为仅root用户可读,而在live文件夹的文件只是个软链接,因此这里还需找到通过`ls -l /etc/letsencrypt/live/{你的域名}/privkey.pem`找到你key文件真实所指向的地方,给它单独赋权
# 这里所指向的文件视不同情况不一样,请看自己live里的key指向的哪,不要照抄,这里只写出我个人的情况
chmod a+r /etc/letsencrypt/archive/{你的域名}/privkey1.pem

随后通过 ./hysteria server -c config.json来运行,在客户端进行相应配置后,测试检查连接可行性

测试通过后,同样使用守护进程supervisor来维持其启动状态,编写编写/etc/supervisor/conf.d/hysteria.conf新建守护配置文件。在其中填写:

1
2
3
4
5
6
7
8
9
[program:hysteria]
command=/path/to/your/hysteria server -c /path/to/your/config.json
autostart = true
autorestart=true
user={低权用户}
startretries = 5
stdout_logfile = /home/{低权用户}/{自定义的logFolder}/hysteria_access.log
stderr_logfile = /home/{低权用户}/{自定义的logFolder}/hysteria_error.log
stdout_logfile_maxbytes = 25MB

然后使用supervisorctl update更新配置列表,使用supervisorctl start hysteria开启hysteria。使用supervisorctl status检查开关状态,大功告成!

Built with Hugo
Theme Stack designed by Jimmy