Nginx配置allow和deny指令的使用
介紹
在 Nginx 配置中,allow
和 deny
指令用于基于 IP 地址的訪問控制,幫助管理員靈活管理資源訪問權(quán)限。本文將結(jié)合配置語法、優(yōu)先級(jí)規(guī)則、應(yīng)用場(chǎng)景及優(yōu)化技巧,全面解析這兩個(gè)指令的使用方法。
allow
:允許指定的 IP 地址或網(wǎng)段訪問。deny
:禁止指定的 IP 地址或網(wǎng)段訪問。
指令簡(jiǎn)介與基本語法
allow
和 deny
屬于 ngx_http_access_module
模塊,默認(rèn)已集成在 Nginx 中(除非編譯時(shí)通過 --without-http_access_module
禁用)。其語法如下:
allow <IP地址|CIDR|unix: | all>; deny <IP地址|CIDR|unix: | all>;
- IP地址:支持 IPv4(如
192.168.1.1
)和 IPv6(如2001:0db8::/32
)。 - CIDR:表示 IP 段(如
192.168.1.0/24
)。 - unix::允許或禁止 Unix 域套接字訪問(需 Nginx 1.5.1+)。
- all:匹配所有地址。
優(yōu)先級(jí)與執(zhí)行順序
Nginx 采用 “順序優(yōu)先,首次匹配” 的規(guī)則:
- 按配置順序逐條檢查規(guī)則,匹配到第一條后立即生效,后續(xù)規(guī)則忽略。
- 默認(rèn)允許所有訪問,除非顯式使用
deny all;
全局拒絕。
示例分析
location / { deny 192.168.1.1; # 拒絕單個(gè) IP allow 192.168.1.0/24; # 允許整個(gè)網(wǎng)段 deny all; # 拒絕其他所有 IP }
192.168.1.1
匹配第一條deny
,直接拒絕。- 網(wǎng)段內(nèi)其他 IP(如
192.168.1.2
)匹配allow
后放行。 - 非網(wǎng)段 IP(如
10.0.0.1
)最終被deny all
拒絕。
典型應(yīng)用場(chǎng)景
限制管理后臺(tái)訪問
location /admin { allow 192.168.1.0/24; deny all; error_page 403 /custom_403.html; # 自定義錯(cuò)誤頁面 }
僅允許內(nèi)網(wǎng)訪問 /admin
,其他 IP 返回 403 并跳轉(zhuǎn)至自定義頁面。
白名單控制 API 接口
location /api { allow 203.0.113.5; deny all; proxy_pass http://backend; }
僅允許特定 IP 訪問 API,防止未授權(quán)調(diào)用。
按路徑差異化控制
location /public { allow all; } location /private { allow 10.0.0.0/8; deny all; }
不同路徑設(shè)置獨(dú)立的訪問策略,兼顧靈活性與安全性。
高級(jí)配置技巧
反向代理環(huán)境下的真實(shí) IP 獲取
當(dāng) Nginx 位于代理后方時(shí),需通過 X-Forwarded-For
獲取真實(shí)客戶端 IP:
set_real_ip_from 10.0.0.0/8; # 信任的代理服務(wù)器 IP 段 real_ip_header X-Forwarded-For; real_ip_recursive on; # 排除可信代理 IP,獲取真實(shí)客戶端 IP
避免誤判代理服務(wù)器 IP 為客戶端地址。
使用 geo 模塊優(yōu)化性能
大規(guī)模 IP 規(guī)則時(shí),geo
模塊可提升匹配效率:
geo $blocked_ip { default 0; 192.168.1.0/24 1; 10.0.0.5 1; } server { if ($blocked_ip) { return 403; } }
預(yù)定義 IP 匹配狀態(tài),減少動(dòng)態(tài)規(guī)則解析開銷。
動(dòng)態(tài)封禁與自動(dòng)化
結(jié)合 Fail2ban 或 iptables 自動(dòng)封禁惡意 IP:
- 日志監(jiān)控:配置 Nginx 記錄訪問日志。
- 規(guī)則聯(lián)動(dòng):Fail2ban 分析日志后動(dòng)態(tài)更新 Nginx 黑名單文件,通過
include
指令加載。
常見問題與避坑指南
規(guī)則順序錯(cuò)誤導(dǎo)致漏洞
錯(cuò)誤示例:
allow all; deny 192.168.1.1; # 此規(guī)則失效!
正確寫法應(yīng)先拒絕再允許:
deny 192.168.1.1; allow all;
反向代理未配置真實(shí) IP
未設(shè)置 real_ip_header
時(shí),allow/deny
可能基于代理服務(wù)器 IP 而非客戶端 IP,導(dǎo)致錯(cuò)誤封禁。
IPv4/IPv6 兼容性問題
若需獨(dú)立控制 IPv6,需顯式指定:
allow 2001:0db8::/32; deny 2001:0db8::1;
性能優(yōu)化建議
- 合并規(guī)則:使用 CIDR 減少條目,如將多個(gè)
/24
合并為/16
。 - 分文件管理:通過
include
引入外部規(guī)則文件,提升可維護(hù)性:include /etc/nginx/conf.d/ip-whitelist.conf; deny all;
- 避免過度使用
if
:if
指令可能引發(fā)性能問題,優(yōu)先在location
或server
塊中配置規(guī)則。
總結(jié)
allow
和 deny
是 Nginx 實(shí)現(xiàn) IP 訪問控制的核心指令,需重點(diǎn)注意:
- 順序決定優(yōu)先級(jí),規(guī)則按從上到下執(zhí)行。
- 反向代理需配置真實(shí) IP,避免誤判。
- 性能優(yōu)化:合并規(guī)則、使用
geo
模塊、動(dòng)態(tài)工具聯(lián)動(dòng)。
通過合理設(shè)計(jì)規(guī)則,可有效保護(hù)敏感接口、抵御惡意流量,同時(shí)保持服務(wù)的高效穩(wěn)定。
到此這篇關(guān)于Nginx配置allow和deny指令的使用的文章就介紹到這了,更多相關(guān)Nginx配置allow和deny指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx 502 Bad Gateway錯(cuò)誤常見的4種原因和解決方法
這篇文章主要介紹了Nginx 502 Bad Gateway錯(cuò)誤常見的4種原因和解決方法,本文適用FastCGI環(huán)境,其中多數(shù)原因通過配置相關(guān)參數(shù)即可解決,需要的朋友可以參考下2015-05-05nginx使用sticky基于cookie的會(huì)話保持方式
這篇文章主要介紹了nginx使用sticky基于cookie的會(huì)話保持方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Ubuntu使用nginx搭建webdav文件服務(wù)器的詳細(xì)過程
今天通過本文給大家分享Ubuntu使用nginx搭建webdav文件服務(wù)器的詳細(xì)過程,在這小編提示大家在安裝nginx時(shí)需要先安裝nginx-full,具體安裝方法跟隨小編一起通過本文學(xué)習(xí)下吧2021-05-05安裝配置php-fpm來搭建Nginx+PHP的生產(chǎn)環(huán)境
這篇文章主要介紹了安裝配置php-fpm來搭建Nginx+PHP的生產(chǎn)環(huán)境的方法,php-fpm的作用是將FastCGI進(jìn)程管理整合進(jìn)PHP包,需要的朋友可以參考下2016-01-01uwsgi+nginx代理Django無法訪問靜態(tài)資源的解決
這篇文章主要介紹了uwsgi+nginx代理Django無法訪問靜態(tài)資源,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05