从WSL连接Windows本地PostgreSQL服务器失败的问题排查
解决WSL中.NET应用连接Windows上PostgreSQL的问题
问题概述
在WSL环境运行.NET应用,试图连接Windows主机上的PostgreSQL服务时遇到两类错误:
- 使用
127.0.0.1:5432连接时,提示密码验证失败(28P01),但相同凭据在Windows本地可正常连接 - 改用WSL自身的vEthernet IP连接时,出现连接超时
核心原因
- WSL的
127.0.0.1与Windows主机的127.0.0.1分属不同网络命名空间,直接用localhost连接会被PostgreSQL判定为外部非本地连接,匹配不到pg_hba.conf中针对本地的认证规则 - 错误使用了WSL自身IP而非Windows主机的vEthernet(WSL)IP,同时Windows防火墙未开放PostgreSQL端口给WSL子网
分步解决方案
1. 获取Windows主机的WSL适配器IP
打开Windows命令提示符(CMD),执行:
ipconfig
找到vEthernet (WSL)适配器的IPv4地址(例如172.19.0.1),这是WSL访问Windows服务的正确地址。
2. 配置PostgreSQL允许WSL连接
修改postgresql.conf
找到PostgreSQL安装目录下的data/postgresql.conf,修改listen_addresses为:
listen_addresses = '*'
(或指定Windows的WSL适配器IP,安全性更高)
修改pg_hba.conf
先在WSL中查看自身子网段:
ip addr show eth0 | grep inet
输出类似inet 172.19.230.81/20 brd 172.19.239.255 scope global eth0,取子网段172.19.224.0/20(根据实际输出调整),然后在pg_hba.conf末尾添加:
host all all 172.19.224.0/20 md5
(测试阶段可临时用0.0.0.0/0,生产环境不建议)
修改后重启PostgreSQL服务:
net stop postgresql-x64-16 && net start postgresql-x64-16
(替换为你的PostgreSQL版本对应的服务名)
3. 配置Windows防火墙允许WSL访问PostgreSQL
- 打开Windows Defender防火墙,进入高级设置
- 新建入站规则,规则类型选端口,指定TCP端口
5432 - 选择允许连接,应用于域、专用、公网(可根据网络环境调整)
- 命名规则(例如
PostgreSQL-WSL)并保存
4. 修正.NET应用连接字符串
将连接字符串中的服务器地址改为步骤1获取的Windows WSL适配器IP,示例:
"ConnectionStrings": { "DefaultConnection": "Host=172.19.0.1;Port=5432;Database=<Database_Name>;Username=<Username>;Password=<Password>;" }
额外排查点
- 确认PostgreSQL用户密码正确,且该用户拥有目标数据库的访问权限
- 检查WSL中是否有防火墙规则阻止出站连接(默认无此限制)
- 若仍提示密码错误,可临时将pg_hba.conf中的规则改为
trust测试(测试后务必改回md5,避免安全风险)
内容的提问来源于stack exchange,提问作者Areg_1405
相关产品推荐
相关产品推荐

