安装xray服务端 配置XTLS回落

2020-11-21更新:由于许可证争议,XTLS已从v2ray-core中移除,本教程换用TLS.
2021-1-1更新:建议使用xray-core.
2021-1-28更新:换用xray
2021-3-18更新:可选SNI分流(配置多证书,并在fallbacks指定”name”)

注:本文仅作一个手动搭建的简单示范,不推荐用于生产环境。且本文不积极更新,任何内容均可能过时。
对于新手,推荐阅读:小小白白话文

安装之前

  1. 确保系统时间正确(对于VLESS来说非必需)
  2. 更新内核并开启BBR(强烈建议)
  3. 确保80与443端口是开放的
  4. 安装了curl与一款趁手的文本编辑器

安装xray-core

Xray-install 脚本安装

1
2
#安装和更新xray
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
1
2
3
#每周一凌晨三点更新v2ray
crontab -e
0 0 3 * * MON /bin/bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install > /dev/null

安装后的配置文件路径为:/usr/local/etc/xray/config.json

选定协议并编写config

可以参考XTLS/Xray-examples仓库。

我们可以借助前置VLESS方便地配置回落。(xray的Trojan有完整的VLESS-fallbacks支持,配置方式完全一致)
其他分流方式有:前置Caddy, nginx等反代或者使用TLS分流器

所有这些回落/分流都是为了达到443端口复用的目的,使你各种服务的流量都经SSL加密,像是在正常访问一个网站一样(防探测)。

这里选用前置VLESS-TCP-XTLS, 默认回落到trojan, trojan默认回落到nginx反代。若有其他回落需求,可参考这个示例。若有其他需求(e.g.开一个mkcp),自行添加”inbounds”.

下面附上我的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"email": "[email protected]",
"id": "", //替换为你的UUID,可用工具生成
"flow": "xtls-rprx-direct",
"level": 0
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 1310, // 默认回落到Xray的Trojan协议
"xver": 1
}
]
},
"streamSettings": {
"network": "tcp",
"security": "xtls",
"xtlsSettings": {
"alpn": [
"http/1.1",
"h2"
],
"certificates": [
{
"certificateFile": "/var/www/ssl/cert.pem",
"keyFile": "/var/www/ssl/cert.key"
}
//,
// { //可以添加多个证书
// "certificateFile": "/var/www/ssl/cert2.pem",
// "keyFile": "/var/www/ssl/cert2.key"
// }
]
}
}
},
{
"listen": "127.0.0.1",
"port": 1310,
"protocol": "trojan",
"settings": {
"clients": [
{
"email": "[email protected]",
"password": "", //替换为你的密码
"level": 0
}
],
"fallbacks": [
{
"dest": 8080 //回落到反代
}
// ,
// {
// "name": "another.domain", //SNI分流
// "dest": "/dev/shm/nginx_unixsocket/default.sock" //回落到Unix Socket
// },
// {
// "name": "another.domian",
// "alpn": "h2",
// "dest": "/dev/shm/nginx_unixsocket/h2.sock"
// }
]
},
"streamSettings": {
"network": "tcp",
"security": "none",
"tcpSettings": {
"acceptProxyProtocol": true
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}

PS:复制config内容的时候可能导致格式混乱,vim中执行:%!python -m json.tool来格式化

配置反代

这里使用的是nginx,其他(如:Caddy2)同理

安装nginx (也可以自行编译安装)

1
apt install nginx

修改nginx配置文件

1
nano /etc/nginx/sites-available/default

附上我的配置文件(示例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
server {
listen 80;
listen [::]:80;
server_name example.com; #替换为你的域名
rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server {
listen 8080 http2;
server_name example.com; #替换为你的域名
add_header Content-Security-Policy upgrade-insecure-requests; #混合内容均升级为https
location / { #指向你的博客或者其他程序监听的端口
proxy_pass http://localhost:8081/;
}
# 也可以同时列个文件
# location /file/ {
# #root /var/www;
# alias /var/www/file;
# charset utf-8;
# autoindex on;
# autoindex_exact_size off;
# autoindex_localtime on;
# try_files $uri $uri/ =404;
# }
}

# server {
# listen unix:/dev/shm/nginx_unixsocket/default.sock;
# listen unix:/dev/shm/nginx_unixsocket/h2.sock http2;
# server_name another.domain;
# add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always;
# root /path/to/webroot/;
# index index.html;
# }

每次修改配置文件后记得systemctl reload nginx

配置SSL证书

拥有一个域名

首先你要拥有一个域名,并将A记录指向你的服务器IP地址。没有的可以去Freenom申请一个免费域名,或者购买一个自己的域名。

如果你想购买一个属于自己的域名,我推荐NameSilo(这是我的推广链接),你可以使用我的优惠码 ColderOne 来节省1USD.

申请证书

借助acme.sh脚本自动化申请、续约LE证书
流程可以参考其中文Wiki

如果你遇到问题,可以暂时关闭占用80端口的程序使用standalone模式申请证书。使用standalone模式必须安装socat

示例:使用nginx模式生成证书

1
acme.sh --issue -d example.com --nginx //example.com替换为你的域名

安装证书

生成证书后我们将证书导出至v2ray配置文件中指定的目录 (自行替换你的域名和路径)

1
2
3
4
acme.sh --install-cert -d example.com \
--key-file /var/www/ssl/cert.key \
--fullchain-file /var/www/ssl/cert.pem \
--reloadcmd "systemctl restart xray"

--reloadcmd十分重要,它保证你的证书更新后能够被服务器刷新,这里指的是能被xray重新加载(类似有--post-hook--renew-hook

最后解决一下证书权限问题,参考这篇说明的方案二

启动xray

1
2
systemctl enable xray
systemctl restart xray