我这两年一直都用的Vmess,也挺好的没出什么问题,就是偶尔碰到“过节”的时候,比如国庆啊啥的,会经常阻断我。平时都挺正常的。。
但是不知道从什么时候开始,大概也就最近半年吧,我这里的网络也不知道是什么情况,一天要被阻断无数次。。偶尔来一次,一次来个几分钟也还可以接受,现在天天都来,就有点难受了。。
最近这半个月更是出了个莫名其妙的问题,我手机上面的配置从来没改动过,但是就经常连不上,而且一连不上可能是几天都连不上。。
所以我想试着换个方法,看看能不能缓解我这个问题。
认真考虑了一番,我决定试试目前比较新的Vless+XTLS,正好也尝尝鲜,折腾一下嘛。
由于我之前也配置过Vless,我知道这个协议本身没有加密最好配TLS用,所以一般这个协议是直接用443端口,但是我几台VPS上面肯定还要放点其他的东西,直接把443端口给占了,我就不能拿来建站了。
当然直接让Vless走别的端口是最简单的,比如8443之类的,但是这样的话我总觉得有点不够优雅。。所以我在想一个可以顾全大局的配置方案,那么最终我目前用的就是这篇文章内的方案了:用Nginx做SNI分流,让443端口可以复用,这样一来就完美解决了443端口的问题。
废话就不多说了,下面就把我部署过程写上来,如果对你有帮助,那真是极好的。
首先需要安装nginx和nginx的stream模块,这个模块在Debian上有软件包可以直接安装:
apt -y update apt -y install curl git nginx libnginx-mod-stream python-certbot-nginx
接下来安装xray,由于我的机器内之前装过旧版的v2ray,所以我先把旧版的这些文件删了:
rm -rf /usr/bin/v2ray /var/log/v2ray /etc/v2ray /etc/systemd/system/v2ray.service systemctl daemon-reload
如果你是全新的机器那就直接执行下面这个脚本即可:
bash <(curl -L https://raw.githubusercontent.com/XTLS/Xray-install/main/install-release.sh)
接下来我们首先编辑nginx的主配置文件:
nano /etc/nginx/nginx.conf
在http块的外部加入如下配置(也就是下面的这个配置独立出来:)
stream { map $ssl_preread_server_name $imlala_xray { xtls.imlala.best xtls; wordpress.imlala.best wordpress; typecho.imlala.best typecho; } upstream xtls { server 127.0.0.1:50001; # xray服务端口 } upstream wordpress { server 127.0.0.1:50010; # 你的第一个网站的ssl端口 } upstream typecho { server 127.0.0.1:50011; # 你的第二个网站的ssl端口 } server { listen 443 reuseport; listen [::]:443 reuseport; proxy_pass $imlala_xray; ssl_preread on; } }
上面这个配置有3个域名:
1.xtls.imlala.best
2.wordpress.imlala.best
3.typecho.imlala.best
第一个upstream的域名是必须的,也就是你需要更换这个域名为你自己的。
而第二第三到第N个upstream后面的是其他网站的域名,如果你在这台服务器上有运行其他网站并且绑定了不同域名那这里就改成你自己的域名,没有的话可以忽略。这里只是做一个SNI分流的示范。
特别需要注意的是,由于在stream块内监听了443端口,其他nginx的配置文件内不能再有监听443端口的listen,否则nginx启动会报错。
除此之外SNI分流如果要正常工作的话,前提是你的其他nginx配置文件内原本监听443端口的listen需要改为你在upstream内指定的端口。
接下来搭建一个用于vless的回落站点,也可以说是伪装站点,这里随便搞个静态页面就行,我这里就弄了个小游戏:
cd /var/www/html git clone https://github.com/tusenpo/FlappyFrog.git flappyfrog
注:这个游戏过于暴力,建议你们不要使用,可能会导致域名加速被墙。。。
现在新建一个nginx配置文件,用于回落站点:
nano /etc/nginx/conf.d/fallback.conf
写入如下配置:
server { listen 80; server_name xtls.imlala.best; if ($host = xtls.imlala.best) { return 301 https://$host$request_uri; } return 404; } server { listen 127.0.0.1:23333; server_name xtls.imlala.best; index index.html; root /var/www/html/flappyfrog; }
这里需要注意是,回落站点不需要配置ssl,如果vless将请求回落到这个站点的话,这个站点是自动支持ssl的。
你只需要保证回落站点的server_name和stream块内配置的xray服务端域名是同一个即可。例如本文内的:xtls.imlala.best
此外,在之前就说过listen不能监听443端口,这里你可以改任意一个其他没有占用的端口,例如上面这个配置中的23333端口,那么23333端口就是回落端口。
现在我们需要使用certbot签发一个ssl证书,之前说过回落站点不需要ssl,所以这里的certbot使用下面的命令,仅生成证书不修改nginx的配置文件:
certbot certonly --nginx
将生成好的证书复制到xray的配置目录:
cp /etc/letsencrypt/live/xtls.imlala.best/fullchain.pem /usr/local/etc/xray/fullchain.pem cp /etc/letsencrypt/live/xtls.imlala.best/privkey.pem /usr/local/etc/xray/privkey.pem
由于xray通过systemd管理,而systemd内的用户是nobody,所以证书的所有者也要改为nobody,否则xray没有权限读取证书文件:
chown nobody:nogroup /usr/local/etc/xray/fullchain.pem chown nobody:nogroup /usr/local/etc/xray/privkey.pem
生成一个uuid,复制下来:
cat /proc/sys/kernel/random/uuid
编辑xray的配置文件:
nano /usr/local/etc/xray/config.json
清空里面的配置,改为如下配置:
{ "log": { "loglevel": "warning" }, "inbounds": [ { "listen": "127.0.0.1", # 仅监听在本地防止探测到下面的50001端口 "port": 50001, # 这里的端口对应nginx内的upstream端口 "protocol": "vless", "settings": { "clients": [ { "id": "7f46753a-6a4b-4284-94c0-760340f96f1e", # 填写你的UUID "flow": "xtls-rprx-direct", "level": 0 } ], "decryption": "none", "fallbacks": [ { "dest": "23333" # 回落站点的端口号 } ] }, "streamSettings": { "network": "tcp", "security": "xtls", "xtlsSettings": { "alpn": [ "http/1.1" ], "certificates": [ { "certificateFile": "/usr/local/etc/xray/fullchain.pem", # 你的域名证书 "keyFile": "/usr/local/etc/xray/privkey.pem" # 你的证书私钥 } ] } } } ], "outbounds": [ { "protocol": "freedom" } ] }
确认上面这些配置无误后,设置nginx/xray开机自启:
systemctl enable nginx xray
重启nginx和xray使新的配置生效:
systemctl restart nginx xray
服务端到这里就全部完成了,接下来是客户端。windows客户端推荐使用v2rayn。
v2rayn目前有一个问题是,v2ray-core在4.33已经移除了这个协议,你需要手动把xray的core下载解压到v2rayn的根目录:
https://github.com/XTLS/Xray-core/releases/download/v1.1.4/Xray-windows-64.zip
不需要删除原来的v2ray.exe也不需要重命名xray.exe,解压就OK了,参考这里:
https://github.com/2dust/v2rayN/issues/1181
然后打开v2rayn添加vless服务器:
如果按照这篇文章部署,并且确认你的配置无误的话还是连接不上,首先检查你的服务器防火墙是否放行了80/443端口。
你还可以简单验证一下回落配置,用浏览器直接访问你的域名,如果正常的话应该能访问到这个小游戏:
这套配置比较繁琐,如果你在部署的过程遇到了什么问题,评论的时候请不要把一大坨xray或者nginx配置粘贴上来回复,这样不方便阅读,更不方便别人解决你的问题,你应该找一个在线的剪切板服务,把配置代码写到剪切板里面,评论的时候给出剪切板的地址。
牛批
最近正好也在研究,谢过大佬
v2的TLS功能很不完善,博主可以通过ssllabs.com测试一下,分流至VLESS端口的流量允许使用TLS1.0和不安全的加密套件,与“现代”的Web服务器表现相差太远了,就因为这个我最后还是回到了haproxy分流,官方在issues里也表明以后也不会考虑加入选择加密套件功能,直接让v2建立TLS还是得慎重
https://github.com/XTLS/Xray-core/releases
https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600
请看最新的release说明,现在xray支持SSL自定义套件了
也许 V2Ray 没有这个功能,但 Xray 已经有了,详见 https://xtls.github.io/config/transport/#streamsettingsobject。
另外,之所以评分低主要是因为 V2Ray 支持 TLS 1.0 和 TLS 1.1。而互联网中还有很多流量使用 TLS 1.x 加密,个人认为这与你说的“和现代 Web 服务器相比相差远”并不符合。
我认为这篇文章介绍的是xray不是v2ray。。。xray是v2ray的一个超集,几乎和v2ray是完全兼容的,但本质上还是两个不同的项目吧。你可能需要先了解一下xray和v2ray有哪些不一样的地方。不过haproxy分流也是一个很不错的方法。
这样固然实现了分流,但是 XTLS 就没有用了。只有让 Xray 监听 443 端口才能使用 XTLS。
其实可以考虑让 Xray 监听非 443 端口,然后回落到 443 端口,以应对主动探测。
xtls没用了是什么意思,这样配置的话最后解密不还是xray做的么,愿闻其详。
抱歉,之前没看清 Nginx 用 stream 做的分流,四层上的转发当然没问题。另外现在 Xray 也有 sni 分流功能了。
大佬有比較好的聊天項目嗎?Rocket.Chat好是好,但唯獨延遲太大,無法即時收到信息,而且客戶端還沒有提示收到新消息。
可以考虑用matrix
客户端用element
本来这博客也有Riot的教程,无奈年代久远,脚本都用不了,所以可惜了,虽然安装没Rocket.Chat方便,但胜在UI确实很美观。
比rocketchat更好用,但是要花钱:Mattermost,也有免费版,免费版是功能被阉割过的,就不如rocketchat了。
我建了个matrix,然后配合Element,发现界面什么的都比rocket好看,感觉功能也强大
有没有可能解决lala rocket.chat上遇到的问题,可以考虑下
https://github.com/vector-im/element-web
Mattermost界面不好看,我在宿舍的服务器上搭过免费版的
我倒是无所谓了,反正我那个rocketchat就是放养状态。。。一直仍在oracle的免费小鸡上面都没想到能活这么久的。。
snap大法好
我还在纳闷小火箭里的XTLS是什么玩意儿的时候,lala已经掌握了其中的精髓
所以Vmess換VLESS以後之前的問題有改善嗎?或者速度有明顯提升麼?我自己用Vmess TLS WS目前還沒什麼問題⋯⋯
不得不誇一下rprx等大佬們,XRay的更新頻率有點厲害
问题就解决了呀,现在完全没有阻断了,电脑和手机都正常了,至于速度的话我没有测试过,这个就不太清楚了。
謝謝博主的文章,已部署成功。詢問一個小白問題,關於本文端口復用。除Xray外,我另外用Docker部署Nextcloud在同一台服務器上。
nextcloud.conf中listen 127.0.0.1:50010 ssl (就如本文例子)
當docker-compose中設置port 6666:6666, nextcloud.conf中proxy_pass http://服務器公網ip:6666,完全沒有問題,可是防火牆要另外單獨開一個口
但當docker-compose中設置port 127.0.0.1:6666:6666,nextcloud.conf中proxy_pass http://127.0.0.1:6666,這時候打開網頁就會顯示502 Bad Gateway
我本意是想Nginx能代理到internal port,就不用防火牆再單獨開一個口了。Nginx還不是太熟悉,請問有可能出現的問題是在哪裡?謝謝
不好意思,解決了,是我太粗心了,fallback.conf裡的80監聽沒有改⋯⋯添加上302以後就好了 >.<
大佬,你的Xtls网址能不能打开时样式不错乱?用wordpress搭建的网站这种方法xtls域名打不开网站或者样式错乱
不会错乱呀,F12看看控制台里面报的啥错?
用的mac电脑,好像按F1也看不出所以然。我设置的是回落到wordpress动态网站错乱,静态没事。比如回输入https://v.xxx.com (这是回落的https网址)就是样式错乱的
我只能说太棒了,这个443复用问题,是一直阻碍正式部署的最大障碍。写这么清晰,而且是基于最新xray,你是第一人!
如果是自己安装nginx的话,编译的时候,需要增加哪个模块?
ngx_stream_ssl_preread_module:http://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html
–with-stream_ssl_module –with-stream_ssl_preread_module
是加这两个参数,还是仅仅后面一个就可以了?
不建议编译,如果是ubuntu系统,可以从Nginx官网安装最新版,默认带了这些模块。
# 清理之前从Ubuntu源安装的Nginx
apt purge nginx nginx-full nginx-common nginx-core
apt-get autoclean
apt-get autoremove
lsb_release -cs # 比如查看Ubuntu版本代号 20.04是focal
# 添加mainline源
nano /etc/apt/sources.list.d/nginx.list
# 添加两行代码
deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ focal nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ focal nginx
# Get the signing key
wget http://nginx.org/keys/nginx_signing.key
# Add the key
apt-key add ngh=amd64] http://nginx.org/packages/ubuntu/ focal nginxinx_signing.key
# Refresh packages index
apt update
apt install nginx
用了这个方案后,访问过一次之后,浏览器缓存会混乱,举例就是1.example1.com会显示成2.example1.com,不知道是不是因为用了同一张证书,如果把1.example1.com改为1.example2.com则无此问题
hi博主好!新年快乐!我V2RAY现在也遇到了和你一样的情况,稳定运行了好久,前几天断了。重装了一遍NGINX和证书申请,还是不行,所以想换xray方式看下,看完你分享的脚本,有些地方不知道怎么弄,希望能解答下!我的问题是我VPS现在已经有了NGINX 和用acme.sh申请了证书,不是用你上面的certbot去申请的,所以,两个证书的文件一个是srt,和key结尾的文件,不是以pem结尾的文件,那我还需要运行你这个apt -y install curl git nginx libnginx-mod-stream python-certbot-nginx,去重新申请一次证书吗?我的意思是说我能直接用我vps里已经用ACME.SH申请的证书吗?而不用certbot再去申请一次,如果证书直接可以用的话,会对上面你分享的NGINX脚本冲突吗?
可以直接用acme.sh申请的证书,不需要重新用certbot申请,nginx配置也不会影响,你只需要把xray里面配置的证书换成你自己的就行了。
感谢博主回复!是这样,当我准备做的时候,我检查了原来已经安装运行在VPS上的nginx,用的ubuntu系统,nginx的版本号是1.18,但是发现没有那个stream模块,这种情况下改如何操作呢?是直接运行你提供的这个apt -y install curl git nginx libnginx-mod-stream python-certbot-nginx命令重新安装一遍覆盖就可以吗?还是需要删除掉原来的nginx后重新用你提供的apt -y install curl git nginx libnginx-mod-stream python-certbot-nginx来安装一遍,后面的python-certbot-nginx也是需要安装的对吗?
如果你不打算用certbot那就不需要安装python-certbot-nginx,同时你已经安装了nginx,那nginx也不需要再安装了。现在你只需要安装libnginx-mod-stream即可。由于我不怎么用ubuntu,我也不是很清楚在ubuntu上nginx的stream模块是不是这个包名,如果不是你就要google搜索一下了。
好的,感谢分享技术!祝网站越来越好!
现在xray支持sni分流了,可以不用nginx stream了
server {
listen 80;
server_name http://www.zi.ml;
if ($host = http://www.zi.ml) {
return 301 https://$host$request_uri;
}
return 404;
}
server {
listen 127.0.0.1:23333;
server_name http://www.zil.ml;
index index.html;
root /www/vvv;
}
请问第二个域名的NGINX配置这样哪里错了吗? 无法访问
server_name的配置不需要加http://前缀。
请问刚才留言www.zi.ml是我除XRAY 第二个网站的NGINX 是否错误,访问只能看到Welcome to nginx!的网页,无法访问静态网页
vps 上面有其他网站 已经用jwilder/nginx-proxy来分流(因为这个可以续订证书),如何设置 docker-compose配置xray?
博主您好,我按照您的教程搭建了vless,但我搭建中转的时候怎么都无法成功,不知道您有没有时间出一篇中转的教学,谢谢博主(不嫌弃的话可以用我的小中转机测试
好的,有空我折腾看看。
问一下大佬 我想用这套方案来做个落地 配置应该怎么写?A、B两台机器 同时照教程部署的 xray 现在想用 B 机器来转发 A 机器 A机器当落地 配置应该怎么写 我网上找了一圈都是针对 v2ray 的 就算依葫芦画瓢修改也不行~
另外还想再问一下 我购买了网上那种流媒体解锁服务 也就是 DNS 解锁 我部署完成后用客户端打开都可以正常观看 解锁 但用在路由器上就无法正常解锁和观看想问问大佬有啥好的解决方法?
vless+xtls的中转我也没配置过,这个我得先配置看看才能知道是什么情况。。既然是买的流媒体解锁服务,那最了解这个东西的不是卖家么。。。我没买过这些就不是很清楚了。。。
流媒体这是酱紫 我用客户端链接时都没有问题 就是懒直接用路由翻的时候 就没办法识别了 这个无所谓 都是小问题 还是希望大佬有空指导一下中转 vless+xtls 的技术 我现在中转还在用你的 shadowsocks+v2rayping
博主好: 小白问题 这个如何透传真是Ip?
需不需要开启长连接呢 感觉有点断断续续的
传递真实ip可以配置proxy protocol来实现。
已配置成功,牛批
想问大佬一个奇葩问题 我在 xray 协议里面加入 ss 协议 但我同时又想把 ss 的协议同样走到 443 里面去 应该怎么操作
简单点复述一下就是 我想把 ss 协议里面的端口 12345 一样像 xray 那样通过 SNI 分流走 443
配置回落应该就可以了。
大佬可以给个粟子吗 毕竟只会抄作业的小白 要我自己搞估计就GG了
一句话 还是看不懂~~!
这个伪装的游戏好是好,就是不知道博主有没有感觉时间过得有点快
大佬!用宝塔+vless+tcp+xtls。另外宝塔上还想搭建些网站。443分流这么搭配。有没有简单无损耗的方案??指点下。谢谢
请问在AWS上刚建的节点,nginx前置+xray的,刚建完可以用,过一会就用不了了,用ping.pe测试国内国外还都能ping通,这是啥情况
用tcp ping测试看看,也许是tcp阻断,也可能是端口被封了。