如何连接到谷歌计算引擎上的远程 PostgreSQL 服务器?

Posted

技术标签:

【中文标题】如何连接到谷歌计算引擎上的远程 PostgreSQL 服务器?【英文标题】:How to connect to remote PostgreSQL server on google compute engine? 【发布时间】:2018-05-27 11:00:01 【问题描述】:

我已经在谷歌云上安装了一个 PostgreSQL,我希望能够使用 pg-admin 从我的电脑远程访问它。

当我尝试连接到我的实例时确实收到以下错误:

无法连接到服务器:

无法连接到服务器:连接被拒绝 (0x0000274D/10061) 是 在主机“[我的 VM 实例的外部 IP]”上运行的服务器和 接受端口 5432 上的 TCP/IP 连接?

我认为这可能是因为谷歌云防火墙阻止了我(也许!),我为我的实例指定了以下防火墙,我使用我的 IP 地址来定义源过滤器:

我是否因为仍然无法访问而遗漏了什么,有人可以帮助我吗?有人知道吗?

【问题讨论】:

你在什么上安装了 postgres 服务器?云 SQL?计算实例?在 Kubernetes 集群中? @DriesDeRydt 我按照本教程进行操作,并且完全按照这里提到的内容进行操作:cloud.google.com/community/tutorials/…! 看起来像是白​​名单问题。你确定你更新了 pg_hba.conf 并重启了服务? @DriesDeRydt 是的,我做到了,我可以把我的 pg_hba.cong 放在这里吗? 不确定。在我看来,可能是 hba_conf 中的 ip 错误,或者防火墙规则在错误的 ip 上。如果不是这样,恐怕我也不知道。 【参考方案1】:

PostgreSQL must also be configured to allow remote connections,否则连接请求将失败,即使所有防火墙规则都正确且 PostgreSQL 服务器正在侦听正确的端口。

步骤

大纲

无法创建链接,但这是一个相当长的答案,所以这可能会有所帮助。

    在任何步骤中检查端口的工具 0.1 ncnetcat 0.2 nmap 0.3 netstat 0.4lsof IP 地址 1.1 您的盒子的公共 IP 地址(PC、VM、笔记本电脑等) 1.2 GCE实例的IP地址 防火墙规则 2.1 检查现有 2.2 添加新的防火墙规则 配置 PostgreSQL 以接受远程连接 3.1 查找上述配置文件 3.2 postgresql.conf 3.3pg_hba.conf

0。在任何步骤中检查端口的工具

0.1 ncnetcat

$ nc -zv 4.3.2.1 5432

在哪里

 -v      Produce more verbose output.

 -z      Only scan for listening daemons, without sending any data to
         them.  Cannot be used together with -l.

可能的结果:

Connection to 4.3.2.1port [tcp/postgresql] succeeded!

是的。

nc: connect to 4.3.2.1 port 8000 (tcp) failed: Connection refused

端口被防火墙打开,但服务没有监听或拒绝连接。

命令只是挂起

防火墙正在阻止。

0.2 nmap

$ nmap 4.3.2.1

Starting Nmap 7.70 ( https://nmap.org ) at 2019-09-09 18:28 PDT
Nmap scan report for 1.2.3.4.bc.googleusercontent.com (4.3.2.1)
Host is up (0.12s latency).
Not shown: 993 filtered ports
PORT     STATE  SERVICE
22/tcp   open   ssh
80/tcp   closed http
443/tcp  closed https
3389/tcp closed ms-wbt-server
4000/tcp closed remoteanything
5432/tcp open   postgresql      # firewall open, service up and listening
8000/tcp closed http-alt        # firewall open, is service up or listening?

0.3 netstat

$ netstat -tuplen

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name    
tcp        0      0 0.0.0.0:4000            0.0.0.0:*               LISTEN      1000       4223185    29432/beam.smp      
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      1000       4020942    15020/postgres      
tcp        0      0 127.0.0.1:5433          0.0.0.0:*               LISTEN      1000       3246566    20553/postgres      
tcp6       0      0 ::1:5432                :::*                    LISTEN      1000       4020941    15020/postgres      
tcp6       0      0 ::1:5433                :::*                    LISTEN      1000       3246565    20553/postgres      
udp        0      0 224.0.0.251:5353        0.0.0.0:*                           1000       4624644    6311/chrome --type= 
udp        0      0 224.0.0.251:5353        0.0.0.0:*                           1000       4624643    6311/chrome --type= 
udp        0      0 224.0.0.251:5353        0.0.0.0:*                           1000       4625649    6230/chrome         
udp        0      0 0.0.0.0:68              0.0.0.0:*                           0          20911      -                   
udp6       0      0 :::546                  :::*                                0          4621237    -                   

在哪里

-t | --tcp

-u | --udp

-p, --program
    Show the PID and name of the program to which each socket belongs.

-l, --listening
    Show only listening sockets.  (These are omitted by default.)

-e, --extend
    Display additional information.  Use  this  option  twice  for  maximum
    detail.

--numeric, -n
    Show numerical addresses instead of trying to determine symbolic  host,
    port or user names.

当在运行 PostgreSQL 的实例上发出时,您没有看到下面的行,这意味着 PostgreSQL 没有配置为远程连接:

tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      1001       238400     30826/postgres
tcp6       0      0 :::5432                 :::*                    LISTEN      1001       238401     30826/postgres  

0.4 lsof

检查实例服务是否正在运行。

$ sudo lsof -i -P -n | grep LISTEN

 systemd-r   457 systemd-resolve   13u  IPv4  14870      0t0  TCP 127.0.0.53:53 (LISTEN)
 sshd        733            root    3u  IPv4  19233      0t0  TCP *:22 (LISTEN)
 sshd        733            root    4u  IPv6  19244      0t0  TCP *:22 (LISTEN)
 postgres   2733        postgres    3u  IPv4  23655      0t0  TCP 127.0.0.1:5432 (LISTEN)
 python3   26083        a_user      4u  IPv4 392307      0t0  TCP *:8000 (LISTEN)

1。 IP 地址

要从您的终端进行连接,您需要您的盒子的公共 IP 地址以及 Google Compute Engine (GCE) 实例的公共 IP 地址。

1.1 盒子的公共 IP 地址(PC、VM、笔记本电脑等)

(来自this article。)

$ dig +short myip.opendns.com @resolver1.opendns.com
4.3.2.1

1.2 GCE实例的IP地址

$ gcloud compute instances list

NAME         ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
access-news  us-east1-d  n1-standard-2               10.142.0.5   34.73.156.19    RUNNING
lynx-dev     us-east1-d  n1-standard-1               10.142.0.2   35.231.66.229   RUNNING
tr2          us-east1-d  n1-standard-1               10.142.0.3   35.196.195.199  RUNNING

如果您还需要实例的network-tags

$ gcloud compute instances list  --format='table(name,status,tags.list())'
NAME         STATUS   TAGS
access-news  RUNNING  fingerprint=mdTPd8rXoQM=,items=[u'access-news', u'http-server', u'https-server']
lynx-dev     RUNNING  fingerprint=CpSmrCTD0LE=,items=[u'http-server', u'https-server', u'lynx-dev']
tr2          RUNNING  fingerprint=84JxACwWD7U=,items=[u'http-server', u'https-server', u'tr2']

2。防火墙规则

仅处理以下 GCE 防火墙规则,但请确保 iptables 不会无意中阻止流量。

另见

"Firewall rules overview" (official docs) GCE firewall rules vs. iptables Summary of GCE firewall terms Behaviour of GCE firewall rules on instances (external vs internal IP addresses)

2.1 检查现有

$ gcloud compute firewall-rules list

NAME                      NETWORK  DIRECTION  PRIORITY  ALLOW                         DENY  DISABLED
default-allow-http        default  INGRESS    1000      tcp:80                              False
default-allow-https       default  INGRESS    1000      tcp:443                             False
default-allow-icmp        default  INGRESS    65534     icmp                                False
default-allow-internal    default  INGRESS    65534     tcp:0-65535,udp:0-65535,icmp        False
default-allow-rdp         default  INGRESS    65534     tcp:3389                            False
default-allow-ssh         default  INGRESS    65534     tcp:22                              False
pg-from-tag1-to-tag2      default  INGRESS    1000      tcp:5432                            False

To show all fields of the firewall, please show in JSON format: --format=json
To show all fields in table format, please see the examples in --help.

包含网络标签的更全面的列表(来自gcloud compute firewall-rules list --help):

$ gcloud compute firewall-rules list --format="table(     \
      name,                                               \
      network,                                            \
      direction,                                          \
      priority,                                           \
      sourceRanges.list():label=SRC_RANGES,               \
      destinationRanges.list():label=DEST_RANGES,         \
      allowed[].map().firewall_rule().list():label=ALLOW, \
      denied[].map().firewall_rule().list():label=DENY,   \
      sourceTags.list():label=SRC_TAGS,                   \
      sourceServiceAccounts.list():label=SRC_SVC_ACCT,    \
      targetTags.list():label=TARGET_TAGS,                \
      targetServiceAccounts.list():label=TARGET_SVC_ACCT, \
      disabled                                            \
  )"

NAME                      NETWORK  DIRECTION  PRIORITY  SRC_RANGES    DEST_RANGES  ALLOW                         DENY  SRC_TAGS  SRC_SVC_ACCT  TARGET_TAGS   TARGET_SVC_ACCT  DISABLED
default-allow-http        default  INGRESS    1000      0.0.0.0/0                  tcp:80                                                      http-server                    False
default-allow-https       default  INGRESS    1000      0.0.0.0/0                  tcp:443                                                     https-server                   False
default-allow-icmp        default  INGRESS    65534     0.0.0.0/0                  icmp                                                                                       False
default-allow-internal    default  INGRESS    65534     10.128.0.0/9               tcp:0-65535,udp:0-65535,icmp                                                               False
default-allow-rdp         default  INGRESS    65534     0.0.0.0/0                  tcp:3389                                                                                   False
default-allow-ssh         default  INGRESS    65534     0.0.0.0/0                  tcp:22                                                                                     False
pg-from-tag1-to-tag2      default  INGRESS    1000      4.3.2.1                    tcp:5432                            tag1                    tag2                           False

2.2 添加新的防火墙规则

要打开从每个源到每个实例的默认 PostgreSQL 端口 (5432):

$ gcloud compute firewall-rules create \
    postgres-all                       \
    --network default                  \
    --priority 1000                    \
    --direction ingress                \
    --action allow                     \
    --rules tcp:5432                   \

在您的计算机(来源:YOUR_IP)和 GCE 实例(目标:INSTANCE_IP)之间限制它:

$ gcloud compute firewall-rules create \
    postgres-from-you-to-instance      \
    --network default                  \
    --priority 1000                    \
    --direction ingress                \
    --action allow                     \
    --rules tcp:5432                   \
    --destination-ranges INSTANCES_IP  \
    --source-ranges YOUR_IP            \

除了--source-ranges--destination-ranges,还可以使用源和目标网络标签或服务帐户。请参阅"Source or destination" section in the firewall docs。

3。配置 PostgreSQL 以接受远程连接

这是对Neeraj Singh 的post 的更新。

默认情况下,PostgreSQL 被配置为绑定到“localhost”,因此需要更新以下配置文件:

    postgresql.conf,和

    pg_hba.conf

3.1 找到上面的配置文件

这两个文件的位置可以从 PostgreSQL 本身查询(技巧取自this *** thread):

$ sudo -u postgres psql -c "SHOW hba_file" -c "SHOW config_file"

3.2postgresql.conf

配置文件附带有用的提示,以使其正常工作:

listen_addresses = 'localhost'          # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)

对于快速而肮脏的解决方案,只需将其更改为

listen_addresses = '*'

重启服务器(见here如何)。一旦 PostgreSQL 重新启动,它将开始侦听所有 IP 地址(请参阅netstat -tuplen)。

重启 PostgreSQL:

$ sudo systemctl restart postgresql@11-main

# or

$ pg_ctl restart

listen_addresses 文档说它“指定服务器用于侦听来自客户端应用程序的连接的 TCP/IP 地址。”,仅此而已。它指定了接收数据包的套接字,但是如果传入的连接没有经过身份验证(通过pg_hba.conf 配置),那么无论如何数据包都将被拒绝(丢弃?)。

3.3 pg_hba.conf

来自20.1. The pg_hba.conf File:“客户端身份验证由配置文件控制,该文件传统上命名为pg_hba.conf,并存储在数据库集群的数据目录中。(HBA 代表基于主机的身份验证。) em>"

这是一个复杂的话题,因此阅读文档至关重要,但这足以在可信网络上进行开发:

host    all   all   0.0.0.0/0   trust
host    all   all   ::/0        trust

此时需要再次重启。

【讨论】:

【参考方案2】:

我按照1 上的教程进行操作,我可以从一台机器远程连接到另一台机器。我可以通过错过配置防火墙规则来重现您的情况。您已使用标签设置防火墙规则。该标签也需要在虚拟机上。如果您使用标签创建防火墙规则,则该标签需要打开(在我的情况下,标签的标签名称是 postgre-5432)网络标签:

您可以在 VM 实例部分编辑您的 Compute Engine 实例。

在这种情况下,标签用于在同一网络中为特定机器设置防火墙规则。

这是我的入口流量防火墙规则的定义。这是运行 postgresql 服务器的计算引擎实例在网络标签部分配置的标签:

在源 IP 范围中,您需要将要连接的计算机的公共 IP 地址放置到运行 postgresql 服务器的计算机,因为这是入口防火墙规则。 使用该 ip 作为源 ip,您不应该有任何标签问题。我鼓励您使用标签,因为一切都会更加安全。

您可以在此地址中查看本地连接的 PUBLIC IP: http://ip4.me/

然后在您提到的配置文件中,您需要放置连接的公共 IP。此 IP 必须与您在入口防火墙规则中使用的 IP 相同。

sudo nano /etc/postgresql/9.5/main/pg_hba.conf: 托管所有所有 PUBLIC_IP/32 md5

这里你需要为listen_addresses设置*,因为*表示任何地址。无论如何,您正在控制 pg_hba.conf 中能够连接到您的实例的 ip:

sudo nano /etc/postgresql/9.5/main/postgresql.conf listen_addresses = '*' # 要监听的 IP 地址;

pgAdmin:

这里可以看到如何在ubuntu上安装pgAdmin4 2 在这里,您可以看到如何从命令行连接到 postgres。 [3

为了能够从 pgAdmin4 连接到您的 postgres 远程实例,您需要将主机名/地址设置为运行您的 postgresql 服务器的计算引擎实例 Ip。如果你按照这里的教程1 你应该也有一个名为 postgres 的默认数据库。

希望这会有所帮助!

1https://cloud.google.com/community/tutorials/setting-up-postgres#creating-a-compute-engine-instance

2https://askubuntu.com/questions/831262/how-to-install-pgadmin-4-in-desktop-mode-on-ubuntu

3https://www.postgresql.org/message-id/001f01c018c2$830133b0$64898cd5%40northlink.gr


【讨论】:

非常感谢,我会尽快调查。非常感谢,希望对我有帮助!

以上是关于如何连接到谷歌计算引擎上的远程 PostgreSQL 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有秘密管理器的谷歌应用引擎连接到 Postgres?

SFTP 到谷歌计算引擎

如何将java套接字连接到远程服务器套接字

如何通过 JMX 远程连接到 Dataproc 上的 Spark 工作器

如何使用 ssh 隧道将谷歌数据工作室连接到 AWS 上的 postgres 无服务器?

连接到远程服务器上的 docker 中运行的 jupyter notebook