Windows 11下WSL2通过PyODBC连接SQL Server(需AnyConnect VPN)报错
解决WSL2下AnyConnect VPN连接SQL Server超时问题
问题背景
SQL连接代码在Windows 11系统可正常运行,但在同一设备的WSL2环境执行时出现登录超时错误:
连接代码:
conn=pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};' 'Server=servername, 1433;' 'Database=database;' 'Trusted_Connection=yes;')
错误信息:
('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
连接数据库需通过AnyConnect VPN,已按相关方法更新resolv.conf,但问题未解决。
排查与解决步骤
1. 验证WSL2与VPN服务器的连通性
- 在Windows终端执行
ping servername,获取数据库服务器的真实IP - 在WSL2终端执行
ping <获取到的服务器IP>:- 若不通,说明VPN路由未同步到WSL2:
- Windows管理员命令提示符执行
route print,找到VPN对应的内网网段路由条目 - WSL2内执行
sudo ip route add <内网网段> via <WSL2网关IP>(网关IP可通过ip route show default获取,通常为172.x.x.1)
- Windows管理员命令提示符执行
- 若不通,说明VPN路由未同步到WSL2:
2. 确保WSL2 DNS解析稳定生效
- WSL2内执行
nslookup servername,检查是否能解析到正确IP:- 若解析失败,手动指定VPN DNS服务器:
- 编辑
/etc/resolv.conf,添加nameserver <VPN提供的DNS服务器IP> - 创建
/etc/wsl.conf文件并写入以下内容,防止resolv.conf被自动重置:[network] generateResolvConf = false - Windows命令提示符执行
wsl --shutdown,重启WSL2后再测试
- 编辑
- 若解析失败,手动指定VPN DNS服务器:
3. 配置WSL2下的Kerberos认证(针对Trusted_Connection)
WSL2的Trusted_Connection=yes依赖Kerberos,需完成以下配置:
- 安装krb5工具:
sudo apt-get install krb5-user - 编辑
/etc/krb5.conf,添加域信息(替换为你的实际域名和KDC服务器):[realms] YOUR_DOMAIN.COM = { kdc = YOUR_DOMAIN_KDC_SERVER default_domain = YOUR_DOMAIN.COM } - 执行
kinit your_username@YOUR_DOMAIN.COM,输入域密码后再运行SQL连接代码
4. 绕过DNS直接用IP连接
修改连接字符串,用服务器IP替换servername,排除DNS解析问题:
conn=pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};' 'Server=<服务器IP>, 1433;' 'Database=database;' 'Trusted_Connection=yes;')
5. 检查防火墙规则
- 临时关闭Windows防火墙测试连接,若能成功,需添加允许WSL2访问1433端口的防火墙规则
内容的提问来源于stack exchange,提问作者DeadJoker
相关产品推荐
相关产品推荐

