静看光阴荏苒
不管不顾不问不说也不念

Xray+VLESS+XTLS+NginxSNI分流/443端口复用

我这两年一直都用的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配置粘贴上来回复,这样不方便阅读,更不方便别人解决你的问题,你应该找一个在线的剪切板服务,把配置代码写到剪切板里面,评论的时候给出剪切板的地址。

赞(8)
未经允许不得转载:荒岛 » Xray+VLESS+XTLS+NginxSNI分流/443端口复用
分享到: 更多 (0)

评论 20

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    牛批

    meilinhost3周前 (12-24) Google Chrome 87.0.4280.101 Google Chrome 87.0.4280.101 Android 10 Android 10回复
  2. #2

    最近正好也在研究,谢过大佬 :mrgreen:

    Distro3周前 (12-24) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
  3. #3

    v2的TLS功能很不完善,博主可以通过ssllabs.com测试一下,分流至VLESS端口的流量允许使用TLS1.0和不安全的加密套件,与“现代”的Web服务器表现相差太远了,就因为这个我最后还是回到了haproxy分流,官方在issues里也表明以后也不会考虑加入选择加密套件功能,直接让v2建立TLS还是得慎重

    judi3周前 (12-24) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • https://github.com/XTLS/Xray-core/releases
      https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600
      请看最新的release说明,现在xray支持SSL自定义套件了

      Gandi3周前 (12-24) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • 也许 V2Ray 没有这个功能,但 Xray 已经有了,详见 https://xtls.github.io/config/transport/#streamsettingsobject。

      Daniel3周前 (12-24) Google Chrome 87.0.4280.101 Google Chrome 87.0.4280.101 Android 9 Android 9回复
    • 另外,之所以评分低主要是因为 V2Ray 支持 TLS 1.0 和 TLS 1.1。而互联网中还有很多流量使用 TLS 1.x 加密,个人认为这与你说的“和现代 Web 服务器相比相差远”并不符合。

      Daniel3周前 (12-24) Google Chrome 87.0.4280.101 Google Chrome 87.0.4280.101 Android 9 Android 9回复
    • 我认为这篇文章介绍的是xray不是v2ray。。。xray是v2ray的一个超集,几乎和v2ray是完全兼容的,但本质上还是两个不同的项目吧。你可能需要先了解一下xray和v2ray有哪些不一样的地方。不过haproxy分流也是一个很不错的方法。

      LALA3周前 (12-30) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
  4. #4

    这样固然实现了分流,但是 XTLS 就没有用了。只有让 Xray 监听 443 端口才能使用 XTLS。

    Daniel3周前 (12-24) Google Chrome 87.0.4280.101 Google Chrome 87.0.4280.101 Android 9 Android 9回复
    • 其实可以考虑让 Xray 监听非 443 端口,然后回落到 443 端口,以应对主动探测。

      Daniel3周前 (12-24) Google Chrome 87.0.4280.101 Google Chrome 87.0.4280.101 Android 9 Android 9回复
    • xtls没用了是什么意思,这样配置的话最后解密不还是xray做的么,愿闻其详。

      LALA3周前 (12-30) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
  5. #5

    大佬有比較好的聊天項目嗎?Rocket.Chat好是好,但唯獨延遲太大,無法即時收到信息,而且客戶端還沒有提示收到新消息。 :eek:

    Foliage3周前 (12-25) Chrome 87.0.4280.77 Chrome 87.0.4280.77 iPhone iOS 14.3 iPhone iOS 14.3回复
    • 可以考虑用matrix
      客户端用element

      Gandi3周前 (12-25) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
      • 本来这博客也有Riot的教程,无奈年代久远,脚本都用不了,所以可惜了,虽然安装没Rocket.Chat方便,但胜在UI确实很美观。

        Foliage3周前 (12-25) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • 比rocketchat更好用,但是要花钱:Mattermost,也有免费版,免费版是功能被阉割过的,就不如rocketchat了。

      LALA3周前 (12-30) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
      • 我建了个matrix,然后配合Element,发现界面什么的都比rocket好看,感觉功能也强大
        有没有可能解决lala rocket.chat上遇到的问题,可以考虑下
        :shock:
        https://github.com/vector-im/element-web

        Mattermost界面不好看,我在宿舍的服务器上搭过免费版的

        Gandi2周前 (12-31) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
        • 我倒是无所谓了,反正我那个rocketchat就是放养状态。。。一直仍在oracle的免费小鸡上面都没想到能活这么久的。。

          LALA2周前 (12-31) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
          • snap大法好 :mrgreen:

            Gandi2周前 (12-31) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition
  6. #6

    我还在纳闷小火箭里的XTLS是什么玩意儿的时候,lala已经掌握了其中的精髓 :?:

    橘子3周前 (12-29) Google Chrome 83.0.4103.80 Google Chrome 83.0.4103.80 Windows 10 x64 Edition Windows 10 x64 Edition回复
  7. #7

    所以Vmess換VLESS以後之前的問題有改善嗎?或者速度有明顯提升麼?我自己用Vmess TLS WS目前還沒什麼問題⋯⋯
    不得不誇一下rprx等大佬們,XRay的更新頻率有點厲害

    henry2周前 (01-04) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Mac OS X  11.1.0 Mac OS X 11.1.0回复
    • 问题就解决了呀,现在完全没有阻断了,电脑和手机都正常了,至于速度的话我没有测试过,这个就不太清楚了。

      LALA6天前 Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复

分享创造快乐

广告合作资源投稿