CKH 網誌

PostgreSQL 16 常見連線錯誤:Peer、密碼與錯誤連接埠

實測環境與硬體規格

項目實際測試配置
測試日期2026-10-02
作業系統Ubuntu 24.04.5 LTS
主機數量1 台新建隔離 VM;下列資源為每台配置
CPU2 vCPU
記憶體4 GiB
系統磁碟32 GiB;HDD 儲存、VirtIO、ext4
Linux 核心6.8.0-139-generic
PostgreSQLpsql (PostgreSQL) 16.15 (Ubuntu 16.15-0ubuntu0.24.04.1)

從服務、連接埠、連線方式到認證逐層排查,重現三種常見錯誤,再用正確連線驗證恢復,避免用放寬認證規則掩蓋問題。

本文以全新 Ubuntu 24.04 隔離主機和合成資料實測。套件來自經過簽章驗證、符合 Noble 的套件來源;沒有使用正式資料庫或正式網站的帳號。讀者請依自己的環境確認來源與版本。

圖中是測試主機實際 bash PTY 的執行紀錄,由瀏覽器呈現;提示符統一為 lab$,執行結果未改寫。文字命令另行保留,方便複製。

開始前需完成 PostgreSQL 16 的原生安裝與叢集啟動,可先閱讀 Ubuntu 24.04 安裝篇。本系列使用 demo 範例資料庫;需要既有 sample 表的篇章,依 搬機篇的資料建立步驟 準備 100 筆合成資料。請在獨立教學環境操作。

一、先看錯誤發生在哪一層

症狀先檢查
no response / connection refused服務、主機、連接埠、listener、網路
Peer authentication failed是否走 Unix socket、目前作業系統使用者、local HBA
password authentication failed角色、密碼、database、第一條匹配 HBA
certificate verify failedCA、效期、完整信任鏈與主機名稱

本次只在新建隔離 VM 上測試;沒有停掉正式資料庫。故意使用未監聽的 6543 重現錯誤連接埠,用錯誤密碼測 SCRAM,用本機管理身分不匹配測 Peer。TLS 憑證錯誤另有 完整實測。

二、服務 active 之後,仍需測實際資料庫

systemctl is-active postgresql@16-main
pg_lsclusters
pg_isready -h 127.0.0.1 -p 5432
sudo -u postgres psql -X -d postgres -c 'SELECT version();'

Ubuntu 的 postgresql.service 是管理入口;直接檢查實際叢集 postgresql@16-main 和 pg_isready 更清楚。服務 active 或 pg_isready 接受連線,也不能證明應用帳號的密碼與表權限正確。

三、理解 Peer authentication failed

psql -X -U app_user -d demo -c 'SELECT 1;'

沒有指定 -h 時,這裡會走本機 Unix socket。若 HBA 的 local 使用 peer,它會核對作業系統身分;目前使用者不是 app_user 時,就可能被拒絕。不要將 local all all 改成 trust 作為通用修復。

# 管理操作:以 postgres 作業系統身分執行
sudo -u postgres psql -X -d demo
# 應用登入:明確走 TCP,互動輸入密碼
psql -X -h 127.0.0.1 -p 5432 -U app_user -d demo -W

四、區分錯誤連接埠與錯誤密碼

pg_isready -h 127.0.0.1 -p 6543
echo $?
pg_isready -h 127.0.0.1 -p 5432
psql -X -h 127.0.0.1 -p 5432 -U app_user -d demo -W
圖1:預期的 Peer 認證失敗與錯誤連接埠
圖1:預期的 Peer 認證失敗與錯誤連接埠。實際 PTY 紀錄,點圖可開啟原尺寸。

實測未監聽的 6543 顯示 no response、結束碼 2;正確的 5432 接受連線。另以錯誤測試密碼建立 TCP 連線時,得到 password authentication failed;使用正確的私有測試密碼則可查詢 100 筆。密碼未出現在截圖、命令參數或匯出記錄。

五、查設定與 HBA 規則,不要盲目放寬

sudo -u postgres psql -X -d postgres <<'SQL'
SHOW config_file;
SHOW hba_file;
SHOW listen_addresses;
SHOW port;
SELECT line_number, type, database, user_name, auth_method, error
FROM pg_hba_file_rules ORDER BY line_number;
SQL

上述查詢可能顯示你的內部角色和路徑,只在自己的私有管理畫面使用。修改前先備份,改 HBA 後使用 SELECT pg_reload_conf();,再檢查規則解析和新的實際連線。改 listener 或埠通常需要重新啟動,應事先安排服務影響。

六、修復後,用應用的實際方式驗證

本次真正的 TCP 密碼登入與查詢在私有測試中執行;下圖另外使用 SET ROLE 顯示安全的範例資料查詢,不能單靠這張圖宣稱已驗證密碼登入。

圖2:正常服務與 SET ROLE 範例查詢;密碼登入另於私有測試驗證
圖2:正常服務與 SET ROLE 範例查詢;密碼登入另於私有測試驗證。實際 PTY 紀錄,點圖可開啟原尺寸。

最終驗證應包含正確主機與埠、實際應用角色、需要的 SQL 操作,以及新連線。連線池原有連線不一定套用剛改的認證規則;本次在重新開機後重新查詢,服務與範例資料仍正常。

這次驗證了什麼

驗證項目結果
Peer 認證失敗可重現通過
錯誤連接埠回傳 no response通過
錯誤密碼的 TCP 認證被拒絕通過
正確私有密碼的 TCP 查詢成功通過
重新開機後服務與資料正常通過

實測範圍:只重現 Peer、錯誤密碼與未監聽埠;未模擬 DNS 故障、跨網段防火牆、耗盡連線數或正式應用連線池。HBA 輸出可能含內部資訊,不公開原始輸出。

官方參考資料

Peer 認證、pg_isready、HBA