WSL2 Ubuntu中Flask应用无法连接Azure SQL Server且无法ping通
解决WSL2中Flask应用连接Azure SQL Server失败的问题
首先纠正一个关键误区:Azure SQL Server默认禁止ICMP(ping)请求,所以WSL2终端ping不通属于正常现象,无需以此判断连接失败的核心原因,重点应放在数据库连接本身的错误排查上。
以下是具体排查与解决步骤:
1. 核对Azure SQL Server防火墙规则
- 在WSL2终端执行
curl ifconfig.me获取当前设备的公网出口IP(而非WSL2内网IP,因为WSL2通过Windows主机走公网),登录Azure门户,进入目标SQL服务器的「防火墙和虚拟网络」页面,将该公网IP添加到防火墙允许列表中。 - 若本地测试连接,可临时开启「允许Azure服务和资源访问此服务器」选项,验证是否因防火墙规则导致连接失败。
2. 修复WSL2网络配置问题
WSL2默认NAT模式可能存在DNS解析或路由异常:
- 重置WSL2网络:在Windows终端执行
wsl --shutdown,重启WSL2后重新加载网络配置。 - 手动配置DNS:创建
/etc/wsl.conf文件并写入以下内容,避免WSL2自动覆盖DNS配置:
重启WSL2后,编辑[network] generateResolvConf = false/etc/resolv.conf,添加公共DNS服务器(如nameserver 8.8.8.8)。
3. 检查Flask应用连接字符串与驱动
- 确保连接字符串符合Azure SQL要求,示例格式:
注意必须设置import pyodbc server = '<你的服务器名>.database.windows.net' database = '<你的数据库名>' username = '<用户名>' password = '<密码>' driver = '{ODBC Driver 18 for SQL Server}' conn_str = f'DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;' conn = pyodbc.connect(conn_str)Encrypt=yes,Azure SQL强制加密连接。 - 在WSL2 Ubuntu中安装所需ODBC驱动:
sudo apt-get install unixodbc unixodbc-dev # 安装微软ODBC Driver 18 sudo curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - sudo curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list > /etc/apt/sources.list.d/mssql-release.list sudo apt-get update sudo ACCEPT_EULA=Y apt-get install msodbcsql18
4. 排查Windows代理与防火墙
- 若Windows开启了代理,WSL2不会自动继承代理设置,需在WSL2终端手动配置环境变量:
或临时关闭代理测试连接。export http_proxy=http://<Windows主机内网IP>:<代理端口> export https_proxy=http://<Windows主机内网IP>:<代理端口> - 确认Windows防火墙未阻止WSL2的出站请求,可临时关闭Windows Defender防火墙验证,若能正常连接,再创建允许WSL2出站到1433端口(SQL Server默认端口)的规则。
5. 测试端口连通性
在WSL2终端用nc工具测试Azure SQL的1433端口是否可达:
nc -zv <你的服务器名>.database.windows.net 1433
若返回成功提示,说明网络链路正常,问题出在应用或驱动配置;若失败,回到Azure防火墙与WSL2网络配置环节重新排查。
内容的提问来源于stack exchange,提问作者AdhityaRavi
相关产品推荐
相关产品推荐

