You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从Azure虚拟机访问Azure SQL Server的解决求助

问题描述

我按Azure VM集群教程创建了资源组,包含虚拟网络、子网、两台虚拟机及共享同一前端公网IP的LoadBalancer(已配置NAT规则)。新建Azure MSSQL Server后,在防火墙规则中添加了LoadBalancer的公网IP,但从虚拟机访问SQL Server时遇到以下问题:

  • 执行ping <hostname>失败,结果为133 packets transmitted, 0 received, 100% packet loss, time 295ms
  • 用ping解析的IP执行telnet显示连接成功:
    Trying <ip_address>...
    Connected to <ip_address>.
    Escape character is '^]'.
    
  • 应用程序连接时报错:
    com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset ClientConnectionId:8b2f0e3b-fda0-41af-b8dc-ce80d0760b82
            at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:3806) ~[mssql-jdbc-11.2.0.jre8.jar:?]
            at com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:2109) ~[mssql-jdbc-11.2.0.jre8.jar:?]
            at com.microsoft.sqlserver.jdbc.SQLServerConnection.prelogin(SQLServerConnection.java:3517) ~[mssql-jdbc-11.2.0.jre8.jar:?]
            at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:3325) ~[mssql-jdbc-11.2.0.jre8.jar:?]
            at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2950) ~[mssql-jdbc-11.2.0.jre8.jar:?]
            at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2790) ~[mssql-jdbc-11.2.0.jre8.jar:?]
            at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1663) ~[mssql-jdbc-11.2.0.jre8.jar:?]
            at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1064) ~[mssql-jdbc-11.2.0.jre8.jar:?]
            at jet.server.db.core.ConnectorManager$ConnectionPool.£(ConnectorManager.java:712) ~[JRESServlets.jar:?]
            at jet.server.db.core.ConnectorManager$ConnectionPool.connect(ConnectorManager.java:432) ~[JRESServlets.jar:?]
            at jet.server.db.core.ConnectorManager$ConnectionPool.getConnection(ConnectorManager.java:504) ~[JRESServlets.jar:?]
            at jet.server.db.core.ConnectorManager$ConnectionPool.getConnection(ConnectorManager.java:487) ~[JRESServlets.jar:?]
            at jet.server.db.core.DatabaseImpl.open(DatabaseImpl.java:839) ~[JRESServlets.jar:?]
            at jet.server.db.core.GlobalDataService.<init>(GlobalDataService.java:103) ~[JRESServlets.jar:?]
            at jet.server.db.core.GlobalDataService.init(GlobalDataService.java:37) ~[JRESServlets.jar:?]
            at jet.server.ServerEnv.K(ServerEnv.java:2322) ~[JRESServlets.jar:?]
    
解决方案

1. 修正SQL Server防火墙规则

Azure SQL Server防火墙需要添加的是虚拟机所在子网的私有IP段,而非LoadBalancer的公网IP——VM访问Azure PaaS服务时,出站IP是子网对应的服务出站IP,而非LoadBalancer前端IP:

  • 进入Azure Portal的SQL Server资源,打开「防火墙和虚拟网络」页面
  • 删除原有的LoadBalancer公网IP规则,添加VM所在子网的CIDR(例如10.0.0.0/24)
  • 临时勾选「允许Azure服务和资源访问此服务器」用于测试,后续可根据需求调整

2. 检查VM子网的NSG出站规则

确认虚拟机所在子网的网络安全组(NSG)允许出站访问1433端口:

  • 找到VM对应的NSG,进入「出站安全规则」
  • 添加规则:允许目标端口1433,目标服务标签选择Sql.Azure,优先级设为高于所有拒绝规则

3. 验证SQL Server基础配置

  • 确认SQL Server已启用TCP/IP协议:进入SQL Server的「连接」设置,确保「允许访问此服务器」开启,TCP端口设为1433
  • 检查连接字符串:确认使用完整主机名(格式为<server-name>.database.windows.net)、端口1433,用户名密码正确

4. 关于ping失败的说明

Azure SQL Server默认禁止ICMP请求(ping),所以ping失败是正常现象,无需处理,只要telnet或应用能正常连接即可。

5. 深层排查连接重置问题

若以上步骤无效,尝试:

  • 更换JDBC驱动版本:使用适配JRE8的最新稳定版mssql-jdbc驱动
  • 检查VM本地防火墙:确认虚拟机内部防火墙未阻止出站1433端口
  • 启用SQL Server诊断日志:查看是否有登录失败或连接拒绝的具体日志信息

内容的提问来源于stack exchange,提问作者rhonda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:20:42