消费计划Azure Function无法访问跨租户Azure VM上的SQL数据库
问题排查与解决方案
针对跨租户场景下,采用消费计划的Azure Function无法连接绑定NSG的VM数据库的问题,按以下步骤逐一排查解决:
1. 补全Azure Function的出站IP范围
消费计划的Azure Function出站IP包含两类,仅添加静态IP会导致遗漏:
- 从Function App -> Networking -> Outbound Traffic获取的静态出站IP地址
- Function所在区域的Azure数据中心公共IP范围(需下载Azure官方IP范围文件,筛选对应区域的
AzureCloud.<区域>条目)
将上述两类IP/IP范围全部添加到VM的NSG入站规则中,保持源IP、目标端口1433、TCP协议、允许操作的配置。
2. 检查NSG规则优先级
NSG规则按优先级数值从小到大执行(数值越小优先级越高),确保你的允许规则优先级高于任何拒绝1433端口的规则。例如将允许规则优先级设为100-1000之间,避免被默认拒绝规则(优先级65500)覆盖。
3. 验证VM操作系统防火墙配置
即使NSG放行流量,VM内部防火墙仍可能拦截请求:
- Windows:打开
Windows Defender防火墙,添加入站规则,允许TCP 1433端口,源为Function的出站IP/IP范围。 - Linux:以ufw为例,执行
ufw allow from <Function出站IP/范围> to any port 1433 proto tcp,或配置对应iptables规则。
4. 确认SQL Server配置
- 打开SQL Server配置管理器,确保TCP/IP协议已启用,且监听端口为1433。
- 在SSMS中右键服务器 -> 属性 -> 连接,勾选"允许远程连接到此服务器"。
- 验证SQL登录账号允许从Function的IP范围访问(测试阶段可临时设为
%,正式环境需限制具体IP)。
5. 测试端口连通性
在Function中添加测试代码,判断是网络层还是SQL层问题:
using System.Net.Sockets; using Microsoft.AspNetCore.Mvc; public static async Task<IActionResult> Run(HttpRequest req, ILogger log) { string vmIp = req.Query["vmIp"]; int port = 1433; using (TcpClient client = new TcpClient()) { try { await client.ConnectAsync(vmIp, port); return new OkObjectResult("1433端口连通正常"); } catch (Exception ex) { return new BadRequestObjectResult($"端口连接失败: {ex.Message}"); } } }
6. 检查VM子网路由表
若VM所在子网关联了自定义路由表,确认没有规则将Function的出站IP流量转发至不可达节点(如未配置的防火墙或对等连接)。
内容的提问来源于stack exchange,提问作者Sergiu Molnar
相关产品推荐
相关产品推荐

