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

无法从Azure Ubuntu虚拟机连接Azure SQL实例,本地可连接求助

从Azure Ubuntu虚拟机连接Azure SQL数据库(FreeTDS ODBC)超时问题

问题描述

尝试从运行Ubuntu的Azure虚拟机(VM)连接托管式Azure SQL数据库,使用Python + FreeTDS ODBC,连接字符串如下:

Driver=FreeTDS;Server=mycompany.database.windows.net;Database=mydbname;UID=myusername;PWD=secret;Port=1433;Timeout=30

连接时出现超时错误:

[FreeTDS][SQL Server]Timeout expired (0) (SQLDriverConnect)

无论在连接字符串还是pyodbc的connect()参数中设置何种超时参数,都会在约1秒内超时,而非设置的30秒。

已完成的排查步骤:

  • 本地机器和VM都能通过telnet连接服务器1433端口并得到响应;
  • VM能ping通该服务器,本地机器不行;
  • VM和本地机器解析主机名得到的IP一致;
  • 本地机器可正常连接;通过SSH隧道将Azure VM流量路由到本地机器后,用相同连接字符串也能成功连接;
  • 已在Azure VM防火墙临时添加允许0/32的规则,无变化;
  • 已勾选SQL实例上的"允许Azure服务访问此资源"选项。

确定Azure端有遗漏设置,但无法定位,求指导。


解决方案建议

1. 修正FreeTDS的TLS与版本配置

Azure SQL要求强制使用TLS 1.2,旧版本FreeTDS可能存在兼容问题:

  • 用tsql -C查看FreeTDS版本,确保在1.0及以上;
  • 修改/etc/freetds/freetds.conf全局配置:
    [global]
    tds version = 7.4
    encryption = require
    
  • 连接字符串补充加密参数:Encrypt=yes;TrustServerCertificate=no

2. 检查Azure SQL防火墙的IP白名单

虽然勾选了"允许Azure服务访问",部分场景仍需手动添加VM公网IP到SQL防火墙允许列表:

  • 登录Azure门户,进入目标SQL数据库的"防火墙和虚拟网络"设置;
  • 添加VM的公网IP(可从VM网络设置中获取)到IP规则列表。

3. 排查VM子网的网络安全组(NSG)出站规则

VM自身防火墙之外,子网NSG可能阻止1433端口出站流量:

  • 进入VM所在子网的NSG设置;
  • 检查出站规则,确保存在允许目标端口1433、目标地址为Azure SQL IP段(或临时允许所有地址)的规则。

4. 启用VNet服务端点(适用于VNet内的VM)

若VM在Azure VNet中,启用SQL服务端点可让流量走Azure内部网络:

  • 在VNet的"服务端点"设置中,添加"Microsoft.Sql"服务端点;
  • 回到SQL数据库防火墙设置,添加对应子网到允许列表。

5. 调整连接超时参数

FreeTDS与pyodbc的超时参数命名有差异,尝试修改:

  • 连接字符串中用LoginTimeout=30替代Timeout=30;
  • 或在pyodbc连接时指定参数:pyodbc.connect(connection_string, login_timeout=30)

另外,确保用户名格式正确,Azure SQL用户名需包含服务器前缀,例如myusername@mycompany(对应服务器mycompany.database.windows.net)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:23:15