原理
Xray是最新出来的一套网络工具集合,脱胎于V2ray但部分功能比V2ray更加激进,例如XTLS和回落技术,XTLS作为Xray独有的传输方式,的确是超越了目前大部分类似软件的传输协议,既能够做到流量的加密又能做到性能的提升。
而回落功能本质上就是一种类似反向代理的形式,只不过是需要配合Xray本身的XTLS流量才能发挥出最大的功用,例如同样是监听443端口,利用Xray的回落功能配合XTLS的传输方式,使得经过验证的XTLS流量由Xray指定特定的出口方法,而未通过Xray服务端验证的流量则根据对应的回落规则转发到相应的回落端口如8080端口,由监听回落端口8080的应用来处理该流量如Web服务器。
使用回落的好处是所有经过Xray监听进入的流量都可以是Https流量,即使后端服务并不是使用的HTTPS的配置,例如Xray监听443端口并回落8080端口,Nginx监听8080端口提供一个网站服务,Nginx同时将所有80端口流量rewrite重定向到443端口,由此则出现了下图一样的请求过程:
1、所有80端口的请求重定向到443端口,必须使用TLS加密
2、所有443端口的请求均通过Xray过滤转发
3、符合Xray要求的XTLS流量内部通过outbounds处理
3、不符合Xray要求的TLS流量则直接解密转发到8080端口
配置
梳理清楚原理了则可以直接上配置,本文使用oneinstack来部署LNMP,使用标准的Wordpress程序放置网站,监听和处理过程如上一节所叙述。
本文使用环境如下
- Centos 8
- Oneinstack编译LNMP环境
- wordpress最新版
- wordpress在网页根目录的wordpress目录当中(~/wwwroot/xyz.abc/wordpress)
- 网站域名为http://xyz.abc
Nginx配置监听80和8080
下面是Nginx的配置文件,一般不单独使用,而是作为单独的文件引入nginx.conf,例如在nginx.conf标准配置中加入include xyz.abc.conf,其中xyz.abc.conf为下面配置文件名称。
由于Xray会提供证书服务,故Nginx不配置SSL
# 下面两行设置配合Xray的xver:1和Nginx的proxy_protocol可以在日志标识正确流量来源
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
# 监听80端口并直接重定向到https的443端口
server {
listen 80;
server_name xyz.abc;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
# 监听8080端口的wordpress服务
server {
# proxy_protocol使得接收本地的流量能够在日志显示真实来源
listen 8080 proxy_protocol;
listen [::]:8080 proxy_protocol;
server_name xyz.abc;
access_log /data/wwwlogs/access.log combined;
index index.html index.htm index.php;
root /data/wwwroot/xyz.abc;
# 流量转发后wordpress的样式显示会有问题,识别为不安全,使用该配置upgrade请求
add_header Content-Security-Policy "upgrade-insecure-requests";
#下面是一些通用的wordpress配置
include /usr/local/nginx/conf/rewrite/wordpress.conf;
#error_page 404 /404.html;
#error_page 502 /502.html;
location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv|mp4)$ {
valid_referers none blocked *.65536.io 65536.io;
if ($invalid_referer) {
return 403;
}
}
location ~ [^/]\.php(/|$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$ {
expires 7d;
access_log off;
}
location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
deny all;
}
}
完成nginx配置之后通过如下命令重启nginx即可生效,但网站不一定能外网访问,这个不重要(甚至很有好处,文末有解释),重要的是让nginx监听80端口重定向,监听8080端口提供服务即可。
systemctl restart nginx
配置Xray回落Nginx
本质上Xray不用理会回落后的流量怎么被处理,故回落后由Nginx提供什么服务对于Xray并不重要,本例当中Nginx作为wordpress的服务提供者存在。故直接在Xray回落中配置回落端口为8080即可。
本例直接引用Xray官方教程中的配置文件,可以直接到官方教程查看(回落端口变为8080,官方教程为80),也可以在本例中查看
官方教程配置:https://xtls.github.io/documents/level-0/ch07-xray-server/
// REFERENCE:
// https://github.com/XTLS/Xray-examples
// https://xtls.github.io/config/
// 常用的config文件,不论服务器端还是客户端,都有5个部分。外加小小白解读:
// ┌─ 1_log 日志设置 - 日志写什么,写哪里(出错时有据可查)
// ├─ 2_dns DNS-设置 - DNS怎么查(防DNS污染、防偷窥、避免国内外站匹配到国外服务器等)
// ├─ 3_routing 分流设置 - 流量怎么分类处理(是否过滤广告、是否国内外分流)
// ├─ 4_inbounds 入站设置 - 什么流量可以流入Xray
// └─ 5_outbounds 出站设置 - 流出Xray的流量往哪里去
{
// 1_日志设置
"log": {
"loglevel": "warning", // 内容从少到多: "none", "error", "warning", "info", "debug"
"access": "/home/vpsadmin/xray_log/access.log", // 访问记录
"error": "/home/vpsadmin/xray_log/error.log" // 错误记录
},
// 2_DNS设置
"dns": {
"servers": [
"https+local://1.1.1.1/dns-query", // 首选1.1.1.1的DoH查询,牺牲速度但可防止ISP偷窥
"localhost"
]
},
// 3_分流设置
"routing": {
"domainStrategy": "AsIs",
"rules": [
// 3.1 防止服务器本地流转问题:如内网被攻击或滥用、错误的本地回环等
{
"type": "field",
"ip": [
"geoip:private" // 分流条件:geoip文件内,名为"private"的规则(本地)
],
"outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
},
// 3.2 屏蔽广告
{
"type": "field",
"domain": [
"geosite:category-ads-all" // 分流条件:geosite文件内,名为"category-ads-all"的规则(各种广告域名)
],
"outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
}
]
},
// 4_入站设置
// 4.1 这里只写了一个最简单的vless+xtls的入站,因为这是Xray最强大的模式。如有其他需要,请根据模版自行添加。
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "", // 填写你的 UUID
"flow": "xtls-rprx-direct",
"level": 0,
"email": "vpsadmin@yourdomain.com"
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 8080 // 默认回落到防探测的代理
}
]
},
"streamSettings": {
"network": "tcp",
"security": "xtls",
"xtlsSettings": {
"allowInsecure": false, // 正常使用应确保关闭
"minVersion": "1.2", // TLS最低版本设置
"alpn": [
"http/1.1"
],
"certificates": [
{
"certificateFile": "/home/vpsadmin/xray_cert/xray.crt",
"keyFile": "/home/vpsadmin/xray_cert/xray.key"
}
]
}
}
}
],
// 5_出站设置
"outbounds": [
// 5.1 第一个出站是默认规则,freedom就是对外直连(vps已经是外网,所以直连)
{
"tag": "direct",
"protocol": "freedom"
},
// 5.2 屏蔽规则,blackhole协议就是把流量导入到黑洞里(屏蔽)
{
"tag": "block",
"protocol": "blackhole"
}
]
}
例子中需要修改如下地方为自己网站的配置
- UUID
- 证书私钥和公钥目录
- 日志的目录
完成配置之后通过如下命令重启Xray服务(前提是通过官方脚本安装)
官方安装脚本地址:https://github.com/XTLS/Xray-install
systemctl restart xray
WordPress配置
WordPress不仅有配置文件,也有数据库配置,但是前文已经通过Xray回落8080端口,Nginx监听8080端口将整个通路连接起来,现在要做的是确保Wordpress可以正常工作,因为一般来说Wordpress迁移过来都是直接复制整个文件夹和数据库,所以保留了很多之前网站的配置,在本例中要做一些修改以免访问有问题,和一般的Wordpress迁移的注意事项类似。
首先修改数据库配置中wp-options中所的siteurl和home字段(WP在根目录的wordpress目录中)
siteurl字段修改为:http://xyz.abc/wordpress
home字段修改为:http://xyz.abc
注意由于Xray提供了证书服务,故wordpress的所有配置都是标准的http配置,无需在nginx或者wordpress当中使用https形式。
配置完成
完成所有配置之后,无论通过http://xyz.abc的形式,还是https://xyz.abc的形式都可以正常访问网站,对于http访问直接由nginx的80端口重定向到https访问,对于https的直接访问则由Xray处理相关流量,经过验证的流量走Outbounds,未经验证的流量则回落到8080端口的wordpress服务。
根据Xray的特点,整个系统防火墙本质上只需要开放两个端口,即80和443,其他的端口全部都是内部通讯无需对外暴露身份,也提高了VPS本身的防护能力,故推荐开启系统防火墙并只开放标准端口即可。