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

