解决方案:事实证明,iptables 的顺序很重要。第五条INPUT
规则是REJECT all ...
排除ACCEPT
规则的规则。所以我不得不习惯iptables -I INPUT 5 ...
将规则添加到第五位,在规则之前。一个重要的细节:记得先REJECT
执行- 如果你忘记了保存,它不会记住新的顺序,你必须再次执行。service iptables save
service 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 文件....或者您可以编辑文件并进行更改。确保检查您的发行版正在使用什么位置。