这篇是 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 |
| 服务器公网 IP | 203.0.113.10 |
| Xray 入口端口 | 443/tcp |
| REALITY 伪装域名 | www.microsoft.com |
| VLESS 用户 ID | 00000000-0000-4000-8000-000000000000 |
| REALITY public key | PUBLIC_KEY_HERE |
| REALITY short id | 0123456789abcdef |
| sing-box 节点 tag | xray-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 记录:
| 类型 | 主机记录 | 记录值 |
|---|---|---|
A | proxy | 203.0.113.10 |
如果服务器没有 IPv6,不要添加 AAAA 记录,避免客户端优先走 IPv6 后连接失败。
在服务器上确认解析:
drill proxy.example.com没有 drill 时可以用:
host proxy.example.com防火墙或云安全组至少放行:
| 协议 | 端口 | 用途 |
|---|---|---|
| TCP | 22 | SSH 管理 |
| TCP | 443 | Xray VLESS Reality |
| UDP | 443 | Hysteria2,可选 |
2. 安装基础组件
pkg update -f
pkg install -y ca_root_nss curl unzip3. 安装 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.274. 生成 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: 0123456789abcdef5. 写入服务端配置
编辑配置:
ee /usr/local/etc/xray/config.json写入下面内容,替换 id、privateKey 和 shortIds:
{
"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/*.log7. 创建 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 -sr9. 日志轮转
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
EOF10. 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。