求助:通过SSH连接亚马逊Linux服务器PostgreSQL时认证失败
看起来你遇到的核心问题是远程连接时PostgreSQL的认证规则不匹配,而SSH隧道能正常工作是因为它绕过了远程认证的限制——我们一步步来解决:
1. 理解为什么SSH隧道能正常工作
当你用IntelliJ通过SSH操作远程数据库时,SSH会把本地的请求转发到服务器的127.0.0.1:5432,此时PostgreSQL看到的连接来源是127.0.0.1,正好匹配你pg_hba.conf里的这条规则:
host all all 127.0.0.1/32 trust
trust规则会直接允许连接,不需要密码验证,所以能成功。但直接用IntelliJ/PgAdmin远程连接时,PostgreSQL看到的是你的本地公网IP,找不到对应的认证规则,就会触发密码认证失败。
2. 修改pg_hba.conf添加远程认证规则
登录到你的亚马逊Linux服务器,找到pg_hba.conf文件(通常在/var/lib/pgsql/<版本号>/data/或者/etc/postgresql/<版本号>/main/目录下),添加一条针对你本地IP的密码认证规则:
针对特定IP(推荐,更安全)
如果知道自己的本地公网IP,添加:
host all all 你的本地公网IP/32 scram-sha-256
注:如果你的PostgreSQL版本低于10,用
md5代替scram-sha-256
临时测试(不推荐生产环境)
如果不确定IP或者需要快速测试,可以暂时允许所有IP(生产环境一定要改掉):
host all all 0.0.0.0/0 scram-sha-256
添加后保存文件,必须重启PostgreSQL服务让配置生效:
# 亚马逊Linux常用命令 sudo systemctl restart postgresql # 旧版本可能用 sudo service postgresql restart
3. 确保postgres用户的密码正确且加密
有时候即使密码输入正确,也可能因为密码没有加密存储导致认证失败。登录到服务器的PostgreSQL命令行:
sudo -u postgres psql
然后执行命令重置密码(确保用加密方式):
ALTER USER postgres WITH ENCRYPTED PASSWORD '你的强密码'; \q
4. 检查服务器防火墙和安全组
亚马逊Linux上要确保5432端口对外开放:
- 检查本地防火墙(比如firewalld):
sudo firewall-cmd --add-port=5432/tcp --permanent sudo firewall-cmd --reload - 检查AWS安全组:在EC2控制台的安全组配置里,添加一条入站规则,允许
5432端口,来源设置为你的本地IP或者刚才在pg_hba.conf里配置的IP段。
最后验证
修改完成后,再用IntelliJ或PgAdmin尝试远程连接,应该就能正常通过密码认证了。
内容的提问来源于stack exchange,提问作者artemk

