X-UI Reality 与 VLESS 笔记背景

Skills · Private Network Infrastructure

X-UI
Reality
VLESS

从 SSH 到 Reality + VLESS:面板与命令行两种方式完整部署笔记。

Server Note
Step by step

ScopeVPS / SSH / Xray / VLESS / Reality ServerUbuntu 24.04 LTS Accessroot SSH / Port 22 Updated2026-07-24
What you get

购买 VPS 后你会拿到什么

一台位于数据中心的远程虚拟服务器,通常附带:公网 IP、操作系统(如 Ubuntu 24.04)、SSH 端口(22)、登录用户名(root 或 ubuntu)、密码或 SSH Key。

Mental model

SSH 是协议,SSH Key 是身份验证方式。

推荐组合是 SSH + SSH Key,不是 SSH + 密码。Key 更安全,可以彻底关闭密码登录,也可以为每台设备单独授权和撤销。

Keys

Public Key 放服务器,Private Key 只留在自己电脑上。

服务器保存公钥,本地电脑保存私钥。登录时本地用私钥签名,服务器用公钥验证——私钥本身永远不会发送给服务器。

  • 绝对不要把 private key 发给别人、贴进聊天、上传到 GitHub 或截图展示。
  • private key 还可以加一层 passphrase,万一文件泄露也多一道保护。
Webpage key

商家只在网页上显示了一大段 private key 怎么办

商家可能没有提供下载文件,而是在网页上显示类似内容。复制时必须从 -----BEGIN ... PRIVATE KEY----- 开始,到 -----END ... PRIVATE KEY----- 结束,保留中间所有内容和换行,不要把网页上的说明文字一起复制。

macOS setup

在 Mac 上保存并验证 private key

创建 .ssh 目录
mkdir -p ~/.ssh
设置目录权限
chmod 700 ~/.ssh
打开编辑器粘贴私钥
nano ~/.ssh/my-vps-key
设置私钥文件权限
chmod 600 ~/.ssh/my-vps-key
验证私钥格式
ssh-keygen -y -f ~/.ssh/my-vps-key

ctrl+o 保存,ctrl+x 退出 nano。验证应输出 ssh-ed25519 AAAAC3...,出现 invalid format 检查是否漏了 BEGIN/END 行。

Permissions

理解 600 和 700

Unix 权限三个数字依次:文件所有者、同组用户、其他用户。读=4,写=2,执行=1。数字可相加。

  • 700 ~/.ssh 目录:只有我能进入
  • 600 private key / config:只有我能读写
  • 私钥权限太宽(如 644)会导致 SSH 拒绝连接
Where am I

登录成功后判断自己在哪里

Mac 提示符:rda@MacBook ~ %。服务器:root@vps:~#ubuntu@vps:~$。以 ubuntu 登录时需管理员权限加 sudo

Login

登录命令与 SSH Config 快捷名称

root 用户登录
ssh -i ~/.ssh/my-vps-key root@你的服务器IP
ubuntu 用户登录
ssh -i ~/.ssh/my-vps-key ubuntu@你的服务器IP
非标准端口
ssh -p 2222 -i ~/.ssh/my-vps-key ubuntu@IP

首次连接提示 Are you sure... 输入 yes

~/.ssh/config
Host myvps
    HostName 你的服务器IP
    User root
    Port 22
    IdentityFile ~/.ssh/my-vps-key
    IdentitiesOnly yes
设置 config 权限
chmod 600 ~/.ssh/config
快捷登录
ssh myvps
Password vs Key

SSH + 密码 vs SSH + SSH Key

SSH + 密码SSH + SSH Key
安全性弱密码可能被猜中Ed25519 几乎不可能暴力破解
多设备同密码独立密钥,单独授权撤销
建议不推荐公网使用推荐,加 passphrase 双重保护
Multi-device

多台电脑管理同台服务器

每台电脑生成独立密钥,不要复制同一份 private key。公钥保存在 ~/.ssh/authorized_keys。流程:商家密钥首次登录 → 各电脑 ssh-keygen → public key 加入 authorized_keys → 测试 → 确认后删除旧公钥。

Troubleshooting

常见 SSH 错误速查

  • Permissions too openchmod 600 ~/.ssh/my-vps-key
  • Identity file not accessible → 检查路径,用 ls -la ~/.ssh
  • Permission denied (publickey) → 核对用户名、IP、端口、私钥
  • Host identification changedssh-keygen -R 服务器IP
System

更新系统并安装基础工具

更新软件包列表
sudo apt update
升级软件包
sudo apt upgrade -y
安装必要工具
sudo apt install -y curl openssl nano
Time

检查并同步系统时间

查看时间同步状态
timedatectl status
启用自动同步
sudo timedatectl set-ntp true

REALITY 对时间差敏感。

Ports

检查端口占用

检查 443
sudo ss -lntp | grep ':443 '
Firewall

放行必要端口

放行 SSH
sudo ufw allow OpenSSH
放行 443
sudo ufw allow 443/tcp
启用并查看
sudo ufw enable
sudo ufw status

务必先放行 SSH 再启用 UFW。云厂商安全组也要同步放行。

Flow

整体流程:先 SSH,再部署。

购买 VPS → SSH Key 登录 → 确认稳定 → 部署前准备 → 选面板或命令行 → 配置 Reality + VLESS → 客户端测试。

Architecture

两种部署方式

3x-ui 面板方式:Web 界面管理,自动生成分享链接,适合新手。
Xray 命令行方式:直接编辑 JSON 配置,更轻量。两种方式共享同一个 Xray-core 内核。

Terms

Reality + VLESS 的关键词

  • VLESS:轻量协议,身份靠 UUID
  • Reality:TLS 伪装传输,不依赖自己的域名证书
  • SNI / dest:伪装目标站点,选支持 TLS 1.3 的真实网站
  • Public / Private Key:服务端 Private,客户端 Public
  • Short ID:两端必须一致
Assumption

本文默认条件

  • 本地 macOS,服务器 Ubuntu 24.04 LTS
  • 能用 ssh root@IP 登录
  • 安全组或防火墙已放行
  • 只在拥有或被授权的服务器上操作
Install

一键安装 3x-ui

官方安装脚本
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)

如果没有 curl,先执行 apt update && apt install -y curl

3x-ui Docker

官方 GHCR 镜像

docker-compose.yml
services:
  3xui:
    image: ghcr.io/mhsanaei/3x-ui:latest
    container_name: 3xui_app
    cap_add:
      - NET_ADMIN
      - NET_RAW
    volumes:
      - ./db/:/etc/x-ui/
      - ./cert/:/root/cert/
    environment:
      XRAY_VMESS_AEAD_FORCED: "false"
      XUI_ENABLE_FAIL2BAN: "true"
    ports:
      - "2053:2053"
      - "443:443"
    tty: true
    restart: unless-stopped
启动
docker compose up -d

NET_ADMINNET_RAW 用于让容器内 Fail2Ban 真正执行封禁;每个节点入站端口也必须加入 ports。默认 admin/admin,首次登录必须修改。

Interactive setup

安装时的交互选项

项目建议说明
面板端口随机值或手动输入登录后台用
用户名/密码脚本生成随机值不要用弱密码
Web Base Path保留随机路径http://IP:端口/路径
SSL 证书有域名选 Let's Encrypt需 80 端口可用
Bind 127.0.0.1跳过 SSL 时选 y用 SSH 隧道访问
SSH 隧道访问
ssh -L 2222:127.0.0.1:面板端口 root@服务器IP
China network

国内备用方案

GitHub raw 代理
bash <(curl -Ls https://gh-proxy.com/https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
Docker 国内镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/mhsanaei/3x-ui:latest
Manage

管理命令

管理菜单
x-ui
服务状态
systemctl status x-ui --no-pager
Uninstall

卸载

一键卸载
printf 'y\n' | x-ui uninstall
强制清理残留
systemctl stop x-ui 2>/dev/null
systemctl disable x-ui 2>/dev/null
rm -f /etc/systemd/system/x-ui.service /usr/bin/x-ui
rm -rf /etc/x-ui /usr/local/x-ui /var/log/x-ui
systemctl daemon-reload
systemctl reset-failed
Must do

安装后立即修改

  1. 修改用户名和密码
  2. 修改面板端口
  3. 设置不可猜的 Web Base Path
  4. 只放行必要端口
Firewall

端口检查

UFW 状态
ufw status
放行端口
ufw allow 22/tcp
ufw allow 面板端口/tcp
ufw allow 节点端口/tcp
Inbound

3x-ui 入站配置

项目建议值说明
ProtocolVLESS
Port自定义如 443、8443
TransmissionTCP
SecurityReality生成密钥对
Flowxtls-rprx-vision两端一致
Dest / SNIwww.microsoft.com:443TLS 1.3 站点
Public Key复制给客户端不填 Private
Short ID生成值两端一致
Steps

面板内操作

  1. 登录 → Inbounds → Add
  2. VLESS + TCP
  3. Security = Reality,生成密钥
  4. 填 Dest、SNI、端口
  5. 复制分享链接导入客户端
Reality target

Dest 和 SNI 选择

目标站点需真实存在、443 可访问、TLS 稳定。初学者用 www.microsoft.com:443

TLS 握手测试
/usr/local/bin/xray tls ping www.microsoft.com
HTTPS 可达性
curl -I --tlsv1.3 https://www.microsoft.com
Latency test

批量测试伪装官网延迟

从服务器出口测试,优先选 TLS 握手快、状态码稳定的站点。

批量测试脚本
cat > /tmp/reality-target-test.sh <<'EOF'
#!/usr/bin/env bash
sites=(www.microsoft.com www.apple.com www.cloudflare.com www.amazon.com www.samsung.com www.nvidia.com www.intel.com www.oracle.com)
printf "%-24s %-6s %-8s %-8s %-8s %-8s\n" "SITE" "CODE" "DNS" "TCP" "TLS" "TOTAL"
for site in "${sites[@]}"; do
  result=$(curl -o /dev/null -sS --connect-timeout 5 --max-time 10 --tlsv1.3 \
    -w "%{http_code}|%{time_namelookup}|%{time_connect}|%{time_appconnect}|%{time_total}" \
    "https://${site}" 2>/dev/null)
  if [ $? -eq 0 ]; then
    IFS='|' read -r code dns tcp tls total <<DATA
$result
DATA
    printf "%-24s %-6s %-8s %-8s %-8s %-8s\n" "$site" "$code" "$dns" "$tcp" "$tls" "$total"
  else
    printf "%-24s failed\n" "$site"
  fi
done
EOF
执行
bash /tmp/reality-target-test.sh
Mapping

服务端与客户端字段一一对应

客户端字段填写内容
AddressVPS 公网 IP
Port入站端口,如 443
UUID服务器 VLESS UUID
Encryptionnone
Transporttcp
Securityreality
Flowxtls-rprx-vision
SNI同服务端
Fingerprintchrome
Public Keyx25519 客户端值——绝不能 PrivateKey
Short ID同服务端
SpiderX/ 或留空
Sharing link

分享链接模板

VLESS Reality URI
vless://UUID@VPS_IP:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=www.microsoft.com&fp=chrome&pbk=PublicKey&sid=ShortID&type=tcp&headerType=none#VPS

pbk 填客户端 PublicKey——绝不能填 PrivateKey。

Do not mix

最容易填错的两个端口

面板端口用于登录后台;节点端口才是客户端连接端口。填错表现为连接失败。

Export

优先分享链接导入

手动填写容易漏掉 Flow、Public Key 或 Short ID。首选 3x-ui 生成的分享链接。

Alternative

不用面板,纯命令行操作。

直接安装 Xray-core 并用 JSON 配置管理。更轻量,也更容易理解每一步在做什么。

Flowchart

命令行部署流程

  1. 01

    安装 Xray-core

    使用 XTLS 官方安装脚本

  2. 02

    生成密钥

    UUID、x25519 与 Short ID

  3. 03

    编辑 config.json

    填入参数、目标站与 SNI

  4. 04

    测试配置

    运行 xray run -test

  5. 05

    启动与验证

    重启服务并测试客户端

Step 1

安装 Xray-core

安装
sudo bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
检查版本
/usr/local/bin/xray version

路径:/usr/local/bin/xray,配置 /usr/local/etc/xray/config.json

Step 2

生成 UUID 和 Reality 密钥

生成 UUID
/usr/local/bin/xray uuid
生成 Reality 密钥对
/usr/local/bin/xray x25519
生成 Short ID
openssl rand -hex 8

xray x25519 输出 PrivateKey 和 Password(或 PublicKey)。PrivateKey → 服务器,Password/PublicKey → 客户端。

Step 3-4

编辑 config.json 并测试

替换 UUID、PrivateKey、ShortID 三个占位符。RAW 传输在 streamSettings 中使用 "network": "raw"

config.json 模板
{
  "log": { "loglevel": "warning" },
  "inbounds": [{
    "tag": "vless-reality-in",
    "listen": "0.0.0.0",
    "port": 443,
    "protocol": "vless",
    "settings": {
      "clients": [{ "id": "UUID", "flow": "xtls-rprx-vision" }],
      "decryption": "none"
    },
    "streamSettings": {
      "network": "raw",
      "security": "reality",
      "realitySettings": {
        "show": false,
        "target": "www.microsoft.com:443",
        "serverNames": ["www.microsoft.com"],
        "privateKey": "PrivateKey",
        "shortIds": ["ShortID"]
      }
    },
    "sniffing": { "enabled": true, "destOverride": ["http","tls","quic"] }
  }],
  "outbounds": [
    { "tag": "direct", "protocol": "freedom" },
    { "tag": "blocked", "protocol": "blackhole" }
  ]
}
测试配置
sudo /usr/local/bin/xray run -test -config /usr/local/etc/xray/config.json
Step 5

启动服务并查看日志

重启并开机自启
sudo systemctl restart xray
sudo systemctl enable xray
服务状态
sudo systemctl status xray --no-pager
确认端口监听
sudo ss -lntp | grep ':443 '
实时日志
sudo journalctl -u xray -f
最近日志
sudo journalctl -u xray -n 100 --no-pager
Verify

确认代理已生效

客户端连接后访问 https://ipinfo.io,显示 VPS IP 即为生效。同时在服务器:

实时日志
sudo journalctl -u xray -f
No logs

服务器无日志

  • 安全组是否放行 TCP 443
  • UFW 是否阻止
  • 客户端 IP 和端口是否正确
  • 443 是否被其他程序占用
Auth

认证失败

  • UUID 完全一致?
  • Password/PublicKey 正确?
  • Short ID、SNI、Flow 一致?
  • 时间同步?(timedatectl
Service

服务状态

3x-ui 状态
systemctl status x-ui --no-pager
近期日志
journalctl -u x-ui -n 80 --no-pager
Port

端口监听

查看监听
ss -lntp | grep -E '面板端口|节点端口'
Network

本机测试

TCP 端口
nc -vz 服务器IP 节点端口
面板端口
nc -vz 服务器IP 面板端口
Checklist

排查顺序

  1. VPS SSH 登录
  2. 3x-ui / xray running
  3. 端口监听
  4. 云安全组与 UFW 放行
  5. UUID、端口、SNI、Key、ShortID、Flow 一致
  6. 服务器时间(timedatectl
Hardening

安全加固顺序

  1. 保留已登录终端
  2. 新终端用新密钥登录
  3. 确认成功后重启再测
  4. 为其他设备生成独立密钥
  5. 确认所有设备能登录
  6. 最后关闭密码登录和删除旧公钥

任何影响 SSH 的修改都保留一个已登录窗口作为退路。