Azure 上从 VMess 迁到 Xray VLESS Reality

记录一次在 Azure Linux VPS 上并行部署 Xray、VLESS、Reality 和 Vision 的过程,保留旧 VMess 作为回滚方案。

工程实践 Xray, VLESS, Reality, Azure, v2rayN RH XING
正文

Azure 上从 VMess 迁到 Xray VLESS Reality

这篇是一次迁移记录:原来 Azure 上跑的是旧的 VMess 节点,这次没有直接拆掉,而是另外部署一套 Xray + VLESS + Reality + Vision。先跑通新服务,再决定要不要停旧服务。

这种并行迁移的好处很简单:配置错了也不会把自己锁在门外,旧节点还能当回滚方案。

最终目标是:

服务端:Xray-core
协议:VLESS
传输:TCP
安全层:Reality
Flow:xtls-rprx-vision
客户端:v2rayN
示例端口:8443/TCP

Reality 的一个现实优点是:不需要域名,不需要自己申请证书,也不需要 Nginx 或 Caddy 反代。对自用节点来说,配置会清爽很多。

先看服务器现状

先确认机器上到底有什么:

command -v v2ray
command -v xray
v2ray version 2>/dev/null || true
xray version 2>/dev/null || true
systemctl status v2ray --no-pager 2>/dev/null || true
systemctl status xray --no-pager 2>/dev/null || true

再看端口占用:

sudo ss -lntp | grep -E '16823|443|8443|2053|2083' || true

我这里保留旧 v2ray.service,新服务单独用 xray.service。旧端口不动,新端口用 8443

安装 Xray

如果系统里还没有 Xray,可以用官方安装脚本:

cd ~
wget -O install-release.sh https://github.com/XTLS/Xray-install/raw/main/install-release.sh
sudo bash install-release.sh

安装后检查:

command -v xray
xray version
systemctl status xray --no-pager

这一步只是把 Xray 装好。服务是否能跑起来,还要看配置文件。

生成 VLESS Reality 参数

需要准备三类参数:UUID、Reality 密钥对、shortId。

生成 UUID:

xray uuid

生成 Reality 密钥对:

xray x25519

输出里会有:

Private key: 服务端私钥
Public key: 客户端公钥

生成 shortId:

openssl rand -hex 8

这几个值都要保存好。Private key 只放服务端,Public key、UUID、shortId 要填到客户端。

写 Xray 配置

先备份原配置:

sudo cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.bak.$(date +%F-%H%M%S)

编辑配置:

sudo nano /usr/local/etc/xray/config.json

模板如下,把占位符换成自己的值:

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "vless-reality-in",
      "listen": "0.0.0.0",
      "port": 8443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "替换成你的 UUID",
            "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",
          "shortIds": [
            "替换成你的 shortId"
          ]
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls",
          "quic"
        ]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}

这里的 www.microsoft.com 只是 Reality 目标站点示例。客户端里的 SNI 要和服务端一致,不然会连不上。

保存后先测试配置,不要急着重启:

sudo xray run -test -config /usr/local/etc/xray/config.json

看到 Configuration OK. 再继续。

启动服务

sudo systemctl restart xray
sudo systemctl status xray --no-pager
sudo ss -lntp | grep 8443

如果 8443 已经由 xray 监听,服务端这边就基本到位了。

Azure NSG 放行端口

Azure 上别只盯着 Linux 本机防火墙。很多时候真正挡住连接的是 Network Security Group。

在 Azure Portal 里打开:

Virtual machines
  -> 目标 VM
  -> Networking
  -> Add inbound port rule

新增规则:

Source: Any
Source port ranges: *
Destination: Any
Service: Custom
Destination port ranges: 8443
Protocol: TCP
Action: Allow
Priority: 300
Name: Allow-Xray-8443

稳定后,入站规则尽量只保留必要端口,比如 22/TCP8443/TCP。旧 VMess 不用了以后,再把旧端口从入站规则里删掉。

v2rayN 客户端配置

在 v2rayN 新建一个 VLESS 节点,核心参数如下:

协议:VLESS
地址:服务器公网 IP
端口:8443
用户 ID:UUID
Flow:xtls-rprx-vision
传输协议:tcp
安全:reality
SNI / serverName:www.microsoft.com
Fingerprint:chrome
Public Key:xray x25519 输出的 Public key
ShortId:openssl rand -hex 8 生成的 shortId
SpiderX:/
Mux:关闭

如果界面里还有 typehostpath 这类传输层字段,保持空或默认即可。Reality 这条链路不需要 WebSocket path,也不需要伪装 host。

TUN 的设置

如果只想让浏览器走代理,可以先别开 TUN。等节点确认稳定后,再考虑让系统流量按规则接管。

我这边更稳的 TUN 参数是:

自动路由:开
严格路由:开
协议栈:gvisor
MTU:1400,不稳再试 1280
ICMP 路由策略:rule
IPv6:先关
旧版 TUN 保护:开

另外一定要让局域网和私有网段直连:

geoip:private
127.0.0.0/8
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
192.168.55.0/24

最后这个 192.168.55.0/24 是 Jetson 常见的 USB 网络段。如果 TUN 把它接管了,调板子的时候会很别扭。

验证和排查

服务端看日志:

sudo journalctl -u xray -f -l

本地 Windows 测端口:

Test-NetConnection 服务器IP -Port 8443

如果 TcpTestSucceeded : True,说明至少端口是通的。剩下的问题通常在 UUID、Public key、shortId、SNI、flow 这些字段里。

几个常见问题:

  • Configuration OK. 但客户端连不上:先查 Azure NSG,再查客户端参数。
  • v2rayN 一开 TUN 就没网:优先试 MTU、IPv6、严格路由和私有网段绕过。
  • 节点偶发延迟高:不要只看服务端,也要看本地 Wi-Fi、运营商出口、TUN、DNS 和虚拟网卡。
  • WSL 走代理失败:先确认 v2rayN 的 mixed/http/socks 端口,再从 WSL 访问 Windows 主机 IP。

旧 VMess 怎么处理

我不建议新节点刚通就删旧服务。可以先停掉并禁用自启:

sudo systemctl stop v2ray
sudo systemctl disable v2ray

如果需要回滚:

sudo systemctl start v2ray
sudo systemctl enable v2ray

旧配置文件和旧 Azure 入站规则可以先留一小段时间。等新链路稳定了,再做清理。

收尾

配置文件里有私钥,权限收紧一下:

sudo chown root:root /usr/local/etc/xray/config.json
sudo chmod 600 /usr/local/etc/xray/config.json
sudo cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.safe.bak

不要公开这些内容:

  • UUID
  • Private key
  • Public key
  • shortId
  • 完整分享链接

这次迁移最大的经验不是某个参数,而是迁移节奏:旧服务先留着,新服务单独跑,确认稳定后再收尾。这样出了问题可以退,不会把一次配置修改变成一次远程救火。

评论

欢迎留下想法、补充或问题。评论由 GitHub Discussions 提供支持。