FreeBSD 15 下 Xray VLESS Reality Vision TCP 基准配置

在 FreeBSD 15 上部署 Xray VLESS Reality Vision TCP 节点,用作轻量 TCP 代理方案和 Gost MWSS 的对比基准。

这篇是 FreeBSD 15 上 Xray VLESS Reality Vision TCP 节点的完整部署教程,也可以作为 FreeBSD TCP 代理性能的第一轮基准测试方案。它的优点是组件少、不需要 Nginx、不需要申请真实 TLS 证书,适合先判断当前 VPS 的 FreeBSD TCP 用户态代理转发是否正常。

sing-box 客户端
  -> Xray VLESS Reality Vision
  -> FreeBSD Xray 443/tcp
  -> 目标网站

这套方案不需要 WebSocket 中转,不需要 Nginx 反代,也不需要申请真实 TLS 证书。Xray 直接监听 443/tcp;如果同机还跑 Hysteria2,它可以继续监听 443/udp,二者不冲突。

示例信息

本文统一使用公版示例值,部署时替换成你自己的真实信息:

项目示例值
节点域名proxy.example.com
服务器公网 IP203.0.113.10
Xray 入口端口443/tcp
REALITY 伪装域名www.microsoft.com
VLESS 用户 ID00000000-0000-4000-8000-000000000000
REALITY public keyPUBLIC_KEY_HERE
REALITY short id0123456789abcdef
sing-box 节点 tagxray-reality-freebsd

命令默认使用 root 执行。

支持系统

本文面向 FreeBSD 15 amd64。Xray 官方 release 提供 FreeBSD 64 位包,适合常见 VPS 的 amd64 架构。

FreeBSD 侧特点:

  • 服务用 rc.d 管理。
  • Xray 配置放在 /usr/local/etc/xray/config.json
  • Xray 二进制放在 /usr/local/bin/xray
  • 日志放在 /var/log/xray/
  • 防火墙示例使用 pf

1. 准备域名

先准备一个子域名,例如:

proxy.example.com

在 DNS 后台添加 A 记录:

类型主机记录记录值
Aproxy203.0.113.10

如果服务器没有 IPv6,不要添加 AAAA 记录,避免客户端优先走 IPv6 后连接失败。

在服务器上确认解析:

drill proxy.example.com

没有 drill 时可以用:

host proxy.example.com

防火墙或云安全组至少放行:

协议端口用途
TCP22SSH 管理
TCP443Xray VLESS Reality
UDP443Hysteria2,可选

2. 安装基础组件

pkg update -f
pkg install -y ca_root_nss curl unzip

3. 安装 Xray

先查看官方最新版。下面示例使用 v26.3.27,部署时可到 Xray-core release 页面替换为更新版本。

XRAY_VERSION="v26.3.27"

mkdir -p /tmp/xray-install /usr/local/etc/xray /usr/local/share/xray /var/log/xray

fetch -o /tmp/xray-install/Xray-freebsd-64.zip \
  "https://github.com/XTLS/Xray-core/releases/download/${XRAY_VERSION}/Xray-freebsd-64.zip"

unzip -o /tmp/xray-install/Xray-freebsd-64.zip -d /tmp/xray-install/xray
install -m 0755 /tmp/xray-install/xray/xray /usr/local/bin/xray

install -m 0644 /tmp/xray-install/xray/geoip.dat /usr/local/share/xray/geoip.dat
install -m 0644 /tmp/xray-install/xray/geosite.dat /usr/local/share/xray/geosite.dat

/usr/local/bin/xray version

正常会看到类似:

Xray 26.3.27

4. 生成 REALITY 参数

生成 UUID:

/usr/local/bin/xray uuid

生成 REALITY 密钥:

/usr/local/bin/xray x25519

新版本输出类似:

PrivateKey: PRIVATE_KEY_HERE
Password (PublicKey): PUBLIC_KEY_HERE
Hash32: HASH_HERE

服务端配置使用 PrivateKey,客户端配置使用 Password (PublicKey)

生成 short id:

openssl rand -hex 8

把生成的信息临时记下来:

UUID: 00000000-0000-4000-8000-000000000000
Private key: PRIVATE_KEY_HERE
Public key: PUBLIC_KEY_HERE
Short ID: 0123456789abcdef

5. 写入服务端配置

编辑配置:

ee /usr/local/etc/xray/config.json

写入下面内容,替换 idprivateKeyshortIds

{
  "log": {
    "loglevel": "warning",
    "access": "/var/log/xray/access.log",
    "error": "/var/log/xray/error.log"
  },
  "inbounds": [
    {
      "tag": "vless-reality-vision",
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "00000000-0000-4000-8000-000000000000",
            "flow": "xtls-rprx-vision"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "realitySettings": {
          "show": false,
          "dest": "www.microsoft.com:443",
          "xver": 0,
          "serverNames": [
            "www.microsoft.com"
          ],
          "privateKey": "PRIVATE_KEY_HERE",
          "shortIds": [
            "0123456789abcdef"
          ]
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls",
          "quic"
        ]
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom"
    },
    {
      "tag": "block",
      "protocol": "blackhole"
    }
  ]
}

做一次前台检查:

timeout 2 /usr/local/bin/xray run -config /usr/local/etc/xray/config.json

看到 Xray 读取配置并启动即可。因为 timeout 会在 2 秒后退出,这一步只是确认配置没有明显错误。

6. 创建日志目录

Xray 要监听 443/tcp,FreeBSD 下低权限用户不能直接绑定这种低端口。这里采用最直接、稳定的生产写法:rc.d 以 root 启动 Xray 绑定 443,并收紧配置文件和日志权限。

mkdir -p /var/log/xray
touch /var/log/xray/access.log /var/log/xray/error.log /var/log/xray/xray.log
chown -R root:wheel /usr/local/etc/xray /var/log/xray
chmod 700 /usr/local/etc/xray
chmod 600 /usr/local/etc/xray/config.json
chmod 750 /var/log/xray
chmod 640 /var/log/xray/*.log

7. 创建 rc.d 服务

创建 rc.d 脚本:

ee /usr/local/etc/rc.d/xray_reality

写入:

#!/bin/sh

# PROVIDE: xray_reality
# REQUIRE: NETWORKING
# KEYWORD: shutdown

. /etc/rc.subr

name="xray_reality"
rcvar="xray_reality_enable"

load_rc_config $name

: ${xray_reality_enable:="NO"}
: ${xray_reality_config:="/usr/local/etc/xray/config.json"}
: ${xray_reality_log:="/var/log/xray/xray.log"}
: ${xray_reality_pidfile:="/var/run/xray_reality.pid"}

pidfile="${xray_reality_pidfile}"
command="/usr/sbin/daemon"
procname="/usr/local/bin/xray"
command_args="-f -p ${pidfile} -o ${xray_reality_log} ${procname} run -config ${xray_reality_config}"

run_rc_command "$1"

启用并启动:

chmod 755 /usr/local/etc/rc.d/xray_reality
sysrc xray_reality_enable="YES"

service xray_reality start
service xray_reality status

确认进程和监听:

ps -axo user,pid,command | egrep '[x]ray|[x]ray_reality_runner'
sockstat -4 -6 -l | egrep ':(443|22)'

正常应该看到 Xray 监听 *:443。如果同机还有 Hysteria2 监听 443/udp,这是正常的;TCP 和 UDP 互不冲突。

8. 配置 pf 防火墙

如果使用 pf,可以按下面方式配置。先备份:

cp /etc/pf.conf /etc/pf.conf.bak

编辑:

ee /etc/pf.conf

示例规则:

set skip on lo0
set block-policy drop

table <blacklist> persist file "/etc/pf_blacklist.txt"

scrub in all fragment reassemble

block in quick from <blacklist> to any
block in all

pass out all keep state

pass in quick inet proto icmp all icmp-type echoreq keep state
pass in quick inet proto tcp from any to any port 22 flags S/SA keep state (max-src-conn 80, max-src-conn-rate 30/10, overload <blacklist> flush global)
pass in quick inet proto tcp from any to any port 443 flags S/SA keep state (max-src-conn 80, max-src-conn-rate 30/10, overload <blacklist> flush global)

# 如果同机还有 Hysteria2,保留 UDP 443。
pass in quick inet proto udp from any to any port 443 keep state (max-src-states 80)

检查并启用:

touch /etc/pf_blacklist.txt
pfctl -nf /etc/pf.conf
pfctl -f /etc/pf.conf
service pf enable
service pf start

查看规则:

pfctl -sr

9. 日志轮转

mkdir -p /usr/local/etc/newsyslog.conf.d

cat > /usr/local/etc/newsyslog.conf.d/xray.conf <<'EOF'
/var/log/xray/*.log  root:wheel  640  7  1024  *  JC
EOF

10. sing-box 客户端接入

下面示例假设客户端已经有 sing-box,并且配置拆分在:

/etc/sing-box/conf/04_outbounds.json
/etc/sing-box/conf/05_route.json

添加出站

编辑 04_outbounds.json,先在对应 selector 的 outbounds 数组里加入新节点:

{
  "tag": "Proxy",
  "type": "selector",
  "outbounds": [
    "US24-hy2",
    "xray-reality-freebsd"
  ]
}

再在 outbounds 数组末尾添加 VLESS Reality 出站:

{
  "type": "vless",
  "tag": "xray-reality-freebsd",
  "server": "proxy.example.com",
  "server_port": 443,
  "uuid": "00000000-0000-4000-8000-000000000000",
  "flow": "xtls-rprx-vision",
  "tls": {
    "enabled": true,
    "server_name": "www.microsoft.com",
    "utls": {
      "enabled": true,
      "fingerprint": "chrome"
    },
    "reality": {
      "enabled": true,
      "public_key": "PUBLIC_KEY_HERE",
      "short_id": "0123456789abcdef"
    }
  }
}

如果你希望 YouTube、Google、Speedtest 等分流 selector 也能手动选择它,同样把 xray-reality-freebsd 加到这些 selector 的 outbounds 里。

添加节点直连规则

编辑 05_route.json,把下面规则放在 route.rules 最前面,避免代理回环:

{
  "domain": [
    "proxy.example.com"
  ],
  "ip_cidr": [
    "203.0.113.10/32"
  ],
  "outbound": "direct"
}

如果客户端机器使用 fake-ip DNS,建议同时在客户端 /etc/hosts 固定节点域名:

echo "203.0.113.10 proxy.example.com" >> /etc/hosts

如果客户端是 PVE 里的 Debian/Ubuntu 云镜像,或者 /etc/hosts 顶部能看到类似 managed by cloud-init 的提示,单独改 /etc/hosts 可能会在重启后被 Cloud-Init 还原。此时要同时写入 Cloud-Init 模板:

echo "203.0.113.10 proxy.example.com" >> /etc/cloud/templates/hosts.debian.tmpl

写完后可以重启前先确认解析结果:

getent hosts proxy.example.com

正常时应该显示你写入的真实服务器 IP,例如:

203.0.113.10    proxy.example.com

这就说明客户端系统解析已经命中真实节点地址。如果仍然显示类似下面这种 fake-ip,就说明 hosts 没生效,节点连接可能会绕进代理 DNS 造成回环或超时:

28.0.14.153     proxy.example.com

注意:这一步加在运行 sing-box 的客户端机器上,不是服务端。

检查并重启

sing-box check -C /etc/sing-box/conf/
systemctl restart sing-box
systemctl is-active sing-box

如果启用了 Clash API,可以测试延迟:

curl -s "http://127.0.0.1:9090/proxies/xray-reality-freebsd/delay?timeout=10000&url=https://www.gstatic.com/generate_204"

也可以在面板里把 YouTube 分组临时切到 xray-reality-freebsd,然后打开 YouTube 详细统计信息观察连接速度。

11. 验证服务端

服务端检查:

service xray_reality status
sockstat -4 -6 -l | egrep ':(443|22)'
tail -f /var/log/xray/xray.log

如果使用 pf

pfctl -s info
pfctl -sr | grep 443

客户端检查:

sing-box check -C /etc/sing-box/conf/
systemctl is-active sing-box

用一个公开下载文件粗测吞吐:

curl --socks5-hostname 127.0.0.1:9666 -L -o /dev/null \
  -w 'speed=%{speed_download}Bps total=%{time_total}s size=%{size_download}\n' \
  -m 35 http://cachefly.cachefly.net/100mb.test

如果你的 sing-box SOCKS 入站不是 9666,把端口改成自己的。

12. 实测结论

在新的 FreeBSD 15 VPS 上,同一客户端、同一服务器环境下,Xray Reality TCP 可以稳定跑通,大文件下载多轮大约在 6-9 MB/s;同机服务端直连下载约 60 MB/s 以上,说明 VPS 出口本身不是瓶颈。

同机对比后,Nginx 前置 Gost MWSS 在这台机器上表现更好,多轮大文件下载约 8-18 MB/s。所以本文的 Xray 方案更适合作为轻量备选或基准方案;如果目标是这台机器上的 TCP 生产主力,优先选择 Gost MWSS + Nginx。

用途建议
轻量 TCP 基准Xray VLESS Reality Vision 443/tcp
TCP 生产候选Nginx 前置 Gost MWSS
高速 UDP 主力Hysteria2,另行配置

如果同机已经有 Hysteria2 使用 443/udp,不需要改;Xray 或 Nginx/Gost 使用的是 443/tcp,TCP 和 UDP 可以同时监听。

13. 清理旧 TCP 服务

如果这台机器之前跑过 Nginx 反代、WebSocket 中转或其他旧 TCP 代理,确认已经切到 Xray 后可以停用:

service nginx stop
sysrc nginx_enable="NO"

service gost_mwss stop
sysrc gost_mwss_enable="NO"

再次确认只有 Xray 占用 TCP 443:

sockstat -4 -6 -l | egrep ':(443|80|18080)'

正常情况下,Xray 应监听 *:443/tcp;如果有 Hysteria2,则它监听 *:443/udp,这不冲突。若最终改用 Gost MWSS + Nginx,则需要停用 Xray,把 443/tcp 交给 Nginx。