学生版Azure部署教程(含踩坑与解决方法)

CCYH 2026-08-07 10:58 1

--------更新:节点测试----------

下午用这个节点+我的域名邮箱注册了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的帮助。


目录



  1. 前置准备(也可以不准备)

  2. 区域选择

  3. 创建 Azure 资源

  4. SSH 连接与系统更新

  5. 安装 sing-box

  6. 配置 NSG 端口

  7. 客户端配置

  8. 开启 BBR

  9. IPv6 双栈配置

  10. 节点质量检测

  11. 异常处理

  12. 备份与维护

  13. 命令速查表


一、前置准备(也可以不准备)


这里的命令是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_v2Standard_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_rsaid_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?...

JSONserver 字段直接写 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、解锁检测需按文档手动执行。

最新回复 (19)
  • ning1 08-07 11:02
    1

    感谢分享,但是用codex从0-1应该没啥问题,前两天全程用codex 搭建了亚马逊云,有了这篇文章可能更方便些

  • JK 08-07 11:02
    2

    创建公网 IP 好像就要收费了吧

  • 太子 08-07 11:02
    3

    感谢分享,上月已经搭建完成,教程做的很认真详细 ^-^

  • CCYH 楼主 08-07 11:04
    4

    其实现在不需要看什么教程了,有账户之后把需求说清楚,然后全程Ctrl+C,Ctrl+V就行了 ^-^

  • CCYH 楼主 08-07 11:04
    5

    对,学生版日常轻量使用其实是足够的

  • yyjeqhc 08-07 11:04
    6

    感谢佬友!我之前用过一年的,感觉它是真难用,收费的地方也很多。到期以后我就直接删除没弄了。

  • YsainLin 08-07 11:04
    7

    真学生注册不了 ^-^邮箱登录微软直接封我 奇奇怪怪

  • ning1 08-07 11:04
    8

    想知道azure 这个免费多久学生?

  • CCYH 楼主 08-07 11:05
    9

    固定100$/年,每年通过验证后再给100$

  • Guangdong 08-07 11:08
    10

    感觉不好用,限制比较多,有时候被分配到欧洲区域

  • CCYH 楼主 08-07 11:08
    11

    那个界面是真难用,我一开始嫌麻烦没有创建存储账户,然后每次退出之后想重连都要重新生成密钥

  • CCYH 楼主 08-07 11:10
    12

    开代理了吗,登录和验证学生身份都不能用代理

  • softwind 08-07 11:14
    13

    直接封



    怎么个封法?是封禁了微软账号,还是提示“你没有资格使用学生优惠”这种?

  • YsainLin 08-07 11:19
    14

    用学校的邮箱,登上去微软就显示我违反用户协议,第一次登 后面用我朋友的显示我学校没注册不行

  • softwind 08-07 11:20
    15

    啊?这是啥情况,^-^ ,佬友你要不私我一下学校名字我帮你查一下GitHub教育名单

  • YsainLin 08-07 11:24
    16

    Github已经过了 但是就是这个很奇怪

  • sophiax 08-07 15:15
    17

    hk目前绕路新加坡了,到北方一百多延迟

  • Zwei🚩 08-07 17:32
    18




    太不稳定了吧 马来西亚区Azure

  • Oyal 08-07 17:51
    19

    就是流量有点少,115g,我吃灰好久了

* 帖子来源Linux.do
返回