WSL2动态分配IP地址给Windows主机,而这些IP地址可以在不重启Windows的情况下发生变化(请参见下面的注释)。因此,要可靠地连接,我们需要:
- 允许Windows和Postgres接受来自WSL2 IP地址范围的连接(默认情况下不允许)
- 从WSL2中,当通过
psql
连接时确定Windows/Postgresql主机的IP地址(该地址是动态的)。我们将通过.bashrc
和alias
使其方便。
不幸的是,我找不到WSL2 IP地址范围的确切规范。从几次测试/重启中,看起来WSL2主要在172.*.*.*
的范围内分配IP地址,但我偶尔被分配了192.*.*.*
,因此在配置防火墙和Postgres时,我们将使用这些地址范围。
为WSL2 IP地址添加Windows防火墙入站端口规则:
- 打开
Windows Defender高级安全性防火墙
- 点击
新建规则...
- 选择端口作为规则类型
- 选择TCP,对于
特定本地端口
输入5432
- 选择
允许连接
。从WSL2连接不会安全,因此不要选择安全选项
- 至少选择
公用网络
。也可以选择 域网络
和 专用网络
。只有选了 公用网络
,我才能连接成功
- 命名规则,例如
Postgres - connect from WSL2
,并创建它
- 右键新创建的规则,选择
属性
,然后点击 范围
选项卡
- 在
远程IP地址
下,选择 这些IP地址
,然后点击 添加...
,并输入范围172.0.0.1
到172.254.254.254
- 重复步骤9,为IP地址范围
192.0.0.1
到192.254.254.254
添加规则
- 点击
应用
然后 确定
- 确保规则已启用
配置Postgres接受来自WSL2 IP地址的连接
假设Postgresql默认安装/设置在Windows上,以下文件位于 C:\Program Files\PostgresSQL\$VERSION\data
目录下
验证postgresql.conf
是否有以下设置:
listen_addresses = '*'
这应该已经设置为'*'
,所以这里不需要进行任何操作。
更新pg_hba.conf
以允许来自WSL2范围的连接,例如对于PostgreSQL 12:
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
如果使用Postgresql 13+,应该使用scram-sha-256
作为方法。
重启Postgres使更改生效。这可以通过Windows Services
应用程序或以管理员特权从cmd
中完成,例如对于Postgresql 12:
net stop postgresql-x64-12
net start postgresql-x64-12
WSL Shell Conveniences
在WSL中,将以下内容添加到您的~/.bashrc
或类似文件中:
if ! $(cat /etc/hosts | grep -q 'winhost'); then
echo 'Adding DNS entry for Windows host in /etc/hosts'
echo '\n# Windows host - added via ~/.bashhrc' | sudo tee -a /etc/hosts
echo -e "$(grep nameserver /etc/resolv.conf | awk '{print $2, " winhost"}')" | sudo tee -a /etc/hosts
fi
然后重新加载您的 .bashrc
更改: source ~/.bashrc
用法
psql -h winhost -p 5432 -U postgres
注意:
- WSL2分配给Windows主机的IP地址与网络中物理Windows计算机分配的IP地址不同。WSL2使用
vEthernet
连接。
- 您可以通过
控制面板\网络和 Internet\网络连接
检查vEthernet
连接。
- 请注意,查看IPv4属性时,IP地址将显示为静态设置,但实际上并非如此!尝试重新启动计算机,再次检查IPv4属性。
- 如果有一天无法连接到Postgres,请检查防火墙规则中
winhost
是否在IP地址范围内。可能是WSL分配了我们没有预期的IP地址!