随着Xray的问世,以其兼容vless、vmess、trajon多种模式以及其独特的xtls和fallbacks功能,掀起了一波热潮,我也终于按耐不住,决定把原有的服务替换升级成Xray

目标:保证wordpress和tgbot能够正常运行的情况下,把v2ray替换成Xray

原方案:Nginx使用443端口,通过反代的方式,对v2ray进行反代,使得wordpress、tgbot以及v2ray共用443端口

现方案:Xray使用443端口,通过Xray自身强大的fallbacks功能,通过域名(name)、路径(path)、端口(dest)进行分流和回落,保证wordpress和tgbot能够正常使用

下面记录一下实现的过程以及踩过的坑

卸载v2ray

停用并关闭服务
systemctl stop v2ray
systemctl disable v2ray
#删除文件
rm -rf /etc/v2ray/*  #(配置文件)
rm -rf /usr/bin/v2ray/*  #(程序)
rm -rf /var/log/v2ray/*  #(日志)
rm -rf /lib/systemd/system/v2ray.service  #(systemd 启动项)
rm -rf /etc/init.d/v2ray  #(sysv 启动项)

安装Xray

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

官方参考

Xray配置文件

找到/usr/local/etc/xray/config.json并编辑

{
    "log": {
        "loglevel": "debug",
        "access": "/var/log/xray/access.log",
        "error": "/var/log/xray/error.log"
    },
    "inbounds": [
        {
            "port": 443,
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "68b0fb83-4574-4204-8856-64c248715c97", // 填写你的 UUID
                        "flow": "xtls-rprx-direct",
                        "level": 0,
                        "email": "love@example.com"// 随意填写
                    }
                ],
                "decryption": "none",
                "fallbacks": [
                    {
                        "dest": 8080, // 默认回落到nginx(nginx配置处需要与其一致)
                        "xver": 1
                    },
                    {
                        "name": "tgbot.banana-zone.tk", // 使用Xray的SNI功能按域名分流,才能保证tgbot的正常使用
                        "dest": 8081,
                        "xver": 1
                    },
                    {
                        "path": "/rayy", // 必须换成自定义的 PATH(vless+ws)
                        "dest": 11024,
                        "xver": 1
                    },
                    {
                        "path": "/ray", // 必须换成自定义的 PATH(vmess+ws)
                        "dest": 10000,
                        "xver": 1
                    }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "xtls",
                "xtlsSettings": {
                    "alpn": [
                        "http/1.1"
                    ],
                    "certificates": [
                        {
                            "certificateFile": "/root/ssl2/banana-zone.tk.fullchain.cer",
                            "keyFile": "/root/ssl2/banana-zone.tk.key"
                        }
                    ]
                }
            }
        },
        {
            "port": 11024,
            "listen": "127.0.0.1",
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "68b0fb83-4574-4204-8856-64c248715c97", // 填写你的 UUID
                        "level": 0,
                        "email": "love@example.com"
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "ws",
                "security": "none",
                "wsSettings": {
                    "acceptProxyProtocol": true,
                    "path": "/rayy" // 必须换成自定义的 PATH,需要和分流的一致
                }
            }
        },
        {
            "port": 10000,
            "listen": "127.0.0.1",
            "protocol": "vmess",
            "settings": {
                "clients": [
                    {
                        "id": "68b0fb83-4574-4204-8856-64c248715c97", // 填写你的 UUID
                        "level": 0,
                        "email": "love@example.com"
                    }
                ]
            },
            "streamSettings": {
                "network": "ws",
                "security": "none",
                "wsSettings": {
                    "acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS,需要删掉这行
                    "path": "/ray" // 必须换成自定义的 PATH,需要和分流的一致
                }
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}

官方参考

这里特别说一下Xray的SNI。原本我的想法是在fallbacks处添加两个回落端口,如8080,8081(就是不符合规则的流量都进入到这两个端口),然后在nginx配置同样配置8080,8081,然后让nginx通过server name来区别博客和tgbot。但是后面发现根部不可行,浏览器直接输入tgbot.example.com会直接跳转到example.com,也就是直接进入到博客了,而没有转到tgbot服务上面。最终看了官方给出的解决办法,采用目前最优的一种——Xray 监听 443 端口,通过 Fallbacks 功能 SNI 分流将网站流量回落到 Nginx 或 Caddy。后面继续补充该方法的实现过程

Nginx配置文件

首先我并没有完全按照官方的教程来
Nginx需要安装http_realip_module模块
博客配置

server {
        listen 80;
        server_name banana-zone.tk;##你的域名
        rewrite ^(.*)$  https://$host$1 permanent; ##这句是强制HTTP跳转HTTPS
}

server
    {
        listen 127.0.0.1:8080 proxy_protocol default_server;
        server_name banana-zone.tk;##你的域名
        index index.html index.htm index.php;
        root  /home/wwwroot/default;
        add_header Content-Security-Policy "upgrade-insecure-requests";##重要——修复wordpress样式问题
        add_header Strict-Transport-Security "max-age=63072000" always;##重要

        include enable-php.conf;

        location / {
            try_files $uri $uri/ /index.php?$args;
        }
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        location /nginx_status
        {
            stub_status on;
            access_log   off;
        }

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf){
            expires      30d;
        }

        location ~ .*\.(js|css)?
        {
            expires      12h;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }

    access_log  /root/1access.log;
    error_log   /root/1error.log debug;

}

tgbot配置

#添加这两句
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
#添加这两句

server {
        listen 80;
        server_name tgbot.banana-zone.tk;##你的域名
        rewrite ^(.*)$  https://$host$1 permanent; ##这句是强制HTTP跳转HTTPS
}

server {
  listen 127.0.0.1:8081 proxy_protocol;
  server_name tgbot.banana-zone.tk;

  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header Host $http_host;
  proxy_set_header X-NginX-Proxy true;

  proxy_redirect off;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_ssl_server_name on;
  add_header Content-Security-Policy "upgrade-insecure-requests";##重要
  add_header Strict-Transport-Security "max-age=63072000" always;##重要

  location / {
    proxy_pass https://127.0.0.1:8443;
  }

  access_log  /root/tg.log;
    error_log  /root/tg.error.log;
}

参考文章

补充说明一下,域名证书需要使用泛域名证书才行,因为Xray、Nginx和tgbot都是共用一个域名证书的

各模式优劣势说明

  • VMESS,最普通的V2ray服务器
  • VMESS+KCP,传输协议使用mKCP,VPS线路不好时可能有奇效(没试过)
  • VMESS+TCP+TLS,带伪装的V2ray,可用CDN
  • VMESS+WS+TLS,即最通用的V2ray伪装方式,可用CDN,推荐使用
  • VLESS+KCP,传输协议使用mKCP
  • VLESS+TCP+TLS,通用的VLESS版本,可用CDN,比VMESS+TCP+TLS方式性能更好
  • VLESS+WS+TLS,能过CDN中转,有过CDN情况下推荐使用
  • VLESS+TCP+XTLS,目前最强悍的VLESS+XTLS组合,强力推荐使用(但是支持的客户端少一些)
  • trojan,轻量级的伪装协议
  • trojan+XTLS,trojan加强版,使用XTLS技术提升性能