WSL2连接Windows11宿主系统中的数据库需要解决的端口问题
WSL中的Ubuntu如果要访问宿主系统windows 11的Postgresql数据库需要将防火墙的入口规则打开,并且还需要正确配置postgresql配置文件中的listen_addresses
端口。
否则会得到这样的错误提示:
[ECONNREFUSED] connect ECONNREFUSED 127.0.0.1:5432 Please try again
如果是MongoDB则需要修改文件X:\Program Files\MongoDB\Server\4.1\bin\mongod.cfg
中的bindIp
参数为0.0.0.0
# network interfaces net: port: 27017 bindIp: 127.0.0.1
TIP:数据库配置文件修改后一定要重启服务方可生效。
需要注意的是在WSL中数据库连接主机的IP不要用localhost
/127.0.0.1
,而是宿主系统通过ipconfig
查询到的Ethernet adapter vEthernet (WSL) IP
地址。
Ethernet adapter vEthernet (WSL): Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::62d6:6508:7351:bd03%59 IPv4 Address. . . . . . . . . . . : 172.24.80.1 Subnet Mask . . . . . . . . . . . : 255.255.240.0 Default Gateway . . . . . . . . . :
也可以在WSL系统中使用ip route
查询
ip route default via 172.24.80.1 dev eth0 proto kernel 172.24.80.0/20 dev eth0 proto kernel scope link src 172.24.82.254
或cat /etc/resolv.conf
nameserver 172.24.80.1
用telnet命令检测WSL和宿主电脑端口的通信连接状态
在拿到正确的IP地址之后我们可以在wsl中使用telnet
来检查IP和端口的连接情况,如果是connected to...表示无问题,否则一定要按照下面的方法来诊断排查
telnet 172.24.80.1 5432 Trying 172.24.80.1... Connected to 172.24.80.1. Escape character is '^]'.
一 设置宿主防火墙规则
从系统搜索框中搜索“Windows Defender Firewall with Advanced Security
”,选择左侧"Inbound Rules
",然后选择右侧“New Rule
”
依次选择Port
选择TCP和端口
选择Allow the connection
这里根据实际情况来,至少要选择一个Public
最后输入规则名称完成添加。
配置授权IP访问范围
在列表中右键刚刚保存的规则,点击“Properties
”,找到“Scope
”,在“Remote IP address
”中添加两条规则
- from 172.0.0.1 to 172.254.254.254
- from 192.0.0.1 to 192.254.254.254
最后完成即可。
二 Postgresql配置
打开postgresql安装目录下的data
目录, 打开postgresql.conf
文件找到listen_addresses
,如果后面的参数是localhost
则修改为*
listen_addresses = '*'
修改pg_hba.conf
文件,允许来自WSL2的连接
# TYPE DATABASE USER ADDRESS METHOD # IPv4 local connections: host all all 127.0.0.1/32 md5 host all all 172.0.0.0/8 md5 host all all 192.0.0.0/8 md5
最后重启服务
net stop postgresql-x64-12 net start postgresql-x64-12
三 其它可能引发的问题
1. Windows 升级导致保留tcp端口问题
要查看动态端口设置是否不正确,可以运行:
netsh int ipv4 show dynamicport tcp
如果您看到Start Port: 1025
,则动态端口范围配置错误。要修复它,您需要将其设置为更合理的范围 - 避免 <10k 端口。(这通常是开发人员放置自己的应用程序的地方)
将其设置为推荐范围:(如果您的问题与 ipv6 有关,则相应地调整命令)
netsh int ipv4 set dynamic tcp start=49152 num=16384
参考:https://stackoverflow.com/a/62359555/2441655
2. IP Helper服务引起的问题
在这里我看到了因为IP Helper服务引起的问题,解决方法很简单关闭服务即可。
3. 端口被WSL内部占用
在这里还出现了用wsl --shutdown {name}
命令关闭WSL,重新启动服务成功的情况。
最后修改配置后不要忘记重启一下电脑。