【问题标题】:How to connect to remote PostgreSQL server on google compute engine?如何连接到谷歌计算引擎上的远程 PostgreSQL 服务器?
【发布时间】: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 上。如果不是这样,恐怕我也不知道。

标签: postgresql google-compute-engine


【解决方案1】:

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

步骤

大纲

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

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

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

0.1 nc 或 netcat

$ 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 不会无意中阻止流量。

另见

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”,因此需要更新以下配置文件:

  1. postgresql.conf,和

  2. pg_hba.conf

3.1 找到上面的配置文件

这两个文件的位置可以从 PostgreSQL 本身查询(技巧取自this Stackoverflow 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


    【讨论】:

    • 非常感谢,我会尽快调查。非常感谢,希望对我有帮助!
    猜你喜欢
    • 2014-08-21
    • 2016-08-14
    • 1970-01-01
    • 2015-12-25
    • 2017-02-09
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多