Nginx如何實現(xiàn)對城市以及指定IP的訪問限制
1.前言
在如何用Nginx代理MySQL連接,并限制可訪問IP一文中,我們實現(xiàn)了通過Nginx代理MySQL連接,并限制了指定IP才能通過Nginx進行連接,以提高數(shù)據(jù)安全性。
該場景適用于根據(jù)具體的IP地址來進行訪問限制,假如我們要上線一個新的功能,但是只想在某些地區(qū)進行小規(guī)模的測試,就無能為力了。
我們可以通過添加第三方模塊ngx_http_geoip2_module
來實現(xiàn),其實Nginx也提供了ngx_http_geoip_module
,至于我們?yōu)槭裁床皇褂盟?,我們后續(xù)揭曉。
2.限制指定IP
我們先來回顧一下,如何通過指定IP來進行訪問限制。
Nginx提供了ngx_http_access_module
和ngx_stream_access_module
模塊,前者針對http請求,后者針對stream連接,它們的指令非常簡單,僅包含allow
和deny
指令,唯一區(qū)別就是作用域不同。
我們這里就以ngx_http_access_module
模塊為例。
1)allow
該指令設(shè)置指定的IP允許訪問。可以和deny
指令配合使用
作用域:http, server, location, limit_except
語法: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禁止訪問。可以和allow
指令配合使用。
作用域:http, server, location, limit_except
語法: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.限制國家/城市
前面我們提到了Nginx也提供了ngx_http_geoip_module
來實現(xiàn)根據(jù)國家/城市進行訪問限制。
官當(dāng)文檔:https://nginx.org/en/docs/http/ngx_http_geoip_module.html
從上圖可以得知該模塊需要maxmind的數(shù)據(jù)庫,并且格式為.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)建模塊
對于添加第三方模塊,我們需要在configure時使用--add-module
來實現(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基本命令&不停機版本升級】一文進行,這里不再贅述。
3.3 GEOIP數(shù)據(jù)下載
下載地址(需注冊賬號):https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
國家?guī)欤?/strong>
城市庫:
通過解壓縮得到GeoLite2-Country.mmdb
和GeoLite2-City.mmdb
數(shù)據(jù)庫文件。
3.4 配置
3.4.1 初體驗
在進行配置之前,我們先通過第一步安裝的依賴庫來體驗一下。
mmdblookup --file /usr/local/nginx/GeoLite2-City.mmdb --ip 183.195.99.161
可以看到,其識別出這是一個來自上海的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
變量來模擬,只需在請求頭中加入X-Forwarded-For-Temp
字段即可。實際環(huán)境還是使用$http_x_forwarded_for
變量用來獲取請求的真實IP。
3.4.3 實戰(zhàn)
1)發(fā)起請求,X-Forwarded-For-Temp=183.195.99.161,上海IP,響應(yīng)碼200。
2)發(fā)起請求,X-Forwarded-For-Temp=221.192.127.124,唐山IP,響應(yīng)碼403。
3)日志記錄:
總結(jié)
以上就是Nginx限制可訪問IP的全部內(nèi)容,Nginx是多模塊化的,還有很多高級功能,我們后面繼續(xù)探索。
這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
強大的 Web 應(yīng)?服務(wù)器OpenResty安裝(Nginx倉庫)
OpenResty 是?個強大的 Web 應(yīng)?服務(wù)器,Web 開發(fā)?員可以使用 Lua 腳本語?調(diào)動 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)資料,這里提供實例幫助大家,學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08Nginx搭建高效的靜態(tài)圖片服務(wù)器的方法步驟
高效地管理和分發(fā)靜態(tài)資源是至關(guān)重要的,本文主要介紹了Nginx搭建高效的靜態(tài)圖片服務(wù)器的方法步驟,具有一定的參考價值,感興趣的可以了解一下2024-05-05nginx網(wǎng)站服務(wù)如何配置防盜鏈(推薦)
這篇文章主要介紹了nginx網(wǎng)站服務(wù)如何配置防盜鏈,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Nginx解決Http慢攻擊(Slow HTTP Attack)的方法
緩慢的HTTP拒絕服務(wù)攻擊是一種專門針對于Web的應(yīng)用層拒絕服務(wù)攻擊,本文給大家介紹了Nginx解決Http慢攻擊(Slow HTTP Attack)的方法,需要的朋友可以參考下2024-02-02