nginx精准禁止特定國家或者地區IP訪問和設置白名單


要求:對網站的信息,比如某個訪問節點不想國內或者國外的用戶使用,禁止國內或者國外或者精確到某個城市的那種情況。

解決方式:

  • 1.Cloudfalre來實現禁止特定國家的ip訪問,比較簡單,但是需要money!!!

  • 2.nginx,直接使用geoip模塊,現在我們使用最新的ngx_http_geoip2,該模塊可以精確到國家、省、市等一級的IP,並且全部由Nginx執行識別和阻止訪問,但是Nginx編譯起來比較費事。

最終解決方式,使用nginx的geoip模塊:

部署操作:

一:安裝geoip2擴展依賴

yum install libmaxminddb-devel -y

二:下載ngx_http_geoip2_module

git clone https://github.com/leev/ngx_http_geoip2_module.git

注意要是沒有git的話就自己在網上下了然后直接拖到服務器上也行,不過注意格式。

三:查看模塊的完整性

查看模塊的完整性,將下載好的模塊放到指定目錄下,方便nginx編譯時指定路徑,我是放到/usr/local/src/下面的。

四:編譯nginx並檢查模塊是否安裝成功

nginx建議選擇最新版本,我選的是1.18。

注意:在編譯時,我們只要加上--add-module=/usr/local/src/ngx_http_geoip2_module這個參數或者命令就行了,注意一定要加上額,不加等於沒有geoip模塊,就更沒有這個功能了,為了簡化,具體的nginx編譯參數我就不寫了,如下。

./configure --add-module=/usr/local/ngx_http_geoip2_module --user=www --group=www --prefix=......................................

之后的功能make && make install 等照常規流程來就行了,如果是之前已經安裝過nginx只是后來想添加上geoip這個模塊執行make后就不需要執行make install命令。
nginx整體安裝完就檢查下模塊是否都有:

五:驗證是否成功

ldd ldd /usr/bin/nginx

六:修改nginx配置

模塊安裝成功后,還要在 Nginx 里指定數據庫,在安裝運行庫時默認安裝了兩個,位於 /usr/share/GeoIP/ 目錄下,一個只有 IPv4,一個包含 IPv4 和 IPv6:

數據庫地址:

wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz

百度雲鏈接
提取碼:6666
之后使用gunzip解壓這兩個庫文件。

修改nginx配置文件,因為geoip2和geoip是不一樣的,我們可以在 http 段增加國家代碼的map映射:

在http端中添加如下代碼:

geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
$geoip2_data_country_code country iso_code;
}
map $geoip2_data_country_code $allowed_country {
 default yes;
 CN no;
 }

#geoIP的白名單
geo $remote_addr $ip_whitelist {
    default 0;
    include ip.conf;
}

站點的server段里面加一下代碼拒絕所有不是國內ip:

    if ($ip_whitelist = 1) {
       break;
    }

   if ($allowed_country = yes) 
   { return 403; }

這里顯示的是允許國內的ip訪問,國外直接返回403。
在 conf 下新建一個 ip.conf 作為 Geoip 的白名單,支持 ip 段,內容和格式為:

8.8.8.8 1;
8.8.8.8/24 1;

這樣就配置好了 nginx, 並且通過 GeoIP 限制了國家和城市的訪問,並且支持白名單。

七:測試
在國內可以訪問網站,在國外訪問失敗。

如此測試,是成功了的,如果是相反的,禁止國內訪問, 那么server段里if ($allowed_country = yes) { return 403; }的yes改成no即可。

總結:

由於 IP 廣播泛濫,所以 GeoIP 並不是那么准確,如果覺得 GeoIP 庫太舊了,需要自行到官網下載最新版,將上述配置的路徑改一下即可。

GeoIP不光可以屏蔽國家,還可以屏蔽身份、城市,如果有需要可以自己研究下。

參考: 文章1 文章2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM