--------更新:节点测试----------
下午用这个节点+我的域名邮箱注册了Claude,虽然网站测试节点纯净度比较低,但是注册过程无需手机号验证,挺玄学的


Azure 搭建 sing-box VLESS-REALITY 代理服务器
前言:站内已经有一些部署Azure作为代理的教程了,我在实际操作过程中其实踩了不少坑,包括但不限于:1.未选择存储账户,导致每次重开cloud shell的时候都连不上VM;2.区域限制,无法开启目标区域的机器,cloud shell开放端口与VM端口不匹配导致节点不可用。
摘要:在Azure任意区域搭建 sing-box VLESS-REALITY 代理服务器,含IPv6双栈、BBR加速、解锁检测。教程由本人实际部署过程中提炼,包括区域选择,机器创建,节点创建到最终的测试,命令变量化,迁移到任意区域只需要改 LOCATION即可,当然,我也只是在AI辅助的情况下部署的,如果有错误的地方,还请各位佬友指正,或者自行寻求LLM的帮助。
目录
- 前置准备(也可以不准备)
- 区域选择
- 创建 Azure 资源
- SSH 连接与系统更新
- 安装 sing-box
- 配置 NSG 端口
- 客户端配置
- 开启 BBR
- IPv6 双栈配置
- 节点质量检测
- 异常处理
- 备份与维护
- 命令速查表
一、前置准备(也可以不准备)
这里的命令是GLM5.2给我的,但是实际上在页面里面启动终端就可以直接连上了,这里可能意思是在自己电脑的终端里安装,后续就不用进网页连接了。

1.1 安装 Azure CLI
Linux(curl 一键安装):
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
macOS(Homebrew):
brew install azure-cli
Windows:从 https://aka.ms/installazurecliwindows 下载安装包。
1.2 登录 Azure
az login
浏览器会弹出登录页,登录后终端会显示订阅列表。如果有多个订阅,选择要用的:
# 列出所有订阅
az account list --query "[].{name:name, id:id, isDefault:isDefault}" -o table
# 设置默认订阅
az account set --subscription "<订阅ID或名称>"
二、区域筛选(必做)
这一步最重要。学生版可能有区域白名单策略,不是所有区域都能部署,这里要先查清楚可用区域,避免创建资源组成功但建 VM/IP 时被拒,我一开始想创建新加坡的机器,但是被拒了。
2.1 查看订阅允许的区域
# 方法一:列出所有推荐区域
az account list-locations --query "[?metadata.regionCategory=='Recommended'].{name:name, display:displayName}" -o table
# 方法二:列出所有区域(含扩展类别)
az account list-locations -o table
# 方法三:查看是否有 location 策略限制
az policy assignment list --query "[?contains(properties.displayName,'location') || contains(properties.displayName,'Location')].{name:name, display:properties.displayName}" -o table
判断方法:如果 az account list-locations 能列出某区域,但创建资源时报 RequestDisallowedByAzure,就说明该区域被策略限制,换一个其他的。
2.2 代理用途的区域选择建议
代理服务器选区域的核心考量:延迟、解锁情况、IP 风控程度,我主要是存粹闲得慌想搭个节点玩一玩,顺便用用AI啥的,所以选了日本节点(新加坡也行,但是我的账户不支持新加坡区域)。

追求低延迟日常使用 → japaneast / koreacentral / southeastasia
追求 ChatGPT/美区流媒体解锁 → westus2 / westus3
均衡选择 → southeastasia(延迟和解锁都不错)
2.3 选定区域后记录变量
LOCATION=japaneast # 替换成你自己选的区域
三、创建 Azure 资源
3.1 定义全局变量
RG=proxy-group # 资源组名
VM=proxy-vm # VM 名
LOCATION=japaneast # 区域(见上一步选择)
VM_SIZE=Standard_B2ats_v2 # VM 规格(2 vCPU / 1GB RAM,约 $8/月)
ADMIN_USER=azureuser # 管理员用户名
PROXY_PORT=7251 # sing-box 默认监听端口(安装后以实际为准)
VM 规格建议:代理用 Standard_B2ats_v2(2核1G)就足够了,甚至还有点多余;学生版100$其实足够用一段时间,如果预算紧,就用 Standard_B1s(1核1G,约 $4/月但带宽小);追求性能用 Standard_B2pls_v2 或 Standard_D2s_v5,但是会比较贵。
3.2 创建资源组
az group create --name $RG --location $LOCATION
3.3 创建公网 IP
az network public-ip create \
--resource-group $RG --name ${VM}-ip \
--location $LOCATION --sku Standard --allocation-method Static
输出里的 ipAddress 就是公网 IPv4,记下来,待会要用。
3.4 创建 VM
az vm create \
--resource-group $RG --name $VM --location $LOCATION \
--image Canonical:ubuntu-24_04-lts:server:latest \
--size $VM_SIZE \
--admin-username $ADMIN_USER \
--generate-ssh-keys \
--public-ip-address ${VM}-ip \
--os-disk-size-gb 64 \
--storage-sku Standard_LRS
--generate-ssh-keys 会在本地 ~/.ssh/ 生成 id_rsa 和 id_rsa.pub(若已存在则复用),并将公钥写入 VM。
输出里的 publicIpAddress 务必记录,后续 SSH 和客户端配置都要用。
这里需要注意:如果你启动cloud shell的时候选择的是不用存储,那你生成的密钥会在你退出对话后丢失,之后每次连接VM都需要重新生成密钥,非常麻烦,所以更建议使用存储模式。
3.5 开放基础端口
# 80/443(备用,后续可能用于证书或伪装)
az vm open-port --resource-group $RG --name $VM --port 80 --priority 100
az vm open-port --resource-group $RG --name $VM --port 443 --priority 110
# 代理端口(sing-box 默认 7251,安装后以实际为准)
az vm open-port --resource-group $RG --name $VM --port $PROXY_PORT --priority 120
SSH 22 端口 az vm create 已自动开放,无需手动添加。
四、SSH 连接与系统更新
4.1 SSH 连接
ssh $ADMIN_USER@<公网IP>
# 若有多个 key,明确指定
ssh -i ~/.ssh/id_rsa $ADMIN_USER@<公网IP>
首次连接会提示确认 host key,输入 yes。
4.2 切换 root
sudo -i
4.3 系统更新
apt update && apt -y upgrade
4.4 重启加载新内核(如有内核升级)
reboot
SSH 会断开,等待 30-60 秒后重连。验证新内核:
uname -r
五、安装 sing-box
5.1 一键安装(233boy 脚本)
bash <(curl -sSL https://raw.githubusercontent.com/233boy/sing-box/main/install.sh)
安装完成后会输出节点配置(协议、端口、UUID、公钥、SNI、flow 等),如果没有过多需求,到这一步就可以结束了,把订阅链接导入到软件中就可以了。
5.2 补充一些sing-box常用管理命令
sing-box # 交互菜单
sing-box info # 查看节点完整信息
sing-box url # 生成分享链接(vless)
sing-box qr # 终端显示 ASCII 二维码
sing-box sub # 生成订阅链接
5.3 验证服务状态
systemctl status sing-box --no-pager # 应为 active (running)
ss -tlnp | grep sing-box # 查看监听端口
sing-box 默认监听 ::(双栈,同时覆盖 IPv4/IPv6),无需额外配置。
六、配置 NSG 端口
sing-box 实际监听端口可能与默认 $PROXY_PORT 不同,以 sing-box info 输出为准。如果端口对不上,需要调整 NSG。
6.1 查看当前 NSG 规则
az network nsg rule list --resource-group $RG --nsg-name ${VM}NSG -o table
6.2 开放实际代理端口
# 假设实际端口是 7251
az network nsg rule create \
--resource-group $RG --nsg-name ${VM}NSG \
--name allow-proxy --priority 130 --direction Inbound --access Allow \
--protocol Tcp --source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 7251
6.3 删除不需要的端口规则
# 例如删除默认开的 54321(x-ui 默认端口,sing-box 用不到)
az network nsg rule delete \
--resource-group $RG --nsg-name ${VM}NSG --name open-port-54321
NSG 规则用 * 作为 source/destination 时,同时匹配 IPv4 和 IPv6,无需为 IPv6 单独加规则。
七、代理客户端配置(可跳过)
7.1 获取配置参数
sing-box url # 直接拿分享链接
sing-box info # 查看完整参数
7.2 分享链接格式
vless://<UUID>@<公网IPv4>:<端口>?encryption=none&flow=xtls-rprx-vision&security=reality&sni=<SNI>&fp=chrome&pbk=<公钥>&type=tcp#<节点名>
7.3 sing-box 原生 JSON
{
"type": "vless",
"tag": "proxy-v4",
"server": "<公网IPv4>",
"server_port": <端口>,
"uuid": "<UUID>",
"flow": "xtls-rprx-vision",
"network": "tcp",
"tls": {
"enabled": true,
"server_name": "<SNI>",
"utls": { "enabled": true, "fingerprint": "chrome" },
"reality": {
"enabled": true,
"public_key": "<公钥>",
"short_id": ""
}
}
}
7.4 IPv6 版节点
获取公网 IPv6 后(见第九步),可新建 IPv6 节点:
分享链接:IPv6 地址用方括号 [...],如 vless://...@[2603:1040:401:1a::f]:7251?...
JSON:server 字段直接写 IPv6 地址,不加方括号
7.5 推荐客户端

八、开启 BBR
机器的默认拥塞控制是 cubic,开BBR连接更舒服。
cat > /etc/sysctl.d/99-bbr.conf <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
sysctl --system
# 验证
sysctl net.ipv4.tcp_congestion_control # 期望: bbr
sysctl net.core.default_qdisc # 期望: fq
九、IPv6 双栈配置
为 VM 增加公网 IPv6,用于分流、解锁备用(部分服务在IPv6解锁更好,且 Azure IPv4 段常被风控时IPv6可以备用),但是IPV6要加钱。
此流程踩坑最多。
9.1 获取资源名
RG=proxy-group
VM=proxy-vm
VNET=$(az network vnet list --resource-group $RG --query "[].name" -o tsv)
SUBNET=$(az network vnet subnet list --resource-group $RG --vnet-name $VNET \
--query "[?name!='GatewaySubnet'].name" -o tsv | head -1)
# 不要用 az vm nic list --query "[].name",部分版本返回空
NIC=$(az vm show --resource-group $RG --name $VM \
--query "networkProfile.networkInterfaces[0].id" -o tsv | awk -F/ '{print $NF}')
echo "VNET=$VNET SUBNET=$SUBNET NIC=$NIC"
9.2 创建 IPv6 公网 IP
az network public-ip create \
--resource-group $RG --name ${VM}-ip-v6 \
--location $LOCATION --sku Standard --allocation-method Static --version IPv6
# 记录公网 IPv6
az network public-ip show --resource-group $RG --name ${VM}-ip-v6 --query "ipAddress" -o tsv
9.3 VNet 加 IPv6 前缀(保留原 IPv4)
# 用 addressSpace.addressPrefixes[0] 取现有 IPv4 前缀
V4_VNET=$(az network vnet show --resource-group $RG --name $VNET \
--query "addressSpace.addressPrefixes[0]" -o tsv)
az network vnet update --resource-group $RG --name $VNET \
--address-prefixes "$V4_VNET" "ace:cab:deca::/48"
9.4 子网加 IPv6 前缀(保留原 IPv4)
# 必须用单数 addressPrefix,不是复数 addressPrefixes[0](复数返回空会导致误删 IPv4)
V4_SUB=$(az network vnet subnet show --resource-group $RG \
--vnet-name $VNET --name $SUBNET --query "addressPrefix" -o tsv)
az network vnet subnet update --resource-group $RG --vnet-name $VNET --name $SUBNET \
--address-prefixes "$V4_SUB" "ace:cab:deca::/64"
9.5 NIC 加 IPv6 ipConfig(绑定公网 IPv6)
# 必须带 --vnet-name 和 --subnet,否则绑 Standard 公网 IP 会报错
az network nic ip-config create \
--resource-group $RG \
--nic-name $NIC \
--name ipconfigv6 \
--private-ip-address-version IPv6 \
--vnet-name $VNET \
--subnet $SUBNET \
--public-ip-address ${VM}-ip-v6
9.6 VM 内验证
reboot
# 重连后
ip -6 addr show eth0 # 应有 ace:cab:deca:: 开头的内网地址
curl -6 https://ifconfig.co # 应输出公网 IPv6
curl -6 -sI https://www.google.com | head -1 # 测试 IPv6 出站
sing-box 默认监听 ::(双栈),无需改配置。
十、节点质量检测
10.1 流媒体/AI 解锁检测
bash <(curl -sSL https://raw.githubusercontent.com/1-stream/RegionRestrictionCheck/main/check.sh)
分别测 IPv4 和 IPv6 两条栈,输出 ChatGPT / Netflix / Disney+ / YouTube / TikTok 等解锁状态。
10.2 IP 纯净度检测
bash <(curl -sL IP.Check.Place)
10.3 回程路由测试
curl nxtrace.org/nt | bash # 安装 nexttrace
nexttrace --fast-trace # 三网回程(电信/联通/移动)
10.4 综合性能测试
bash <(curl -sL bench.sh)
测试 CPU/内存/磁盘/网络基准。
10.5 结果解读与建议处理方法

十一、异常处理
11.1 SSH 密钥丢失 / Permission denied (publickey)
原因:本地 ~/.ssh/id_rsa 丢失(环境重置/清理),或本地有多个 key 导致超过 MaxAuthTries。
解决:
# 1. 若有多个 key,明确指定
ssh -i ~/.ssh/id_rsa azureuser@<公网IP>
# 2. 若私钥确实丢失,重新生成 + Azure 注入
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
az vm user update \
--resource-group $RG --name $VM \
--username $ADMIN_USER \
--ssh-key-value ~/.ssh/id_rsa.pub
ssh -i ~/.ssh/id_rsa $ADMIN_USER@<公网IP>
11.2 不通过 SSH 在 VM 上执行命令
az vm run-command invoke \
--resource-group $RG --name $VM \
--command-id RunShellScript \
--scripts "<命令>"
适合 SSH 完全连不上时排查(如查看 authorized_keys、重启服务等)。
11.3 IP 被风控,换公网 IP
# 方式一:删除重建(IP 会变)
az network public-ip delete --resource-group $RG --name ${VM}-ip
az network public-ip create \
--resource-group $RG --name ${VM}-ip \
--location $LOCATION --sku Standard --allocation-method Static
# 重新关联到 NIC(先 dissociate 再 associate)
az network nic ip-config update \
--resource-group $RG --nic-name <NIC名> --name <ipConfig名> \
--public-ip-address ${VM}-ip
十二、常见误区汇总
# |
误区/报错 |
原因 |
解决 |
|---|
1 |
RequestDisallowedByAzure 创建公网 IP 被拒 |
订阅有区域白名单策略 |
换区域,或 az account list-locations 查允许区域 |
2 |
Resource provider 'Microsoft.Network' is not registered |
订阅首次用网络资源 |
az CLI 自动注册,等几秒重试 |
3 |
SSH Permission denied (publickey) |
本地多 key 超过 MaxAuthTries,或私钥丢失 |
ssh -i ~/.ssh/id_rsa 指定 key;丢失则重新生成 + az vm user update |
4 |
在 VM 内部跑 ssh ...@VM的IP 失败 |
VM 上无私钥,且属无意义回环 |
认清 shell 位置,VM 内直接操作 |
5 |
装了 3x-ui 但想要 sing-box |
复制错脚本 URL |
sing-box 用 233boy 脚本,3x-ui 用 mhsanaei 脚本 |
6 |
NSG 开了 54321 但 sing-box 用 7251 |
54321 是 x-ui 默认端口 |
以 sing-box info 输出端口为准 |
7 |
代理连不上 |
NSG 未开放实际监听端口 |
az network nsg rule create 开放对应端口 |
8 |
InUsePrefixCannotBeDeleted 子网更新失败 |
用复数 addressPrefixes[0] 取前缀返回空,误删 IPv4 |
用单数 addressPrefix 取现有 IPv4 |
9 |
StandardPublicIpCannotBeAttachedToIpConfigurationWithoutSubnet |
NIC ipConfig 未关联子网 |
az network nic ip-config create 加 --vnet-name --subnet |
10 |
az vm nic list --query "[].name" 返回空 |
部分 CLI 版本只返回 id |
从 az vm show 的 id 里 awk 提取 |
11 |
BBR 显示 cubic |
脚本未自动开 BBR |
手动写 sysctl 配置 + sysctl --system |
12 |
reboot 后 SSH host key 重新确认 |
known_hosts 被清(环境重置) |
正常现象,输入 yes |
13 |
ChatGPT 提示 “unusual activity” |
IP 被 OpenAI 风控 |
换 IP 或走 IPv6 节点 |
14 |
Copilot 显示 No |
脚本检测误报或区域策略 |
影响小,浏览器直连即可 |
15 |
IPv6 配置后 VM 拿不到内网 IPv6 |
未 reboot 或 DHCPv6 未生效 |
reboot 后再验证 |
十二、备份与维护
12.1 SSH 私钥备份
若本地环境(沙箱/容器)不持久,生成 key 后立即备份,但是我实际测试下来,只要第一次启动cloud shell的时候没有选择使用存储,之后每次连都需要重新生成密钥
# 本地执行(非 VM 内)
base64 ~/.ssh/id_rsa > ~/id_rsa.b64
# 将 id_rsa.b64 下载到安全位置
恢复:
echo "<base64内容>" | base64 -d > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
12.2 SSH config 别名
本地 ~/.ssh/config:
Host <别名>
HostName <公网IP>
User azureuser
IdentityFile ~/.ssh/id_rsa
之后 ssh <别名> 即可。
12.3 流量监控
apt install -y vnstat
systemctl enable --now vnstat
vnstat -m # 月度流量
vnstat -d # 日度流量
12.4 sing-box 配置备份
sing-box info > ~/sing-box-config.txt
cp /etc/sing-box/config.json ~/sing-box-config.json.bak
12.5 定期维护
apt update && apt -y upgrade # 系统更新
sing-box # 进菜单检查更新
十三、命令速查
Azure 管理(本地执行)
场景 |
命令 |
|---|
查可用区域 |
az account list-locations --query "[?metadata.regionCategory=='Recommended'].{name:name,display:displayName}" -o table |
查 VM 公网 IP |
az vm show -g $RG -n $VM -d --query publicIps -o tsv |
查 NSG 规则 |
az network nsg rule list -g $RG --nsg-name ${VM}NSG -o table |
开端口 |
az network nsg rule create -g $RG --nsg-name ${VM}NSG --name <名> --priority <N> --direction Inbound --access Allow --protocol Tcp --source-address-prefixes '*' --source-port-ranges '*' --destination-address-prefixes '*' --destination-port-ranges <端口> |
关端口 |
az network nsg rule delete -g $RG --nsg-name ${VM}NSG --name <规则名> |
重启 VM |
az vm restart -g $RG -n $VM |
停机 VM |
az vm stop -g $RG -n $VM |
启动 VM |
az vm start -g $RG -n $VM |
不 SSH 执行命令 |
az vm run-command invoke -g $RG -n $VM --command-id RunShellScript --scripts "<命令>" |
重置 SSH key |
az vm user update -g $RG -n $VM -u $ADMIN_USER --ssh-key-value ~/.ssh/id_rsa.pub |
删除整个资源组 |
az group delete -g $RG --yes --no-wait |
VM 内执行
场景 |
命令 |
|---|
查 sing-box 信息 |
sing-box info |
查分享链接 |
sing-box url |
查二维码 |
sing-box qr |
查解锁 |
bash <(curl -sSL https://raw.githubusercontent.com/1-stream/RegionRestrictionCheck/main/check.sh) |
查 IP 纯净度 |
bash <(curl -sL IP.Check.Place) |
查 BBR |
sysctl net.ipv4.tcp_congestion_control |
查服务状态 |
systemctl status sing-box |
查监听端口 |
ss -tlnp | grep sing-box |
查实时带宽 |
nload eth0(需 apt install nload) |
附录:全流程一键脚本
将以下保存为 deploy.sh,修改顶部变量后执行。仅在已 az login 的环境运行。
#!/bin/bash
set -e
# ====== 配置区 ======
RG=proxy-group
VM=proxy-vm
LOCATION=japaneast
VM_SIZE=Standard_B2ats_v2
ADMIN_USER=azureuser
PROXY_PORT=7251
# ====================
echo ">>> 创建资源组"
az group create --name $RG --location $LOCATION
echo ">>> 创建公网 IP"
az network public-ip create -g $RG -n ${VM}-ip -l $LOCATION --sku Standard --allocation-method Static
echo ">>> 创建 VM"
az vm create -g $RG -n $VM -l $LOCATION \
--image Canonical:ubuntu-24_04-lts:server:latest \
--size $VM_SIZE --admin-username $ADMIN_USER --generate-ssh-keys \
--public-ip-address ${VM}-ip --os-disk-size-gb 64 --storage-sku Standard_LRS
echo ">>> 开放端口"
az vm open-port -g $RG -n $VM --port 80 --priority 100
az vm open-port -g $RG -n $VM --port 443 --priority 110
az vm open-port -g $RG -n $VM --port $PROXY_PORT --priority 120
PUBIP=$(az vm show -g $RG -n $VM -d --query publicIps -o tsv)
echo ">>> 完成!公网 IP: $PUBIP"
echo ">>> 下一步: ssh $ADMIN_USER@$PUBIP"
一键脚本只完成 Azure 资源创建。后续 sing-box 安装、BBR、IPv6、解锁检测需按文档手动执行。