我有一个 Debian 安装
~$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/
我安装 PostgreSQL 的地方
PostgreSQL 11.3 (Debian 11.3-1.pgdg90+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit
PostgreSQL 正在运行,但我可以在另一台机器上使用它:我通过 firewalld 打开了 5432 端口
# firewall-cmd --zone=public --list-ports
8443/tcp 5432/tcp
但它不起作用。
这在本地
~$ telnet localhost 5432
Trying ::1...
Connected to localhost.
Escape character is '^]'.
这是来自我的机器(在另一个 vlan 上)
:> telnet 192.168.13.183 5432
Trying 192.168.13.183...
telnet: Unable to connect to remote host: Connection refused
这是来自另一台机器(在与 debian 相同的 vlan 中)
telnet 192.168.13.183 5432
Trying 192.168.13.183...
telnet: connect to address 192.168.13.183: Connection refused
所以我关闭了firewalld(只是为了测试),但我得到了相同的结果。之后,我尝试使用 iptables 做同样的事情:
iptables -A INPUT -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
结果相同我在这里缺少什么?
只需检查一下(感谢@thomas):
netstat -tulpan | grep postgres
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 6386/postgres
tcp6 0 0 ::1:5432 :::* LISTEN 6386/postgres
udp6 0 0 ::1:44652 ::1:44652 ESTABLISHED 6386/postgres
lsof -n -i:5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 6386 postgres 3u IPv6 72390 0t0 TCP [::1]:postgresql (LISTEN)
postgres 6386 postgres 5u IPv4 72391 0t0 TCP 127.0.0.1:postgresql (LISTEN
postgresql
默认情况下只监听本地主机(127.0.0.1和::1)。要更改此行为,您必须手动配置其他侦听地址postgresql.conf
,通常位于$PGDATA
.要使 postgres 例如也监听本地地址 10.0.10.156,您必须指定
listen_addresses
如下。为了让 postgres 监听所有接口,你也可以使用通配符。
进行此更改后,需要重新启动 postgres。我还建议检查结果是否符合您的期望。
lsof
使用在 localhost 和 10.0.10.156 上监听的 postgres 的输出。lsof
使用 postgres 监听所有接口的输出。