前言
虽然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)
# 进入目录
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网页时会出现端口号
……
}
然后用上一节相同的方法检查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
在浏览器中访问代理地址,检查是否成功回落,配置代理软件检查能否正常使用。