Nginx如何實(shí)現(xiàn)對(duì)城市以及指定IP的訪問限制
1.前言
在如何用Nginx代理MySQL連接,并限制可訪問IP一文中,我們實(shí)現(xiàn)了通過Nginx代理MySQL連接,并限制了指定IP才能通過Nginx進(jìn)行連接,以提高數(shù)據(jù)安全性。
該場(chǎng)景適用于根據(jù)具體的IP地址來進(jìn)行訪問限制,假如我們要上線一個(gè)新的功能,但是只想在某些地區(qū)進(jìn)行小規(guī)模的測(cè)試,就無能為力了。
我們可以通過添加第三方模塊ngx_http_geoip2_module來實(shí)現(xiàn),其實(shí)Nginx也提供了ngx_http_geoip_module,至于我們?yōu)槭裁床皇褂盟?,我們后續(xù)揭曉。
2.限制指定IP
我們先來回顧一下,如何通過指定IP來進(jìn)行訪問限制。
Nginx提供了ngx_http_access_module和ngx_stream_access_module模塊,前者針對(duì)http請(qǐng)求,后者針對(duì)stream連接,它們的指令非常簡(jiǎn)單,僅包含allow和deny指令,唯一區(qū)別就是作用域不同。
我們這里就以ngx_http_access_module模塊為例。
1)allow
該指令設(shè)置指定的IP允許訪問??梢院?code>deny指令配合使用
作用域:http, server, location, limit_except
語(yǔ)法:allow address | CIDR | unix: | all;
示例:
# 允許192.168.110.1訪問 allow 192.168.110.1; # 允許192.168.110.1到192.168.255.254 allow 192.168.110.0/16; # 允許192.168.110.1到192.168.110.254 allow 192.168.110.0/24; # 允許所有的IP訪問 allow all;
2)deny
該指令設(shè)置指定的IP禁止訪問??梢院?code>allow指令配合使用。
作用域:http, server, location, limit_except
語(yǔ)法:deny address | CIDR | unix: | all;
# 禁止192.168.110.1訪問 deny 192.168.110.1; # 禁止192.168.110.1到192.168.255.254 deny 192.168.110.0/16; # 禁止192.168.110.1到192.168.110.254 deny 192.168.110.0/24; # 禁止所有的IP訪問 deny all;
3)配置示例
禁止所有的IP訪問,192.168.110.100除外。
http {
server {
listen 80;
server_name localhost;
allow 192.168.110.100;
deny all;
}
}Tips:如果指定了allow,需要配合deny使用,否則就是允許所有的IP地址訪問。
3.限制國(guó)家/城市
前面我們提到了Nginx也提供了ngx_http_geoip_module來實(shí)現(xiàn)根據(jù)國(guó)家/城市進(jìn)行訪問限制。
官當(dāng)文檔:https://nginx.org/en/docs/http/ngx_http_geoip_module.html

從上圖可以得知該模塊需要maxmind的數(shù)據(jù)庫(kù),并且格式為.dat,那好,我們來看看maxmind提供的數(shù)據(jù),如下圖:

其格式為.mmdb,與該模塊的數(shù)據(jù)格式不匹配,因此我們使用第三方模塊ngx_http_geoip2_module。
下載地址:https://github.com/leev/ngx_http_geoip2_module/archive/refs/heads/master.zip
3.1 安裝maxminddb library
首先,我們需要安裝用于讀取.mmdb的文件的依賴。
apt install libmaxminddb0 libmaxminddb-dev mmdb-bin
3.2 構(gòu)建模塊
對(duì)于添加第三方模塊,我們需要在configure時(shí)使用--add-module來實(shí)現(xiàn)。
例如:
./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-stream --add-module=/home/stone/nginx-1.22.1/module/ngx_http_geoip2_module
其余步驟,可參照【Nginx基本命令&不停機(jī)版本升級(jí)】一文進(jìn)行,這里不再贅述。
3.3 GEOIP數(shù)據(jù)下載
下載地址(需注冊(cè)賬號(hào)):https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
國(guó)家?guī)欤?/strong>

城市庫(kù):

通過解壓縮得到GeoLite2-Country.mmdb和GeoLite2-City.mmdb數(shù)據(jù)庫(kù)文件。
3.4 配置
3.4.1 初體驗(yàn)
在進(jìn)行配置之前,我們先通過第一步安裝的依賴庫(kù)來體驗(yàn)一下。
mmdblookup --file /usr/local/nginx/GeoLite2-City.mmdb --ip 183.195.99.161
可以看到,其識(shí)別出這是一個(gè)來自上海的IP地址。

3.4.2 配置示例
接下來,我們開始配置。
http {
include mime.types;
default_type application/octet-stream;
# 自定義日志格式
log_format geoip '$http_x_forwarded_for_temp - $remote_user [$time_local] - $request - $status - $geoip2_country_name_en - $geoip2_city_name_en';
geoip2 /usr/local/nginx/GeoLite2-Country.mmdb {
auto_reload 5m;
$geoip2_metadata_country_build metadata build_epoch;
$geoip2_country_code source=$http_x_forwarded_for_temp country iso_code;
$geoip2_country_name_en source=$http_x_forwarded_for_temp country names en;
$geoip2_country_name_zh source=$http_x_forwarded_for_temp country names zh-CN;
}
geoip2 /usr/local/nginx/GeoLite2-City.mmdb {
auto_reload 5m;
$geoip2_city_name_en source=$http_x_forwarded_for_temp city names en;
$geoip2_city_name_zh source=$http_x_forwarded_for_temp city names zh-CN;
}
server {
listen 80;
server_name localhost;
access_log logs/geoip.log geoip;
default_type text/html;
# 正則匹配取反
if ($geoip2_city_name_en !~ 'Shanghai'){
return 403 "<h1>Forbidden!</h1><p>You don't have permission to access the URL on this server.</p>";
}
location / {
return 200 '<p>Real IP: $http_x_forwarded_for_temp</p><p>Country: $geoip2_country_name_en</p><p>City: $geoip2_city_name_en</p>';
}
}
}Tips:由于我們這里沒有外網(wǎng)環(huán)境,因此使用$http_x_forwarded_for_temp變量來模擬,只需在請(qǐng)求頭中加入X-Forwarded-For-Temp字段即可。實(shí)際環(huán)境還是使用$http_x_forwarded_for變量用來獲取請(qǐng)求的真實(shí)IP。
3.4.3 實(shí)戰(zhàn)
1)發(fā)起請(qǐng)求,X-Forwarded-For-Temp=183.195.99.161,上海IP,響應(yīng)碼200。

2)發(fā)起請(qǐng)求,X-Forwarded-For-Temp=221.192.127.124,唐山IP,響應(yīng)碼403。

3)日志記錄:

總結(jié)
以上就是Nginx限制可訪問IP的全部?jī)?nèi)容,Nginx是多模塊化的,還有很多高級(jí)功能,我們后面繼續(xù)探索。
這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
強(qiáng)大的 Web 應(yīng)?服務(wù)器OpenResty安裝(Nginx倉(cāng)庫(kù))
OpenResty 是?個(gè)強(qiáng)大的 Web 應(yīng)?服務(wù)器,Web 開發(fā)?員可以使用 Lua 腳本語(yǔ)?調(diào)動(dòng) Nginx ?持的各種 C 以及 Lua 模塊,更主要的是在性能方面,OpenResty可以快速構(gòu)造出足以勝任 10K 以上并發(fā)連接響應(yīng)的超高性能 Web 應(yīng)用系統(tǒng)2023-06-06
詳解Nginx防盜鏈和Nginx訪問控制與Nginx解析php的配置
這篇文章主要介紹了詳解Nginx防盜鏈和Nginx訪問控制與Nginx解析php的配置的相關(guān)資料,這里提供實(shí)例幫助大家,學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08
淺談Nginx請(qǐng)求限制和訪問控制的實(shí)現(xiàn)
這篇文章主要介紹了淺談Nginx請(qǐng)求限制和訪問控制的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
Nginx搭建高效的靜態(tài)圖片服務(wù)器的方法步驟
高效地管理和分發(fā)靜態(tài)資源是至關(guān)重要的,本文主要介紹了Nginx搭建高效的靜態(tài)圖片服務(wù)器的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
nginx網(wǎng)站服務(wù)如何配置防盜鏈(推薦)
這篇文章主要介紹了nginx網(wǎng)站服務(wù)如何配置防盜鏈,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Nginx解決Http慢攻擊(Slow HTTP Attack)的方法
緩慢的HTTP拒絕服務(wù)攻擊是一種專門針對(duì)于Web的應(yīng)用層拒絕服務(wù)攻擊,本文給大家介紹了Nginx解決Http慢攻擊(Slow HTTP Attack)的方法,需要的朋友可以參考下2024-02-02
Nginx部署項(xiàng)目上傳文件報(bào)錯(cuò)413的解決方法
本文主要介紹了Nginx部署項(xiàng)目上傳文件報(bào)錯(cuò)413的解決方法,報(bào)錯(cuò)413是因?yàn)镹ginx對(duì)上傳大小做了限制,所以我們需要配置文件,下面就來解決這個(gè)問題,感興趣的可以了解一下2024-03-03

