服务端Xray+VLESS+XTLS+NginxSNI配置方法
本文最后更新于 538 天前,其中的信息可能已经有所发展或是发生改变。

前言

虽然xray提供了反向代理功能,但是如果能够使用Nginx转发至后端的xray,这样也避免了因为xray的问题而影响到正常网站的访问。

在查阅资料之后我发现,nginx的SNI功能正好能满足我的需求。

准备

  • 一台海外的服务器(Ubuntu系统)
  • 一个能用的域名
  • Nginx需安装有ngx_stream_core_module模块与ngx_stream_ssl_preread_module模块(后面会介绍如何安装Nginx)

检查是否安装有这两个模块可以在控制台中输入sudo nginx -V,如果返回的内容中存在--with-stream--with-stream_ssl_preread_module则代表已安装,反之需要重新编译nginx进行模块安装。

安装

很多文章是用编译的方式安装Nginx,我觉得这样太麻烦了,这里直接使用apt安装。(注意,apt仅适合于Ubuntu及其衍生系统;如果你是用的CentOS的话,请看这篇文章安装Nginx)

下方的bionic需要换成自己服务器Ubuntu的版本号(ssh中输入 lsb_release -c 查看版本号)
# 进入目录
cd /etc/apt

# 备份源文件
sudo cp sources.list sources.list.bak

# 编辑源文件
sudo vi sources.list

# 文件末尾添加以下两行 注意bionic
http://nginx.org/packages/mainline/ubuntu/ bionic nginxdeb-src 
http://nginx.org/packages/mainline/ubuntu/ bionic nginx

# 保存文件
# 输入:wp

# 更新apt源
sudo apt update

# 安装nginx
sudo install nginx

然后我们安装Certbot,用于申请SSL证书和自动续期证书

安装方法可以看Certbot官网(Software选Nginx,System选自己服务器的Ubuntu版本)

最后安装Xray。在控制台内输入

# 切换到用户目录
cd ~

# 下载安装脚本
wget https://github.com/XTLS/Xray-install/raw/main/install-release.sh

# 修改脚本的一些配置
vi install-release.sh

# 修改以下配置
INSTALL_USER='root'
DAT_PATH=${DAT_PATH:-/etc/xray}

# 保存文件
:wq

# 安装xray
sudo bash install-release.sh

等待进度条走完之后xray就安装好了,就能开始配置相关软件了。

配置

Certbot

首先创建网页目录,并放入伪装网页。

cd /var/www

# 创建网页文件夹
sudo mkdir v2ray

然后把伪装网页放到刚刚创好的目录里面(即/var/www/v2ray),如果你暂时没有可以拿来用的伪装网页的话可以下载我的这个项目,然后放到目录里面。此步骤完成之后至少会在/var/www/v2ray文件夹内出现一个index.html文件。

然后打开 /etc/nginx/sites-enabled 内的网页配置文件(刚装的话里面应该有个default,打开这个就好,比如 vi /etc/nginx/sites-enabled/default ;当然你也可以选择直接新建一个文件来存放与XRay相关的配置内容),然后在文件最后添加下面的内容,并保存(先按ESC退出编辑模式,然后输入 : 再输入wq 回车)

server {
        server_name xtls.example.com; # 换成自己的域名
        index index.htm index.html;
        root /var/www/v2ray; # 这里是网页文件的存放目录,把html等文件放在这里面(没有就新建)
        #error_page 404 404.html;
        listen 80;
}

保存之后先检测刚刚编辑的文件是否有问题,没问题再加载新的配置文件,然后申请证书

# 检查配置文件,提示success就表示没问题
sudo nginx -t

# 加载新的配置文件
sudo nginx -s reload

# 用certbot申请证书
sudo certbot certonly

接下来按照提示填写相关信息和选择要申请的域名就行了。

Nginx

首先在/etc/nginx/nginx.conf中添加以下内容

stream {
        server {
                 listen 443 reuseport;
                 listen [::]:443 reuseport ipv6only=on;
                 proxy_pass $backend_name;
                 ssl_preread on;
        }
        map $ssl_preread_server_name $backend_name {
                xtls.example.com xtls; # 这里对应xray的访问域名
                www.example.com  web; # 这里对应网页的域名
                default web_default;
        }
        upstream xtls { server 127.0.0.1:10001; } # 这里对应xray的端口
        upstream web { server 127.0.0.1:10002; } # 这里对应nginx的网页端口
        upstream web_default { server 127.0.0.1:80; }
}

xtls.example.com www.example.com 需改为实际的访问地址,其中xtls开头的代表的是用于翻墙的域名,另外一个就是正常的网页。

然后删除上一步在申请证书时向 /etc/nginx/sites-enabled 内的网页配置文件中添加的server节点的内容,并在最后添加以下内容

# 这是直接访问http地址时出现的网页
server {
        server_name xtls.example.com;
        index index.htm index.html;
        root /var/www/v2ray;
        #error_page 404 404.html;
        listen 80;
}

# 这是xray的回落地址,也就是主动访问https地址时出现的网页
server {
        server_name _;
        index index.htm index.html;
        root /var/www/v2ray;
        #error_page 404 404.html;
        listen 10010 proxy_protocol;

        location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-IP $proxy_protocol_addr;
        # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-For $http_x_forwarded_for;
        proxy_set_header X-Forwarded-For $proxy_protocol_addr;
        }
}

# 这是其他网页的配置(可选,没有就不要加)
server {
        ……
        listen 10002 ssl http2;
        port_in_redirect off; # 如果不加这句访问php网页时会出现端口号
        ……
}
如果不写 port_in_redirect off 这句那么可能在访问网页的时候出现端口号

然后用上一节相同的方法检查Nginx的配置是否正确,正确就重新加载Nginx的配置信息。

Xray

修改/etc/xray/config.json文件为以下内容

{
    "stats": {},
    "api": {
        "tag": "api",
        "services": [
            "StatsService"
        ]
    },
    "policy": {
        "levels": {
            "0": {
                "statsUserUplink": true,
                "statsUserDownlink": true
            }
        },
        "system": {
            "statsInboundUplink": true,
            "statsInboundDownlink": true,
            "statsOutboundUplink": true,
            "statsOutboundDownlink": true
        }
    },
    "log": {
        "error": "\/var\/log\/xray\/error.log",
        "access": "\/var\/log\/xray\/access.log",
        "loglevel": "warning"
    },
    "inbounds": [
        {
            "port": 10001,
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "email": "这里是邮箱",
                        "id": "这里是uuid",
                        "flow": "xtls-rprx-direct",
                        "level": 0
                    }
                ],
                "decryption": "none",
                "fallbacks": [
                    {
                        "dest": 10010,
                        "xver": 1
                    }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "xtls",
                "xtlsSettings": {
                    "certificates": [
                        {
                            "certificateFile": "这里是域名证书文件fullchain.pem的路径",
                            "keyFile": "这里是域名证书文件privkey.pem的路径"
                        }
                    ],
                    "alpn": [
                        "http\/1.1"
                    ]
                }
            },
            "domain": "xtls.example.com 请按实际内容修改",
            "tag": "A"
        },
        {
            "listen": "127.0.0.1",
            "port": 58430,
            "protocol": "dokodemo-door",
            "settings": {
                "address": "127.0.0.1"
            },
            "tag": "api"
        }
    ],
    "outbounds": [
        {
            "tag": "direct",
            "protocol": "freedom",
            "settings": {}
        }
    ],
    "routing": {
        "rules": [
            {
                "inboundTag": [
                    "api"
                ],
                "outboundTag": "api",
                "type": "field"
            }
        ],
        "domainStrategy": "AsIs"
    }
}

请注意上方代码中的"port": 10002,"dest": 10010,

第一个10002端口也就是nginx内配置的xray端口;第二个10010是xray回落地址,也就是说当xray检测到流量不是代理流量时(比如直接在网页上访问域名)将会把流量转发至此端口,这里我转发到nginx上,也就是直接显示一个网页,这样能对xray进行伪装。

最后

重启Xray和Nginx

sudo systemctl restart nginx
sudo systemctl restart xray

在浏览器中访问代理地址,检查是否成功回落,配置代理软件检查能否正常使用。

参考资料

使用Nginx进行SNI分流并完美和网站共存 – Xiaomage’s Blog

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇