Menu Close

小小白白话文【第7章】搭建Xray服务器与Xray使用教程之Xray服务器篇

7.1 博观而约取,厚积而薄发

本文撰写过程中,大佬开玩笑的吐槽到:你这教程,居然连载了6章都还没到Xray,不知道的还以为你是“手把手教你建网站”教程呢。(我竟无法反驳.jpg!)

其实这样的结构是我多番思考之后的决定,毕竟只有打好基础,才能在后面事半功倍快速反超。我在群里看到许多新人连nano都无法正确使用,也不会用WinSCP,远程手写编辑出来的config.json自然错误百出,连查错也变得举步维艰。

经过了前6章的准备,各位已经跟我一起翻越了Linux基本操作、VPS远程管理、网页搭建、域名管理、证书申请等等几座大山。是不是回头看看,觉得其实非常简单呢?现在我们有了如此扎实的准备,接下来安装和配置Xray时会有一种【水到渠成】的轻快感觉。

后面要做的事情非常简单:

  1. 安装
  2. 配置(如安装TLS证书、config.json
  3. 运行
  4. 优化(如更新内核、开启bbr、网站http访问自动跳转https等)

7.2 安装Xray

首先,Xray的官方载体,就是 xray-core 开源项目(基于 MPL 2.0 开源协议)生成的二进制程序。你把这个二进制放在服务器运行,它就是服务器端;你把它下载到本地电脑运行,它就是客户端。主要区别来源于【配置】。

安装时,直接使用官方安装脚本就很简单直接。它提供了多种安装选项,有兴趣的可以去官方的安装脚本仓库中看看脚本的说明,本文使用的是【非root用户】安装模式

写本文时,安装脚本在使用非root账户时有一些小bug,所以我决定正好把这几步分开操作,可以顺便说明一下Linux下的删除命令。

  1. 小小白白Linux基础命令:
    编号 命令名称 命令说明
    cmd-14 rm 删除命令
  2. 将安装脚本下载至本地:
    $ wget https://github.com/XTLS/Xray-install/raw/main/install-release.sh
    
  3. 执行安装命令
    $ sudo bash install-release.sh
    
  4. 使用完成之后可以删除该脚本
    $ rm ~/install-release.sh
    

注意: 使用 rm 命令删除文件的时候,默认其实就是删除现在所在的文件夹下的文件。但是,我依然写了完整的路径: ~/install-release.sh,这是我使用 rm 时的一个安全习惯、也是我把安装分成几步之后想强调一下的内容。如果你听过一些“程序员从删库到跑路”之类的段子,大概就知道为什么了。

  1. 完整流程演示如下:

7.3 给Xray配置TLS证书

虽然我们前面已经申请好了TLS证书,但是按照 acme.sh的官方说明,申请后的证书不建议直接使用。正确的方法是使用 --install-cert 命令安装给需要的程序。我们现在就来把证书安装给 xray-core 使用。

  1. 为了规避非root账户的各种潜在的权限困扰,我们在vpsadmin账户下建立一个证书文件夹
    $ mkdir ~/xray_cert
    
  2. 使用acme.sh--install-cert正确安装(拷贝)证书文件
    $ acme.sh --install-cert -d 二级域名.你的域名.com --ecc \
                --fullchain-file ~/xray_cert/xray.crt \
                --key-file ~/xray_cert/xray.key
    
  3. xray.key文件默认对其他用户不可读,所以需要赋予其可读性权限
    $ chmod +r ~/xray_cert/xray.key
    
  4. 过程比较简单就不放动图了:
  5. acme.sh 会每60天检查一次证书并自动更新临期证书。但据我所知是它并不会自动将新证书安装给 xray-core,所以我们需要新增一个系统的自动周期任务来完成这一步。
    1. 小小白白Linux基础命令:
      编号 命令名称 命令说明
      cmd-15 crontab -e 编辑当前用户的定时任务
    2. 建立一个脚本文件(xray-cert-renew.sh
      $ nano ~/xray_cert/xray-cert-renew.sh
      
    3. 把下面的内容复制进去,记得替换你的真实域名,然后保存退出
      #!/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"
      
    4. 给这个文件增加【可执行】权限
      $ chmod +x ~/xray_cert/xray-cert-renew.sh
      
    5. 运行 crontab -e,添加一个自动任务【每月自动运行一次xray-cert-renew.sh】 (注意不要加sudo,因为我们增加的是vpsadmin账户的自动任务。初次运行时会让你选择编辑器,当然是选择熟悉的nano啦!)
      $ crontab -e
      
    6. 把下面的内容增加在文件最后,保存退出即可。
      # 1:00am, 1st day each month, run `xray-cert-renew.sh`
      0 1 1 * *   bash /home/vpsadmin/xray_cert/xray-cert-renew.sh
      
    7. 完整流程演示如下:

7.4 配置Xray

首先,各种配置都可以参考官方VLESS配置示例。本文会基于官方示例,配置一个最精简的方式:【单 VLESS 协议入站 + 80 端口回落】,满足大多数场景的最大速度及必要安全。

  1. 生成一个合法的 UUID 并保存备用(UUID可以简单粗暴的理解为像指纹一样几乎不会重复的ID)
    $ xray uuid
    
  2. 建立日志文件及文件夹备用
    1. 小小白白Linux基础命令:
      编号 命令名称 命令说明
      cmd-16 touch 建立空白文件
    2. 在vpsadmin的文件夹内建立一个【日志专用文件夹】
      $ mkdir ~/xray_log
      
    3. 生成所需的两个日志文件(访问日志、错误日志)
      $ touch ~/xray_log/access.log && touch ~/xray_log/error.log
      
    4. 因为Xray默认是nobody用户使用,所以我们需要让其他用户也有“写”的权限(*.log 就是所有文件后缀是log的文件,此时CLI界面的效率优势就逐渐出现了)
      $ chmod a+w ~/xray_log/*.log
      
  3. 使用nano创建Xray的配置文件
    $ sudo nano /usr/local/etc/xray/config.json
    
  4. 将下面的文件全部复制进去,并将之前生成的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": "vpsadmin@yourdomain.com"
                        }
                    ],
                    "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",
                                "ocspStapling": 3600    // 每3600秒(1小时)验证一次证书状态并缓存
                            }
                        ]
                    }
                }
            }
        ],
           
        // 5_出站设置
        "outbounds": [
            // 5.1 第一个出站是默认规则,freedom就是对外直连(vps已经是外网,所以直连)
            {
                "tag": "direct",
                "protocol": "freedom"
            },
            // 5.2 屏蔽规则,blackhole协议就是把流量导入到黑洞里(屏蔽)
            {
                "tag": "block",
                "protocol": "blackhole"
            }
        ]
    }
    
  5. 完整流程演示如下:

7.5 启动Xray服务!!(并查看服务状态)

如果你是跟随本文一步步设置过来,其实就已经避开了最常见日志文件权限不足证书文件权限不足 这两个大坑。那么现在运行Xray自然应该无比顺利。

  1. 输入下面的命令,享受启动Xray的历史性时刻吧!!!
    $ sudo systemctl start xray
    
  2. 仅仅start我们并不能确定是否成功的开启了Xray的服务,要确定它的状态,就要用到下面的命令。
    $ sudo systemctl status xray
    

    看到那个绿色的、令人愉悦的 active (running) 了吗?它就是说 Xray 已经在正确的运行了

  3. 完整流程演示如下:

7.6 回顾 systemd 进行基本的服务管理

到现在为止,我们已经使用过了systemctl相关的startstatusreload 等命令,这些都是基于systmed管理模块对Linux系统中各种服务进行管理的通用命令。现在正好熟悉一下相关的其他几个命令。

  1. 若你需要暂时关闭 Xray 的服务,那就用stop命令
    $ sudo systemctl stop xray
    
  2. 若你需要重启Xray的服务,那就用restart命令
    $ sudo systemctl restart xray
    
  3. 若你需要禁用Xray的服务(电脑重启后禁止Xray自动运行),那就用disable命令
    $ sudo systemctl disable xray
    
  4. 若你需要启用Xray的服务(电脑重启后确保Xray自动运行),那就用enable命令
    $ sudo systemctl enable xray
    

7.7 服务器优化之一:开启BBR

  1. 传说中的BBR我相信,你在Google各种科学上网技术的时候,肯定不止一次的听过bbr这个东西,在各种博客添油加醋之下,让人觉得它神乎其神。更有bbrplusbbr2魔改bbr 等一大堆衍生品。仿佛神油一般,用了就能野鸡线路变专线。那么,这东西究竟是什么?它有没有用?又该用哪一个版本呢?
  2. 实际的BBRBBR = Bottleneck Bandwidth and Round-trip propagation time,是一种TCP的拥塞控制算法。简单粗暴的理解就是数据流量的交通管理:当公路不再塞车的时候,每辆车自然就能保持较快的车速了。
  3. bbrplusbbr2魔改bbr 和其他各种听起来就酷炫的版本是不是更好?一句话:不是!不要用这些!这些都为了吸引眼球乱起的名字!BBR 的更新和发布,都是跟随Linux的内核(Kernel)进行的。换言之,只要你用的是比较新的内核,就自然会使用到新版BBR

    而这些名字看起来很酷炫的东西,说白了就是仍未正式发布的、尚在测试阶段的内核及其对应的BBR版本。这些脚本也仅仅就是通过下载预览版的内核(甚至第三方魔改内核)来率先开启而已。

    内核的稳定是一台服务器的稳定的基石。【BBR测试版带来的细微性能差异绝对不值得更换不稳定的内核。】 请选择你所在的Linux发行版所支持的最新内核,这样可以最大限度的保持服务器的长期稳定和兼容。

    注意: 所谓魔改bbr的【领先】是有非常强的时效性的。比如很多 bbrplus 脚本,因为几年来都没有更新,到现在还会把你的内核换成 4.19,要知道现在稳定如 Debian 已经是 5.9 的时代了,那么这个脚本放在10年前也许领先了一点,单放在现在就是完完全全的【降级】和【劣化】

  4. fqfq_codelfq_piecake和其他算法哪个好?一句话:看不懂的话,请保持fq,足够、且不会劣化你的线路
  5. 锐速、Finalspeed、LotServer和其他“加速工具”一句话:不要用这些!把他们丢进历史的垃圾桶吧!它能解决的也只有丢包率的问题。不太准确的比喻,就是本来你用一辆车送你的货,有时候车半路就坏了(丢包),用了这些以后,你直接派出3份一样的货,让三辆车同时送,只要有一辆没坏就能送到。马路上都是你的车,自然就能把别人挤下去。但可想而知,你挤别人的时候,别人也会来挤你,而整个机房的出口道路一共就那么宽,最终势必就变成集体大堵车了。

    说明: 它们的原理不是算法优化、不是提速、大多数是简单粗暴的多倍发包。对于【丢包率非常高】的差线路可能有一点作用,但【对丢包率低的好线路没有任何优化作用,反而会成倍的消耗你的流量】,进而造成服务器和你的邻居不必要的压力。

    如果你的线路真的丢包率奇高,真正靠谱的解决方案是【换线路】。

  6. 啰嗦了这么多,就是因为围绕 BBR 忽悠小白的错误概念和坑人脚本实在是太多了。我希望你们现在对 BBR 有了相对清晰的理解。接下来,我们就动手安装最新的Debian内核并开启BBR 吧!(真的很简单)
    1. 给Debian10添加官方 backports 源,获取更新的软件库
      $ sudo nano /etc/apt/sources.list
      
    2. 然后把下面这一条加在最后,并保存退出。
      deb http://deb.debian.org/debian buster-backports main
      
    3. 刷新软件库并安装Debian官方的最新版【云服务器内核】(稳定+优化兼而有之!)
      $ sudo apt update && sudo apt -t buster-backports install linux-image-cloud-amd64
      
    4. 修改sysctl.conf开启BBR
      $ sudo nano /etc/sysctl.conf
      
    5. 把下面的内容添加进去
      net.core.default_qdisc=fq
      net.ipv4.tcp_congestion_control=bbr
      
    6. 重启VPS、使内核更新和BBR设置都生效
      $ sudo reboot
      
    7. 完整流程演示如下:

7.8 服务器优化之二:开启HTTP自动跳转HTTPS

  1. 之前我们已经搭建了 80 端口的 http 网页,并以此申请了TLS证书。但如果你尝试过用浏览器访问我们的这个界面,就会发现 http 访问并不会像大多数网站一样自动升级为 https 访问。换言之,我们现在的设置下,http(80) 和 https(443)之间完全是独立的。如果要解决这个问题,就需要做一些修改。
  2. 编辑Nginx的配置文件
    $ sudo nano /etc/nginx/nginx.conf
    
  3. 在我们设置过的80端口Server中加入下面的语句,并保存退出(可同时删除rootindex两行)
    return 301 https://$http_host$request_uri;
    
  4. 在与 80 端口同级的位置增加一个本地端口监听来提供网页展示。本文以 8080 端口做演示。(可以是任意端口)
    server {
            listen 127.0.0.1:8080;
            root /var/www/website/html;
            index index.html;
            add_header Strict-Transport-Security "max-age=63072000" always;
    }
    
  5. 重启 Nginx 服务
    $ sudo systemctl restart nginx
    
  6. 修改Xray的回落设置,将回落从 80 端口改为 8080 端口。(找到 "dest": 80, 并改成 "dest": 8080
    $ sudo nano /usr/local/etc/config.json
    
  7. 重启 Xray 服务,即完成了设置
    $ sudo systemctl restart xray
    
  8. 完整流程演示如下:
  9. 当你输入 http://a-name.yourdomain.com的时候,它应该已经会自动跳转https了。

7.9 你的进度

恭喜!!到这一步,你已经拥有了可以正常科学上网的服务器、同时也有了可以防止主动探测攻击的伪装网站。接下来,只要给你的客户端装上合适的软件,就可以享受顺畅的网络了!

⬛⬛⬛⬛⬛⬛⬛⬜ 87.5%

4条评论

  1. Avatar photo
    hotcheng

    ● xray.service – Xray Service
    Loaded: loaded (/etc/systemd/system/xray.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/xray.service.d
    └─10-donot_touch_single_conf.conf
    Active: failed (Result: exit-code) since Sun 2021-03-28 14:11:17 UTC; 35s ago
    Docs: https://github.com/xtls
    Process: 20796 ExecStart=/usr/local/bin/xray run -config /usr/local/etc/xray/config.json (code=exited, status=23)
    Main PID: 20796 (code=exited, status=23)

    Mar 28 14:11:17 ip-172-26-9-138 systemd[1]: Started Xray Service.
    Mar 28 14:11:17 ip-172-26-9-138 xray[20796]: Xray 1.4.0 (Xray, Penetrates Everything.) Custom (go1.16.2 linux/amd64)
    Mar 28 14:11:17 ip-172-26-9-138 xray[20796]: A unified platform for anti-censorship.
    Mar 28 14:11:17 ip-172-26-9-138 xray[20796]: 2021/03/28 14:11:17 [Info] infra/conf/serial: Reading config: /usr/local/etc/xray/config.json
    Mar 28 14:11:17 ip-172-26-9-138 xray[20796]: Failed to start: main: failed to load config files: [/usr/local/etc/xray/config.json] > infra/conf: Failed to build XTLS conf
    Mar 28 14:11:17 ip-172-26-9-138 systemd[1]: xray.service: Main process exited, code=exited, status=23/n/a
    Mar 28 14:11:17 ip-172-26-9-138 systemd[1]: xray.service: Failed with result ‘exit-code’.

  2. Avatar photo
    hotcheng

    已经看见了active (running),可是更新完bbr服务器重启后就failed了,systemctl status xray ,restart xray,都看不见active了

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注