- CCYH2026-08-0766597
--------更新:节点测试----------
下午用这个节点+我的域名邮箱注册了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、解锁检测需按文档手动执行。主楼 - ning12026-08-0766598
感谢分享,但是用codex从0-1应该没啥问题,前两天全程用codex 搭建了亚马逊云,有了这篇文章可能更方便些
- JK2026-08-0740716
创建公网 IP 好像就要收费了吧
- 太子2026-08-0733567
感谢分享,上月已经搭建完成,教程做的很认真详细 ^-^
- CCYH2026-08-0766597
其实现在不需要看什么教程了,有账户之后把需求说清楚,然后全程Ctrl+C,Ctrl+V就行了 ^-^
- CCYH2026-08-0766597
对,学生版日常轻量使用其实是足够的
- yyjeqhc2026-08-0725232
感谢佬友!我之前用过一年的,感觉它是真难用,收费的地方也很多。到期以后我就直接删除没弄了。
- YsainLin2026-08-0711425
真学生注册不了 ^-^邮箱登录微软直接封我 奇奇怪怪
- ning12026-08-0766598
想知道azure 这个免费多久学生?
- CCYH2026-08-0766597
固定100$/年,每年通过验证后再给100$
- Guangdong2026-08-0730795
感觉不好用,限制比较多,有时候被分配到欧洲区域
- CCYH2026-08-0766597
那个界面是真难用,我一开始嫌麻烦没有创建存储账户,然后每次退出之后想重连都要重新生成密钥
- CCYH2026-08-0766597
开代理了吗,登录和验证学生身份都不能用代理
- softwind2026-08-0718289
- YsainLin2026-08-0711425
用学校的邮箱,登上去微软就显示我违反用户协议,第一次登 后面用我朋友的显示我学校没注册不行
- softwind2026-08-0718289
啊?这是啥情况,^-^ ,佬友你要不私我一下学校名字我帮你查一下GitHub教育名单
- YsainLin2026-08-0711425
Github已经过了 但是就是这个很奇怪
- sophiax2026-08-0766599
hk目前绕路新加坡了,到北方一百多延迟
- Zwei🚩2026-08-076759
- Oyal2026-08-0729334
就是流量有点少,115g,我吃灰好久了

