要做的事情非常简单:
- 安装
- 配置(如安装TLS证书、
config.json
) - 运行
- 优化(如更新内核、开启
bbr
、网站http
访问自动跳转https
等)
7.2 安装Xray
首先,Xray的官方载体,就是 xray-core 开源项目(基于 MPL 2.0
开源协议)生成的二进制程序。你把这个二进制放在服务器运行,它就是服务器端;你把它下载到本地电脑运行,它就是客户端。主要区别来源于【配置】。
安装时,直接使用官方安装脚本就很简单直接。它提供了多种安装选项,有兴趣的可以去官方的安装脚本仓库中看看脚本的说明,本文使用的是【非root用户】安装模式。
写本文时,安装脚本在使用非root账户时有一些小bug,所以我决定正好把这几步分开操作,可以顺便说明一下Linux下的删除命令。
- 小小白白Linux基础命令:
编号 命令名称 命令说明 cmd-14
rm
删除命令 - 将安装脚本下载至本地:
$ wget https://github.com/XTLS/Xray-install/raw/main/install-release.sh
- 执行安装命令
$ sudo bash install-release.sh
- 使用完成之后可以删除该脚本
$ rm ~/install-release.sh
注意: 使用
rm
命令删除文件的时候,默认其实就是删除现在所在的文件夹下的文件。但是,我依然写了完整的路径:~/install-release.sh
,这是我使用rm
时的一个安全习惯、也是我把安装分成几步之后想强调一下的内容。如果你听过一些“程序员从删库到跑路”之类的段子,大概就知道为什么了。 - 完整流程演示如下:
7.3 给Xray配置TLS证书
虽然我们前面已经申请好了TLS证书,但是按照 acme.sh
的官方说明,申请后的证书不建议直接使用。正确的方法是使用 --install-cert
命令安装给需要的程序。我们现在就来把证书安装给 xray-core
使用。
- 为了规避非root账户的各种潜在的权限困扰,我们在vpsadmin账户下建立一个证书文件夹
$ mkdir ~/xray_cert
- 使用
acme.sh
的--install-cert
正确安装(拷贝)证书文件$ acme.sh --install-cert -d 二级域名.你的域名.com --ecc \ --fullchain-file ~/xray_cert/xray.crt \ --key-file ~/xray_cert/xray.key
xray.key
文件默认对其他用户不可读,所以需要赋予其可读性权限$ chmod +r ~/xray_cert/xray.key
- 过程比较简单就不放动图了:
acme.sh
会每60天检查一次证书并自动更新临期证书。但据我所知是它并不会自动将新证书安装给xray-core
,所以我们需要新增一个系统的自动周期任务来完成这一步。- 小小白白Linux基础命令:
编号 命令名称 命令说明 cmd-15
crontab -e
编辑当前用户的定时任务 - 建立一个脚本文件(
xray-cert-renew.sh
)$ nano ~/xray_cert/xray-cert-renew.sh
- 把下面的内容复制进去,记得替换你的真实域名,然后保存退出
#!/bin/bash /home/vpsadmin/.acme.sh/acme.sh --install-cert -d a-name.yourdomain.com --ecc --fullchain-file /home/vpsadmin/xray_cert/xray.crt --key-file /home/vpsadmin/xray_cert/xray.key echo "Xray Certificates Renewed" chmod +r /home/vpsadmin/xray_cert/xray.key echo "Read Permission Granted for Private Key" sudo systemctl restart xray echo "Xray Restarted"
注意: 经大家提醒,
acme.sh
有一个reloadcmd
命令,可以在证书更新时自动执行特定命令,那么就可以指定自动给Xray
安装证书,但因为crontab
是 Linux 系统中一个非常有用、非常常用的功能,所以本文保留crontab
的方式来更新Xray
证书。(对reloadcmd
感兴趣的同学可以查看acme.sh
的官方文档)另外,录制动图时,脚本中没有加入重启
Xray
的命令,是因为Xray
计划支持【证书热更新】功能,即Xray
会自动识别证书更新并重载证书、无需手动重启。待功能加入后,我将适当修改config.json
开启此设置,并删除脚本中的重启命令。 - 给这个文件增加【可执行】权限
$ chmod +x ~/xray_cert/xray-cert-renew.sh
- 运行
crontab -e
,添加一个自动任务【每月自动运行一次xray-cert-renew.sh
】 (注意不要加sudo
,因为我们增加的是vpsadmin
账户的自动任务。初次运行时会让你选择编辑器,当然是选择熟悉的nano
啦!)$ crontab -e
- 把下面的内容增加在文件最后,保存退出即可。
# 1:00am, 1st day each month, run `xray-cert-renew.sh` 0 1 1 * * bash /home/vpsadmin/xray_cert/xray-cert-renew.sh
- 完整流程演示如下:
- 小小白白Linux基础命令:
7.4 配置Xray
首先,各种配置都可以参考官方VLESS配置示例。本文会基于官方示例,配置一个最精简的方式:【单 VLESS
协议入站 + 80
端口回落】,满足大多数场景的最大速度及必要安全。
- 生成一个合法的
UUID
并保存备用(UUID
可以简单粗暴的理解为像指纹一样几乎不会重复的ID)$ xray uuid
- 建立日志文件及文件夹备用
- 小小白白Linux基础命令:
编号 命令名称 命令说明 cmd-16
touch
建立空白文件 - 在
vpsadmin
的文件夹内建立一个【日志专用文件夹】$ mkdir ~/xray_log
- 生成所需的两个日志文件(访问日志、错误日志)
$ touch ~/xray_log/access.log && touch ~/xray_log/error.log
注意: 这个位置不是
Xray
标准的日志文件位置,放在这里是避免权限问题对新人的操作带来困扰。当你熟悉之后,建议回归默认位置:/var/log/xray/access.log
和/var/log/xray/error.log
。 - 因为Xray默认是nobody用户使用,所以我们需要让其他用户也有“写”的权限(
*.log
就是所有文件后缀是log
的文件,此时CLI
界面的效率优势就逐渐出现了)$ chmod a+w ~/xray_log/*.log
- 小小白白Linux基础命令:
- 使用
nano
创建Xray
的配置文件$ sudo nano /usr/local/etc/xray/config.json
- 将下面的文件全部复制进去,并将之前生成的
UUID
填入第61行"id": "",
之中。(填好之后的样子是"id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid"
),本文的这个配置文件中增加了我的各种啰嗦注解,以方便你理解每一个配置模块的功能是什么。// 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": "[email protected]" } ], "decryption": "none", "fallbacks": [ { "dest": 80 // 默认回落到防探测的代理 } ] }, "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" } ] }
- 完整流程演示如下:
7.5 启动Xray服务!!(并查看服务状态)
如果你是跟随本文一步步设置过来,其实就已经避开了最常见日志文件权限不足、证书文件权限不足 这两个大坑。那么现在运行Xray
自然应该无比顺利。
- 输入下面的命令,享受启动
Xray
的历史性时刻吧!!!$ sudo systemctl start xray
- 仅仅
start
我们并不能确定是否成功的开启了Xray的服务,要确定它的状态,就要用到下面的命令。$ sudo systemctl status xray
看到那个绿色的、令人愉悦的
active (running)
了吗?它就是说Xray
已经在正确的运行了 - 完整流程演示如下:
7.6 回顾 systemd
进行基本的服务管理
到现在为止,我们已经使用过了systemctl
相关的start
, status
, reload
等命令,这些都是基于systmed
管理模块对Linux系统中各种服务进行管理的通用命令。现在正好熟悉一下相关的其他几个命令。
- 若你需要暂时关闭
Xray
的服务,那就用stop
命令$ sudo systemctl stop xray
- 若你需要重启
Xray
的服务,那就用restart
命令$ sudo systemctl restart xray
- 若你需要禁用
Xray
的服务(电脑重启后禁止Xray自动运行),那就用disable
命令$ sudo systemctl disable xray
- 若你需要启用
Xray
的服务(电脑重启后确保Xray自动运行),那就用enable
命令$ sudo systemctl enable xray
7.7 服务器优化之一:开启BBR
- 传说中的
BBR
我相信,你在搜索各种科学上网技术的时候,肯定不止一次的听过
bbr
这个东西,在各种博客添油加醋之下,让人觉得它神乎其神。更有bbrplus
,bbr2
,魔改bbr
等一大堆衍生品。仿佛神油一般,用了就能野鸡线路变专线。那么,这东西究竟是什么?它有没有用?又该用哪一个版本呢?
- 实际的
BBR
BBR = Bottleneck Bandwidth and Round-trip propagation time,是一种TCP的拥塞控制算法。简单粗暴的理解就是数据流量的交通管理:当公路不再塞车的时候,每辆车自然就能保持较快的车速了。
那么它有没有用呢?一般而言,
有BBR
和没有BBR
会有可以感知的差别(速度、稳定性、延迟方面都会有一些改善),所以 【非常建议开启BBR
】。但开启之后,
BBR
在4.x
和5.x
之间的差异往往比较微妙、见仁见智,造成体验差别的决定性因素仍然是线路质量。所以 【不必纠结版本、不必盲目追新、跟随你的发行版更新内核即可】 bbrplus
,bbr2
,魔改bbr
和其他各种听起来就酷炫的版本是不是更好?一句话:不是!不要用这些!这些都为了吸引眼球乱起的名字!
BBR
的更新和发布,都是跟随Linux的内核(Kernel
)进行的。换言之,只要你用的是比较新的内核,就自然会使用到新版BBR
。而这些名字看起来很酷炫的东西,说白了就是仍未正式发布的、尚在测试阶段的内核及其对应的
BBR
版本。这些脚本也仅仅就是通过下载预览版的内核(甚至第三方魔改内核)来率先开启而已。内核的稳定是一台服务器稳定运行的基石。【BBR测试版带来的细微性能差异绝对不值得更换不稳定的内核。】 请选择你所在的Linux发行版所支持的最新内核,这样可以最大限度的保持服务器的长期稳定和兼容。
注意: 所谓魔改
bbr
的【领先】是有非常强的时效性的。比如很多bbrplus
脚本,因为几年来都没有更新,到现在还会把你的内核换成4.19
,要知道现在稳定如 Debian 已经是5.9
的时代了,那么这个脚本放在2018年1月也许领先了一点,到2018年10月4.19正发布时就已经失去了意义,放在现在甚至可以说是完完全全的【降级】和【劣化】fq
,fq_codel
,fq_pie
,cake
和其他算法哪个好?一句话:看不懂的话,请保持
fq
,足够、且不会劣化你的线路- 锐速、Finalspeed、LotServer和其他“加速工具”
一句话:不要用这些!把他们丢进历史的垃圾桶吧!
它能解决的也只有丢包率的问题。不太准确的比喻,就是本来你用一辆车送你的货,有时候车半路就坏了(丢包),用了这些以后,你直接派出3份一样的货,让三辆车同时送,只要有一辆没坏就能送到。马路上都是你的车,自然就能把别人挤下去。但可想而知,你挤别人的时候,别人也会来挤你,而整个机房的出口道路一共就那么宽,最终势必就变成集体大堵车了。
说明: 它们的原理不是算法优化、不是提速、大多数是简单粗暴的多倍发包。对于【丢包率非常高】的差线路可能有一点作用,但【对丢包率低的好线路没有任何优化作用,反而会成倍的消耗你的流量】,进而造成服务器和你的邻居不必要的压力。
如果你的线路真的丢包率奇高,真正靠谱的解决方案是【换线路】。
- 啰嗦了这么多,就是因为围绕
BBR
忽悠小白的错误概念和坑人脚本实在是太多了。我希望你们现在对BBR
有了相对清晰的理解。接下来,我们就动手安装最新的Debian内核并开启BBR
吧!(真的很简单)- 给 Debian 10 添加官方
backports
源,获取更新的软件库$ sudo nano /etc/apt/sources.list
说明: 本文以 Debian 10 为例,所以使用
/etc/apt/sources.list
仍无问题,但如果你并不是根据本文从头开始,或者使用了其他Linux发行版,那么建议你建立/etc/apt/sources.list.d/
文件夹,并在这个文件夹内建立自己的配置文件,形如/etc/apt/sources.list.d/vpsadmin.list
,以此保证兼容性,也可避免默认文件在不可预见的情况下被覆盖而导致配置丢失。 - 然后把下面这一条加在最后,并保存退出。
deb http://deb.debian.org/debian buster-backports main
- 刷新软件库并查询 Debian 官方的最新版内核并安装。请务必安装你的VPS对应的版本(本文以比较常见的【amd64】为例)。
$ sudo apt update && sudo apt -t buster-backports install linux-image-amd64
注意: 如果你的VPS支持,可以尝试【云服务器专用内核】
linux-image-cloud-amd64
,优点就是精简、资源占用低,缺点嘛是有同学反馈不支持的系统强行安装会导致无法开机(Kernel无法识别)。为了避免无法识别的悲剧,请确保:
- 尝试前做一个系统快照,或者
- 你有
vnc
可以救场(并且你知道怎么用)
- 修改
kernel
参数配置文件sysctl.conf
并指定开启BBR
$ sudo nano /etc/sysctl.conf
说明: 本文以 Debian 10 为例,所以使用
/etc/sysctl.conf
仍无问题,但如果你并不是跟着本文从头开始,或者使用了其他Linux发行版,那么建议你建立/etc/sysctl.d/
文件夹,并在这个文件夹内建立自己的配置文件,形如/etc/sysctl.d/vpsadmin.conf
,以此保证兼容性,因为部分发行版在systemd
207 版本之后便不再从/etc/sysctl.conf
读取参数。使用自定义配置文件也可避免默认文件在不可预见的情况下被覆盖而导致配置丢失。 - 把下面的内容添加进去
net.core.default_qdisc=fq net.ipv4.tcp_congestion_control=bbr
- 重启VPS、使内核更新和
BBR
设置都生效$ sudo reboot
- 完整流程演示如下:
啰嗦君: 因为我做展示的VPS支持云服务器专用内核,所以动图中我用了
linux-image-cloud-amd64
。如果你不确定你的VPS是否支持,那请务必按照第3步的命令,使用常规内核linux-image-amd64
。 - 确认
BBR
开启如果你想确认
BBR
是否正确开启,可以使用下面的命令:$ lsmod | grep bbr
此时应该返回这样的结果:
tcp_bbr
如果你想确认
fq
算法是否正确开启,可以使用下面的命令:$ lsmod | grep fq
此时应该返回这样的结果:
sch_fq
- 给 Debian 10 添加官方
7.8 服务器优化之二:开启HTTP自动跳转HTTPS
- 之前我们已经搭建了
80
端口的http
网页,并以此申请了TLS证书。但如果你尝试过用浏览器访问我们的这个界面,就会发现
http
访问并不会像大多数网站一样自动升级为https
访问。换言之,我们现在的设置下,http(80)
和https(443)
之间完全是独立的。如果要解决这个问题,就需要做一些修改。 - 编辑Nginx的配置文件
$ sudo nano /etc/nginx/nginx.conf
- 在我们设置过的80端口Server中加入下面的语句,并保存退出(可同时删除
root
和index
两行)return 301 https://$http_host$request_uri;
- 在与
80
端口同级的位置增加一个本地端口监听来提供网页展示。本文以8080
端口做演示。(可以是任意端口)server { listen 127.0.0.1:8080; root /home/vpsadmin/www/webpage; index index.html; add_header Strict-Transport-Security "max-age=63072000" always; }
- 重启 Nginx 服务
$ sudo systemctl restart nginx
- 修改Xray的回落设置,将回落从
80
端口改为8080
端口。(找到"dest": 80
, 并改成"dest": 8080
)$ sudo nano /usr/local/etc/xray/config.json
- 重启
Xray
服务,即完成了设置$ sudo systemctl restart xray
- 完整流程演示如下:
- 当你输入
http://a-name.yourdomain.com
的时候,它应该已经会自动跳转https了
7.9 服务器优化之三:更丰富的回落
如果你需要更丰富的回落功能,可以参考 《回落 (fallbacks) 功能简析》
关键点是:
- APP要主动或借助转发工具,将数据【流入(
inbounds
)】Xray
客户端 - 流量进入客户端后,会被【客户端路由(
routing
)】按规则处理后,向不同方向【流出(outbounds)
】Xray
客户端。比如:- 国内流量直连(
direct
) - 国外流量转发VPS(
proxy
) - 广告流量屏蔽(
block
)
- 国内流量直连(
- 向VPS转发的国外流量,会跨过防火墙,【流入(
inbounds
)】Xray
服务器端 - 流量进入服务器端后,与客户端一样,会被【服务器端路由(
routing
)】按规则处理后,向不同方向【流出(outbounds)
】:- 因为已经在防火墙之外,所以流量默认直连,你就可以访问到不存在网站们了(
direct
) - 如果需要在不同的VPS之间做链式转发,就可以继续配置转发规则(
proxy
) - 你可以在服务器端继续禁用各种你想禁用的流量,如广告、BT下载等(
block
)
- 因为已经在防火墙之外,所以流量默认直连,你就可以访问到不存在网站们了(
注意: 请务必记得,Xray
的路由配置非常灵活,上面的说明只是无限可能性中的一种。
借助 geosite.dat
和 geoip.dat
这两个文件,可以很灵活的从【域名】和【IP】这两个角度、不留死角的控制流量流出的方向。这比曾经单一笼统的 GFWList
强大很多很多,可以做到非常细致的微调:比如可以指定Apple域名直连或转发、指定亚马逊域名代理或转发,百度的域名屏蔽等等。。。)
现在,《路由 (routing) 功能简析》 已经上线,我建议对路由功能有兴趣的同学,先继续跟着本文完成客户端的基础配置,之后再去这里详细学习。
8.2 客户端与服务器端正确连接
现在你已经理解了 Xray
的工作原理,那么接下来的配置,其实就是【告诉你的客户端如何连接VPS服务器】。这和你已经很熟悉的、告诉PuTTY
如何远程连接服务器是一样的。只不过Xray连接时的要素不止是【IP地址】+【端口】+【用户名】+【密码】这四要素了。
实际上,Xray
的连接要素是由不同的协议决定的。本文在第7章的配置文件 config.json
里,我们使用 Xray
下独特而强大的 VLESS
协议 + XTLS
流控。所以看看那个配置文件的内容就能知道,这个协议组合的连接要素有:
- 服务器【地址】:
a-name.yourdomain.com
- 服务器【端口】:
443
- 连接的【协议】:
vless
- 连接的【流控】:
xtls-rprx-direct
(direct模式适合全平台,若是Linux/安卓用户,可改成xtls-rprx-splice
性能全开) - 连接的【验证】:
uuiduuid-uuid-uuid-uuiduuiduuid
- 连接的【安全】:
"allowInsecure": false
鉴于新人一般都会使用手机APP或者电脑的GUI客户端,我就把常用的客户端罗列在下面。每个客户端都有自己独特的配置界面,逐一截图展示并不现实,所以请你务必仔细阅读这些客户端的说明、然后把上述要素填入合适的地方即可。
注意: 许多工具其实是同时支持 xray-core
和 v2fly-core
的,但默认内置的不一定是哪个,所以别忘记检查一下是否是你想要的那个在工作哦!
- v2rayN – 适用于Windows平台
- 请从它的GitHub仓库Release页面获取最新版
- 请根据该客户端的说明进行设置
- v2rayNG – 适用于Android平台
- 请从它的GitHub仓库Release页面获取最新版
- 请根据该客户端的说明进行设置
- Shadowrocket – 适用于iOS, 基于苹果M芯片的macOS
- 你需要注册一个【非中国区】的iCloud账户
- 你需要通过 App Store 搜索并购买
- 请根据该客户端的说明进行设置
- Qv2ray – 跨平台图形界面,适用于Linux, Windows, macOS
- 请从它的GitHub仓库Release页面获取最新版(还可以从它的GitHub自动构建仓库寻找更新的版本)
- 请从它的项目主页学习文档
- 请根据该客户端的说明进行设置
到这一步,你的全套配置就已经可以正常使用啦!
未经允许不得转载:搬瓦工VPS_美国VPS » VPS服务器搭建Xray服务 全官方原生手动配置教程