从单独的设备连接到托管在适用于 Linux 的 Windows 子系统中的 Postgres 数据库

从单独的设备连接到托管在适用于 Linux 的 Windows 子系统中的 Postgres 数据库

我有两台设备:

  • 主机:Windows 设备,我已在其上安装适用于 Linux 的 Windows 子系统
  • 客户端:Linux 设备。

然后我采取了以下步骤。

  1. 我已经安装Postgres在 HOST 子系统内。
  2. 我已经在 HOST 上创建了一个数据库,其中包含一些测试数据。
  3. 我已经使用脚本使该数据库可以远程访问。(见下文。)
  4. 我已经在客户端安装了 PG Admin 4。
  5. 我尝试使用 PG Admin 和主机设备的常用 IP 地址连接到 CLIENT 上的数据库。这给了我错误:failed: FATAL: role "postgis_user" does not exist。(字符串postgis_user是与相关数据库相对应的用户名。)
  6. 我也尝试过连接其他 IP 地址,比如 HOST 响应命令时吐出的 IP 地址wsl hostname -i。对于我尝试过的每个地址,PG Admin 都会给出超时错误。

其他一些注意事项:

  • 如果我尝试步骤 1-5,但使用两个 Linux 设备,我就可以连接。
  • 我已通过运行确保 PostgreSQL 服务在 HOST 子系统上启动sudo service postgresql start
  • 我正在运行 WSL2,我的 Linux 发行版是 Ubuntu(在子系统和客户端上)。

你知道我哪里做错了吗?


我用来创建数据库的脚本远程访问

PG_HBA_CONF_STRING_TO_ADD="host all all 0.0.0.0/0 md5"
PG_CONF_STRING_TO_ADD="# Allow remote connections.\n listen_addresses = '*'"

path_to_pg_hba_conf="/etc/postgresql/$pgres_version/main/pg_hba.conf"
path_to_pg_conf="/etc/postgresql/$pgres_version/main/postgresql.conf"

if ! sudo grep -q "$PG_HBA_CONF_STRING_TO_ADD" $path_to_pg_hba_conf; then
    echo $PG_HBA_CONF_STRING_TO_ADD | sudo tee -a $path_to_pg_hba_conf
fi
if ! sudo grep -q "$PG_CONF_STRING_TO_ADD" $path_to_pg_conf; then
    echo $PG_CONF_STRING_TO_ADD | sudo tee -a $path_to_pg_conf
fi

答案1

虽然我无法说明是否需要任何额外的 Postgres 配置,但核心问题是 WSL2 在 Hyper-V 内部的虚拟网络下运行,该虚拟网络在 Windows 主机本身后面进行 NAT。默认情况下,网络上的其他设备无法看到 WSL2。

只需在 WSL 中运行以下命令即可轻松看到这一点:

python3 -m http.server

您将能够http://localhost:8000从 Windows 浏览器访问,但无法从 Linux 客户端计算机访问。

对此有多种解决方案,但最简单的方法通常是在 WSL1 下运行。据我所知,Postgres 可以在 WSL1 中正常运行,并且那里的网络配置允许从网络上的其他设备进行访问,因为 WSL1 网络适配器未虚拟化(它使用系统调用转换来提供对 Windows 主机网络的直接访问)。

如果你确实需要或更喜欢以 WSL2 运行,可以在以下位置详细找到其他替代方案这个问题。我当然偏向于我的ssh反向隧道答案(我今天刚发布)。但netsh转发选项也同样有效。

看起来需要转发的 Postgres 端口是 5432。

再次强调,可能需要更多 Postgres 配置。我从经验中知道,MySQL 需要为“远程”用户和本地用户提供不同的用户配置,但我使用 Postgres 的时间太长了,记不清那里是否也是如此。无论如何,我希望一旦你解决了“网络”问题,剩下的问题你就能处理了。

相关内容