通过 Unix 套接字将 DBeaver 连接到远程 PostgreSQL 数据库
Connecting DBeaver to remote PostgreSQL DB via Unix socket
我最近在 Windows PC 上安装了 https://dbeaver.io/,并希望从它访问远程 Linux 服务器上的数据库。
我的 Linux 用户名是 my_username 我还有一个系统用户 psql_user。我还有两个现有的 PostgreSQL 数据库,它们的名称与其各自的用户相同。通常,只有 psql_user 被使用并被 php-fpm 池访问,监听 Unix 套接字和 运行 作为用户 psql_user,因此配置了 /var/lib/pgsql/12/data/pg_hba.conf
为:
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host all all 127.0.0.1/32 ident
host all all ::1/128 ident
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
通过上面的配置,ssh到服务器后,我可以通过执行psql
访问my_username数据库,也可以通过执行[=访问psql_user数据库13=] 并且两者都不需要使用密码。
但是现在,如何从远程 Windows PC 连接?
为了尝试这样做,我首先在 Windows PC 上为 my_username 和 psql_user 创建了没有密码的 ssh 密钥,并为每个密钥添加了 public 密钥Linux 用户的 authorized_keys(必须手动创建 /home/psql_user/
,因为它是系统用户)。我可以使用 ssh 密钥成功地将 PuTTY 连接到服务器。
接下来,在 DBeaver 连接设置 SSH 选项卡上,我选中“使用 SSH 隧道”,输入用户名和私钥位置,Test tunnel configuration
成功显示与客户端版本连接为 SSH-2.0-JSCH -01.54 和服务器版本为 SSH-2.0-OpenSSH_7.4。我也没有对此选项卡的高级部分(例如本地和远程主机和端口)进行任何更改,并且还保留了“您可以在 SSH 参数中使用变量”的默认值。
在主选项卡中使用我的服务器 IP,身份验证“数据库本机”,并将密码留空,我测试了连接,但得到 The connection attempt failed.
系统日志报告与端口 5432 上的 IP 的连接失败,这是有道理的因为我是使用 Unix 套接字设置的。
所以,然后我将主选项卡上的服务器 IP 更改为 127.0.0.1(或本地主机),然后重试但得到 FATAL: Ident authentication failed for user "my_username"
。好的,近一点,但还不够。
我想这可能是因为 DBeaver 正在通过端口,所以我尝试通过进入“编辑驱动程序”选项卡并将 jdbc:postgresql://{host}[:{port}]/[{database}]
更改为 jdbc:postgresql://{host}/[{database}]
来禁用这部分,但现在得到 Connection to 127.0.0.1:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections
.
不确定下一步要去哪里。当我将 PuTTY 放入 Linux 机器时,一切都很好,但使用 DBeaver 远程连接时却不是这样,我认为如果我使用 SSH 将 DBeaver 连接到服务器,情况也会一样。如何实现?
虽然我认为 ssh 隧道可以设置为连接到 unix 套接字而不是端口,但我认为 dbeaver 没有提供这样做的方法,因此您必须单独设置它。
尽管如果您的服务器运行 identd 服务,ident 也应该可以工作。我认为大多数 linux 默认情况下不会这样做,但只需 apt install oidentd
或你的包管理器上的任何等价物应该解决这个问题。
更简单的解决方案是将方法从 ident 更改为 md5 或 scram,并分配一个密码(dbeaver 提供记忆)。
正如另一个答案中所指出的,DBeaver 的 SSH 隧道选项目前不支持套接字。它始终基于 TCP 端口,因此只能使用 pg_hba.conf 中的 host
选项建立连接(我在 DBeaver 中放置了一个 feature request 用于 SSH 套接字转发)。
以下是设置将本地 TCP 端口转发到远程 Unix 套接字的方法。这允许您在 Unix 套接字上使用 peer
身份验证,因此您不必为 PostgreSQL 角色提供密码:
ssh username@dbserver.example.com -L 5555:/var/run/postgresql/.s.PGSQL.5432 -fN
我最近在 Windows PC 上安装了 https://dbeaver.io/,并希望从它访问远程 Linux 服务器上的数据库。
我的 Linux 用户名是 my_username 我还有一个系统用户 psql_user。我还有两个现有的 PostgreSQL 数据库,它们的名称与其各自的用户相同。通常,只有 psql_user 被使用并被 php-fpm 池访问,监听 Unix 套接字和 运行 作为用户 psql_user,因此配置了 /var/lib/pgsql/12/data/pg_hba.conf
为:
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host all all 127.0.0.1/32 ident
host all all ::1/128 ident
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
通过上面的配置,ssh到服务器后,我可以通过执行psql
访问my_username数据库,也可以通过执行[=访问psql_user数据库13=] 并且两者都不需要使用密码。
但是现在,如何从远程 Windows PC 连接?
为了尝试这样做,我首先在 Windows PC 上为 my_username 和 psql_user 创建了没有密码的 ssh 密钥,并为每个密钥添加了 public 密钥Linux 用户的 authorized_keys(必须手动创建 /home/psql_user/
,因为它是系统用户)。我可以使用 ssh 密钥成功地将 PuTTY 连接到服务器。
接下来,在 DBeaver 连接设置 SSH 选项卡上,我选中“使用 SSH 隧道”,输入用户名和私钥位置,Test tunnel configuration
成功显示与客户端版本连接为 SSH-2.0-JSCH -01.54 和服务器版本为 SSH-2.0-OpenSSH_7.4。我也没有对此选项卡的高级部分(例如本地和远程主机和端口)进行任何更改,并且还保留了“您可以在 SSH 参数中使用变量”的默认值。
在主选项卡中使用我的服务器 IP,身份验证“数据库本机”,并将密码留空,我测试了连接,但得到 The connection attempt failed.
系统日志报告与端口 5432 上的 IP 的连接失败,这是有道理的因为我是使用 Unix 套接字设置的。
所以,然后我将主选项卡上的服务器 IP 更改为 127.0.0.1(或本地主机),然后重试但得到 FATAL: Ident authentication failed for user "my_username"
。好的,近一点,但还不够。
我想这可能是因为 DBeaver 正在通过端口,所以我尝试通过进入“编辑驱动程序”选项卡并将 jdbc:postgresql://{host}[:{port}]/[{database}]
更改为 jdbc:postgresql://{host}/[{database}]
来禁用这部分,但现在得到 Connection to 127.0.0.1:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections
.
不确定下一步要去哪里。当我将 PuTTY 放入 Linux 机器时,一切都很好,但使用 DBeaver 远程连接时却不是这样,我认为如果我使用 SSH 将 DBeaver 连接到服务器,情况也会一样。如何实现?
虽然我认为 ssh 隧道可以设置为连接到 unix 套接字而不是端口,但我认为 dbeaver 没有提供这样做的方法,因此您必须单独设置它。
尽管如果您的服务器运行 identd 服务,ident 也应该可以工作。我认为大多数 linux 默认情况下不会这样做,但只需 apt install oidentd
或你的包管理器上的任何等价物应该解决这个问题。
更简单的解决方案是将方法从 ident 更改为 md5 或 scram,并分配一个密码(dbeaver 提供记忆)。
正如另一个答案中所指出的,DBeaver 的 SSH 隧道选项目前不支持套接字。它始终基于 TCP 端口,因此只能使用 pg_hba.conf 中的 host
选项建立连接(我在 DBeaver 中放置了一个 feature request 用于 SSH 套接字转发)。
以下是设置将本地 TCP 端口转发到远程 Unix 套接字的方法。这允许您在 Unix 套接字上使用 peer
身份验证,因此您不必为 PostgreSQL 角色提供密码:
ssh username@dbserver.example.com -L 5555:/var/run/postgresql/.s.PGSQL.5432 -fN