Postgresql 客戶端連線問題
阿新 • • 發佈:2019-01-28
做程式呼叫postgresql資料庫的時候,後臺出現這麼一條錯誤:
java.sql.SQLException: No pg_hba.conf entry for host 210.230.203.160, user postgres, database rinri01
這條錯誤是什麼意思?為什麼會出現呢?
這條錯誤的原因是因為客戶端遠端訪問postgresql受限所致,因為postgresql預設情況下除本機外的機器是不能連線的,下
面我們就來分析並解決這個問題:
預設情況下,postgresql本機的連線是信任連線,只要有使用者名稱就可以連線,不用密碼. 要改變這種預設設定需要更改
postgresql的兩個配置檔案(pg_hba.conf與postgresql.conf,這兩個檔案在initdb時指定的目錄下,如:/usr/local/pgsql
/data (unix), windows系統時直接在postgresql的根目錄的data目錄下)
java.sql.SQLException: No pg_hba.conf entry for host 210.230.203.160, user postgres, database rinri01
這條錯誤是什麼意思?為什麼會出現呢?
這條錯誤的原因是因為客戶端遠端訪問postgresql受限所致,因為postgresql預設情況下除本機外的機器是不能連線的,下
面我們就來分析並解決這個問題:
預設情況下,postgresql本機的連線是信任連線,只要有使用者名稱就可以連線,不用密碼. 要改變這種預設設定需要更改
postgresql的兩個配置檔案(pg_hba.conf與postgresql.conf,這兩個檔案在initdb時指定的目錄下,如:/usr/local/pgsql
/data
- pg_hba.conf檔案內容:
檔案 pg_hba.conf 的常用格式是一套記錄,
每行一條。空白行行被忽略,井號( # )開頭的註釋也被忽略。
一條記錄是由若干用空格和/或 tab 分隔的欄位組成。
如果欄位用引號包圍,那麼它可以包含空白。記錄不能跨行存在。
每條記錄宣告一種聯接型別,一個客戶端 IP 地址範圍(如果和聯接型別相關的話),一個數據庫名,一個使用者名稱字,
以及對匹配這些引數的聯接使用的認證方法。
第一條匹配聯接型別,客戶端地址和聯接企圖請求的資料庫名和使用者名稱的記錄將用於執行認證。
這個處理過程沒有"跨越"或者"回頭"的說法:如果選擇了一條記錄而且認證失敗,
那麼將不考慮後面的記錄。如果沒有匹配的記錄,那麼訪問將被拒絕。
每條記錄可以下面七種格式之一
local databaseuser authentication-method [authentication-option]
host database user CIDR-address authentication-method[authentication-option]
hostssl database user CIDR-address authentication-method [authentication-option]
hostnossl database user CIDR-address authentication-method [authentication-option]
host database user IP-address IP-mask authentication-method [authentication-option]
hostssl database user IP-address IP-mask authentication-method [authentication-option]
hostnossl database user IP-address IP-mask authentication-method [authentication-option]
各個欄位的含義如下:
local
這條記錄匹配通過 Unix 域套接字進行的聯接企圖。
沒有這種型別的記錄,就不允許 Unix 域套接字的聯接。
host
這條記錄匹配通過 TCP/IP 進行的聯接嘗試。
host 記錄匹配 SSL 和非 SSL 的連線請求。
注意: 除非伺服器帶著合適的
[url=file:///mnt/usbg/lyb/books/postgresql/postgres8.0.zh_cn/runtime-config.html#GUC-LISTEN-ADDRESSES]listen_addresses[/url]
配置引數值啟動,否則將不可能進行遠端的 TCP/IP 連線,
因為預設的行為是隻監聽本地自環地址 localhost 的連線。
hostssl
這條記錄匹配使用 TCP/IP 的 SSL 聯接企圖。
但必須是使用 SSL 加密的聯接。
要使用這個選項,製作伺服器的時候必須開啟 SSL 支援。而且在伺服器啟動的時候,
必須SSL選項通過配置選項
[url=file:///mnt/usbg/lyb/books/postgresql/postgres8.0.zh_cn/runtime-config.html#GUC-SSL]ssl[/url]
開啟。
hostnossl
這個記錄與 hostssl 有著正相反的邏輯:
它只匹配那些在 TCP/IP 上不使用 SSL 的連線請求。
database
宣告記錄所匹配的資料庫。值
all 表明該記錄匹配所有資料庫,
值 sameuser表示如果被請求的資料庫和請求的使用者同名,則匹配。
samegroup 表示請求的使用者必須是一個與資料庫同名的組中的成員。
在其他情況裡,這就是一個特定的 PostgreSQL 的名字。
我們可以通過用逗號分隔的方法宣告多個數據庫。
一個包含資料庫名的檔案可以通過對該檔案字首 @ 來宣告。
user
為這條記錄宣告所匹配的PostgreSQL使用者。值 all 表明它匹配於所有使用者。
否則,它就是特定 PostgreSQL
使用者的名字。多個使用者名稱可以通過用逗號分隔的方法宣告。組名字可以通過用 + 做組名字字首來宣告。
一個包含使用者名稱的檔案可以通過在檔名前面字首 @ 來宣告。該檔案必需和
pg_hba.conf 在同一個目錄。
CIDR-address
宣告這條記錄匹配的客戶端機器的 IP 地址範圍。它包含一個標準的點分十進位制的 IP 地址和一個 CIDR 掩碼長度。
(IP 地址只能用數值宣告,不能用域或者主機名。)
掩碼長度表示客戶端 IP 地址必須匹配的高位二進位制位數。
在給出的 IP 地址裡,這個長度的右邊的二進位制位必須為零。
在 IP 地址,/,和 CIDR 掩碼長度之間不能有空白。
典型的 CIDR 地址是 172.20.143.89/32,這表明一個主機,
或者 172.20.143.0/24 表示一個網路。
要宣告單個主機,給 IPv4 地址宣告 CIDR 掩碼 32,給 IPv6 地址宣告 128。
以 IPv4 格式給出的 IP 地址會匹配那些擁有對應地址的 IPv6 連線,比如
127.0.0.1 將匹配 IPv6 地址 ::ffff:127.0.0.1。
一個以 IPv6 格式給出的記錄將只匹配 IPv6 連線,即使對應的地址在 IPv4-in-IPv6
範圍內。請注意如果系統的 C 庫不支援 IPv6 地址,那麼 IPv6 的格式將被拒絕。
這個域只適用於 host,hostssl 和 hostnossl 記錄。
IP-address
IP-mask
這些方法可以用於作為 CIDR-address 表示法的替補。
它不是宣告掩碼的長度,而是在另外一個欄位裡宣告實際的掩碼。
比如,255.0.0.0 表示 IPv4 CIDR 掩碼長度 8,而 255.255.255.255 表示 CIDR 掩碼長度 32。
同樣的匹配邏輯將用於一個點分的 IP-mask。
這些欄位只適用於 host, hostssl,
和 hostnossl 記錄。
authentication-method(認證方法)
宣告通過這條記錄聯接的時候使用的認證方法。
trust
無條件地允許聯接。這個方法允許任何可以與PostgreSQL
資料庫伺服器聯接的使用者以他們期望的任意
PostgreSQL 資料庫使用者身份進行聯接,而不需要口令。
reject
聯接無條件拒絕。常用於從一個組中"過濾"某些主機。
md5
要求客戶端提供一個 MD5 加密的口令進行認證。
crypt
要求客戶端提供一個 crypt() 加密的口令用於認證。
7.2 以前的客戶端只能支援 crypt。
對於 7.2 以及以後的客戶端,我們建議使用 md5。
password
要求客戶端提供一個未加密的口令進行認證。
因為口令是以明文形式在網路上傳遞的,
所以我們不應該在不安全的網路上使用這個方式。
krb4
用 Kerberos V4 認證使用者。只有在進行 TCP/IP 聯接的時候才能用。
krb5
用 Kerberos V5 認證使用者。只有在進行 TCP/IP 聯接的時候才能用。
ident
獲取客戶的作業系統名(對於 TCP/IP 聯接,使用者的身份是通過與執行在客戶端上的
ident 伺服器聯接進行判斷的,對於本地聯接,它是從作業系統獲取的。)
然後檢查一下,看看使用者是否允許以要求的資料庫使用者進行聯接,
方法是參照在 ident 關鍵字後面宣告的對映。
pam
使用作業系統提供的可插入的認證模組服務 (Pluggable Authentication Modules)
我的配置示例如下:
# 本機localhost使用信任連線
local all all trust
#127.0.0.1與192.168.1.0~254段IP地址訪問時需要口令驗證
#要讓本機外的機器訪問,除了在這設定外還要把postgresql.conf
#裡的監聽地址設定為:listen_addresses = '*'
host all all 127.0.0.1/32 md5
host all all 192.168.1.0/24 md5
- postgresql.conf檔案內容
# - Connection Settings -
listen_addresses = '*'
#port = 5432
max_connections = 100
- 重新啟動服務,現在的postgresql就支援tcp/ip連線了,就可以用psql進行測試了.