无法从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
相关产品推荐
相关产品推荐

