我有一个在 SLES 上运行的 postgresql 实例。
我想将其设置为在本地主机上监听,并启用 iptables 来执行端口转发。
我当前的配置
postgresql.conf:
listen_addresses = 'localhost'
port = 5432
pg_hba.conf:
local all all md5
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5
iptables(通过添加规则iptables -t nat -I PREROUTING -p tcp --dport 5432 -j REDIRECT
):
Chain PREROUTING (policy ACCEPT 441 packets, 54049 bytes)
pkts bytes target prot opt in out source destination
6 420 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5432
像这样配置后,我无法打开到数据库的 psql 连接。
如果没有 iptables 规则,就会出现Connection refused
错误。
使用 iptables 规则时出现Connection timed out
错误。
答案1
您可能需要检查过滤表。例如,INPUT 的默认策略是什么?如果 CHAIN 策略不允许,您是否有明确的规则允许端口 5432。
另外,按照你的问题所示编写规则可能还不够。请阅读以下内容man iptables
:
REDIRECT
This target is only valid in the nat table, in the PREROUTING and OUTPUT
chains, and user-defined chains which are only called from those chains.
It redirects the packet to the machine itself by changing the destination IP
to the primary address of the incoming interface (locally-generated packets are mapped to the 127.0.0.1 address).
因此,它会将请求重定向到 IP 地址,不一定是localhost
。127.0.0.1
您可能需要在 NAT 规则中明确添加 127.0.0.1 IP 地址。您可以尝试:
iptables -t nat -I PREROUTING -p tcp --dport 5432 -j DNAT --to-destination 127.0.0.1