CentOS 6 和 PostgreSQL - 无法连接到端口

CentOS 6 和 PostgreSQL - 无法连接到端口

解决方案:事实证明,iptables 的顺序很重要。第五条INPUT规则是REJECT all ...排除ACCEPT规则的规则。所以我不得不习惯iptables -I INPUT 5 ...将规则添加到第五位,在规则之前。一个重要的细节:记得先REJECT执行- 如果你忘记了保存,它不会记住新的顺序,你必须再次执行。service iptables saveservice iptables restart

我在 CentOS 6 虚拟机上安装了 PostgreSQL。我可以从 VM 主机顺利通过 SSH 连接到该机器。但是,我无法连接到我的 PostgreSQL 安装。

一些有用的输出:

[root@localhost data]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:postgres 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         


[root@localhost data]# ps -u postgres
  PID TTY          TIME CMD
 1866 ?        00:00:00 postmaster
 1868 ?        00:00:00 postmaster
 1870 ?        00:00:00 postmaster
 1871 ?        00:00:00 postmaster
 1872 ?        00:00:00 postmaster
 1873 ?        00:00:00 postmaster
 1874 ?        00:00:00 postmaster


[root@localhost data]# netstat -nlp | grep 5432
tcp        0      0 0.0.0.0:5432                0.0.0.0:*                   LISTEN      1866/postmaster     
tcp        0      0 :::5432                     :::*                        LISTEN      1866/postmaster     
unix  2      [ ACC ]     STREAM     LISTENING     13136  1866/postmaster     /tmp/.s.PGSQL.5432


[root@localhost data]# cat pg_hba.conf | grep "host all"
host all all 0.0.0.0/0 trust


[root@localhost data]# cat postgresql.conf | grep listen_
listen_addresses = '*'      # what IP address(es) to listen on;


[root@localhost data]# cat postgresql.conf | grep port
port = 5432             # (change requires restart)
                    # supported by the operating system:
                    #   %r = remote host and port

因此,这就是我所看到的:

  • iptables 设置为接受到该端口的传入连接
  • postgres 正在运行
  • 它正在监听 tcp 端口
  • 数据库已设置为接受连接
  • postgres 设置为监听所有接口
  • 端口设置正确

但是如果我执行该命令psql -h localhost -U pg_user(其中 pg_user 是我在 postgresql 内部创建的用户),我会收到以下消息:

psql: FATAL:  no pg_hba.conf entry for host "::1", user "pg_user", database "postgres", SSL off

如果我在我的 VM 主机上执行psql -h x.x.x.x -U pg_user(其中 xxxx 是虚拟机的 IP 地址),我会得到以下结果:

psql: could not connect to server: Connection refused
    Is the server running on host "x.x.x.x" and accepting
    TCP/IP connections on port 5432?

此外,我尝试这样做:

$ nc -zw 3 x.x.x.x 5432
$ nc -zw 3 x.x.x.x 22
Connection to x.x.x.x port 22 [tcp/ssh] succeeded!

因此它正在监听 22 但没有监听 5432。

我该去哪里呢?

更新 1

命令psql -h localhost -U pg_user报错。问题有两个方面 - 用 替换它psql -h 127.0.0.1 -U pg_user -d postgres有效。首先,我必须指定 postgres 数据库(它默认为与 pg_user 同名的数据库)。其次,localhost 失败,您必须指定实际的环回 IP 地址。

其次,这里是 pg_hba.conf 中的所有条目:

# TYPE    DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local     all             all                                     peer

# IPv4 local connections:
# host    all             all             127.0.0.1/32            ident

# IPv6 local connections:
# host    all             all             ::1/128                 ident

# Allow replication connections from localhost, by a user with the
# replication privilege.
# local   replication     postgres                                peer
# host    replication     postgres        127.0.0.1/32            ident
# host    replication     postgres        ::1/128                 ident

host      all             all             0.0.0.0/0               trust

答案1

您有一条规则,在 postgres 规则之前拒绝所有内容。尝试:

iptables -I INPUT 1 -p tcp --dport 5432 -j ACCEPT

...看看是否能解决问题?

答案2

看起来您已经在第 3/4 层正确设置了所有内容,因为 tcp/5432 在此盒子上向全世界开放。

tcp 0 0 0.0.0.0:5432 0.0.0.0:* 侦听

最有可能的是,这将是一个 postgres 权限问题,或者可能是 pg 配置错误:

psql:严重错误:主机“::1”、用户“wiki”、数据库“pg_user”没有 pg_hba.conf 条目,SSL 关闭

答案3

对我来说效果很好。我更改了 nickgrim 答案中的行以添加源 IP。@frostymarvelous,以及所有需要保存帮助的人。您需要保存当前的 IPTABLES,您可以使用 -L 命令查看。根据您的发行版,您可以使用:

iptables-save > filename 

脚本来替换 /etc 文件夹中的 iptables 文件....或者您可以编辑文件并进行更改。确保检查您的发行版正在使用什么位置。

相关内容