前言
微信公衆号“SRE成長記”可檢視原文
PostgreSQL預設隻能本機連接配接,若要在别的用戶端遠端連接配接pgsql,則需要修改配置檔案pg_hba.conf,添加IPv4白名單。
如果在某些場景下,pgsql前面有兩層nginx做代理,IPv4白名單該怎麼配置呢?pg資料庫擷取的clientIP分别又是什麼呢?
模拟實驗環境規劃
準備4台伺服器和本地Windows電腦pgAdmin工具,配置設定如下:
實驗環境搭建
- 在10.0.0.66和10.0.0.102伺服器分别搭建postgresql應用,搭建步驟可參考《PostgreSQL學習之部署與簡單使用》
-
10.0.0.64和10.0.0.65伺服器分别安裝nginx。并修改nginx配置檔案nginx.conf如下:
10.0.0.64伺服器修改nginx.conf,添加如下配置(注意:stream和http是同級的,即stream不要放在http{}中):
#代理pgsql資料庫
stream {
upstream pgsql {
server 10.0.0.65:5432;
}
server {
listen 5432;
proxy_connect_timeout 30s;
proxy_timeout 30s;
proxy_pass pgsql;
}
10.0.0.65伺服器修改nginx.conf,添加如下配置(注意:stream和http是同級的,即stream不要放在http{}中):
#代理pgsql資料庫
stream {
upstream pgsql {
server 10.0.0.66:5432;
}
server {
listen 5432;
proxy_connect_timeout 30s;
proxy_timeout 30s;
proxy_pass pgsql;
}
- 本地Windows電腦安裝pgAdmin工具。
場景實驗
實驗分三個場景做測試:
場景一:用戶端隻能通過兩層nginx做代理轉發,連接配接postgresql;
場景二:用戶端繞開nginx代理,直連pgsql資料庫;
場景三:用戶端可走nginx代理,也可直連pg資料庫;
場景一:用戶端隻能通過nginx代理連接配接資料庫
pg_hba.conf檔案中IPv4白名單配置:
此種場景,白名單隻配置任意一台nginx代理的IP,不配置用戶端IP,重新開機pgsql:
host all all 10.0.0.65/24 md5
#或者:
#host all all 10.0.0.64/24 md5
測試結果:
在伺服器用戶端102和Windows用戶端pgAdmin工具,均可通過nginx代理正常通路PG資料庫。在配置任一nginxIP白名單情況下,無論是通過nginx-64或者nginx-65連接配接PG資料庫均可。
此時PG資料庫通過pgAdmin工具可以直覺看到,隻要是走nginx代理過來的連接配接,資料庫接收到的clientIP均為第二層nginx的IP位址(也可以在postgresql資料庫本身通過指令行 select * from pg_stat_activity; 檢視)。
如下圖,在client列中看到兩個10.0.0.65的用戶端連接配接,分别是Windows用戶端通過pgAdmin和伺服器用戶端102通過指令行psql -h 10.0.0.64 -p5432連接配接進來的(最後一行IP為空白的記錄是因為在pg資料庫本身是登入狀态)。
場景二:用戶端繞開nginx代理,直連pgsql資料庫
pg_hba.conf檔案中IPv4白名單配置:
此種場景,則可隻配置用戶端IP,不配置2台nginx代理的IP,重新開機pgsql:
host all all 192.168.0.36/24 md5
host all all 10.0.0.102/24 md5
測試結果:
通過nginx代理已無法進入pg資料庫。
用戶端102和Windows用戶端均繞開2台nginx代理伺服器,直連pgsql。此時pgsql接收的用戶端IP顯示為真實的用戶端IP:
場景三:用戶端可走nginx代理,也可直連pg資料庫
pg_hba.conf檔案中IPv4白名單配置:
此種場景,可配置伺服器IP網段+兩台nginxIP,也可以放開所有IP通路權限,重新開機pgsql:
host all all 0.0.0.0/0 md5
測試結果:
伺服器用戶端102和Windows用戶端pgAdmin能通過nginx代理正常連接配接pgsql,也能繞過nginx直連pgsql。
pg資料庫擷取的clientIP則為場景一和場景二的結合體:通過nginx代理通路的,clientIP為nginx-65的IP;直連的,clientIP為用戶端真實IP:
實驗結論
經過實驗,結論如下圖:
::: hljs-right
(全文完)
:::