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/TCP 和 8443/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:关闭
如果界面里还有 type、host、path 这类传输层字段,保持空或默认即可。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
- 完整分享链接
这次迁移最大的经验不是某个参数,而是迁移节奏:旧服务先留着,新服务单独跑,确认稳定后再收尾。这样出了问题可以退,不会把一次配置修改变成一次远程救火。