Nginx 訪問控制的多種方法
一、IP 白名單與黑名單
1. 允許/拒絕指定IP
location /admin/ {
allow 192.168.1.100; # 僅允許該IP訪問
allow 10.0.0.0/24; # 或允許整個(gè)網(wǎng)段
deny all; # 其他全部拒絕
}2. 全局黑名單
http {
geo $block_ip {
default 0;
1.2.3.4 1;
5.6.7.0/24 1;
}
server {
if ($block_ip) {
return 403;
}
...
}
}geo模塊適合大規(guī)模黑名單。
二、基于路徑、方法、參數(shù)的訪問控制
1. 路徑限制
location /private/ {
deny all;
}2. 方法限制
location /api/ {
if ($request_method !~ ^(GET|POST)$) {
return 405;
}
}3. 參數(shù)限制
location /api/ {
if ($arg_token = "") {
return 403;
}
}三、HTTP 基本認(rèn)證(Basic Auth)
1. 啟用賬號(hào)密碼訪問控制
location /secure/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}.htpasswd文件可用htpasswd工具生成。
四、Referer/UA 防盜鏈與防刷
1. 防盜鏈(Referer控制)
location /static/ {
valid_referers none blocked *.example.com;
if ($invalid_referer) {
return 403;
}
}2. 防刷(UA控制)
if ($http_user_agent ~* "curl|bot|spider") {
return 403;
}五、客戶端證書校驗(yàn)(mTLS)
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_client_certificate /etc/nginx/ssl/ca.crt;
ssl_verify_client on;
...
}適用于金融、政企等高安全場景。
六、限速限流(流量控制)
1. 單IP限速
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
location /api/ {
limit_req zone=req_limit burst=10 nodelay;
}2. 連接數(shù)限制
limit_conn_zone $binary_remote_addr zone=conn_limit:10m; limit_conn conn_limit 10;
七、地理位置訪問控制(GeoIP)
需安裝第三方模塊(如 ngx_http_geoip_module),可按國家/地區(qū)控制訪問:
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default 0;
CN 1; # 僅允許中國
}
server {
if ($allowed_country = 0) {
return 403;
}
}八、API 安全與精細(xì)控制
1. 精細(xì)化路徑/參數(shù)/方法控制
location /api/admin/ {
allow 127.0.0.1;
deny all;
}
location ~* /api/(delete|update)/ {
if ($request_method != "POST") {
return 405;
}
}2. 配合 OpenResty/Lua 動(dòng)態(tài)訪問控制
可以根據(jù)業(yè)務(wù)邏輯、數(shù)據(jù)庫、Redis等動(dòng)態(tài)判斷是否允許訪問。
九、企業(yè)級(jí)訪問控制建議
- 重要接口建議多重保護(hù)(IP+密碼+限流+Referer)
- 敏感路徑建議只對內(nèi)網(wǎng)或特定用戶開放
- 日志記錄所有被拒絕的訪問,便于審計(jì)和溯源
- 定期更新黑名單、白名單,防止失效
- 結(jié)合 WAF、API 網(wǎng)關(guān)、堡壘機(jī)等安全產(chǎn)品提升防護(hù)等級(jí)
十、訪問控制常見問題排查
- 控制未生效?
- 檢查 location 優(yōu)先級(jí)、正則匹配順序。
- 誤封正常用戶?
- 檢查 IP/Referer/UA 規(guī)則,避免誤傷。
- 限流后接口不可用?
- 合理設(shè)置 burst,允許偶發(fā)高峰。
- 黑名單太大影響性能?
- 用 geo、map 或 Lua 動(dòng)態(tài)判斷,避免配置膨脹。
十一、完整訪問控制配置示例
http {
geo $block_ip {
default 0;
1.2.3.4 1;
5.6.7.0/24 1;
}
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
listen 80;
server_name www.example.com;
if ($block_ip) { return 403; }
location /admin/ {
allow 192.168.1.100;
deny all;
auth_basic "Admin";
auth_basic_user_file /etc/nginx/.htpasswd;
}
location /static/ {
valid_referers none blocked *.example.com;
if ($invalid_referer) { return 403; }
}
location /api/ {
limit_req zone=req_limit burst=20 nodelay;
if ($request_method !~ ^(GET|POST)$) { return 405; }
if ($arg_token = "") { return 403; }
}
}
}十二、多級(jí)訪問控制策略
1. 服務(wù)全局、Server級(jí)、Location級(jí)控制
- http塊:全局黑名單/限流/Geo
- server塊:站點(diǎn)級(jí)白名單/認(rèn)證
- location塊:路徑級(jí)精細(xì)控制
示例:
http {
geo $block_ip { ... }
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s;
server {
if ($block_ip) { return 403; }
location /admin/ {
allow 10.0.0.0/8;
deny all;
}
location /api/ {
limit_req zone=req_limit burst=10 nodelay;
}
}
}建議高優(yōu)先級(jí)規(guī)則(如黑名單)放在上層,局部規(guī)則覆蓋全局。
十三、基于Header的訪問限制
1. 按Header內(nèi)容限制訪問
常用于API簽名、Token、特定應(yīng)用接入。
location /api/secure/ {
if ($http_x_token != "your-secret-token") {
return 403;
}
}2. 按Referer、Origin防止CSRF
if ($http_origin !~* ^https://trusted\.example\.com$) {
return 403;
}十四、按時(shí)間段控制訪問
適用于限時(shí)活動(dòng)、夜間維護(hù)、灰度發(fā)布等。
map $time_iso8601 $block_time {
default 0;
~T02:..:.. 1; # 02點(diǎn)整點(diǎn)到02:59:59 拒絕
}
server {
if ($block_time) {
return 403;
}
}也可用 Lua/定時(shí)腳本實(shí)現(xiàn)更復(fù)雜的時(shí)間控制。
十五、灰度/AB測試的訪問控制
1. 按用戶ID、Cookie、IP分流
map $cookie_abtest $upstream_group {
default "old";
"A" "new";
}
server {
location / {
proxy_pass http://$upstream_group;
}
}可結(jié)合 Lua 實(shí)現(xiàn)更靈活的灰度策略。
十六、動(dòng)態(tài)黑白名單(與外部系統(tǒng)結(jié)合)
1. 結(jié)合 Redis/MySQL 實(shí)現(xiàn)動(dòng)態(tài)名單
- 用 OpenResty/Lua 讀取 Redis/MySQL,將名單實(shí)時(shí)更新到共享內(nèi)存,支持熱更新。
- 適合大規(guī)模名單、頻繁變更場景。
示例:
access_by_lua_block {
local redis = require "resty.redis"
local red = redis:new()
red:connect("127.0.0.1", 6379)
local is_blocked = red:get("ip:" .. ngx.var.remote_addr)
if is_blocked == "1" then
ngx.exit(403)
end
}十七、日志、告警與審計(jì)
1. 記錄被拒絕訪問的請求
log_format rejectlog '$remote_addr $request $status $http_user_agent $time_local'; access_log /var/log/nginx/reject.log rejectlog if=$access_denied;
$access_denied 可用 map/Lua 動(dòng)態(tài)賦值。
2. 集成告警
- 結(jié)合 ELK、Prometheus、Zabbix,監(jiān)控 403/405 等異常請求,自動(dòng)觸發(fā)告警。
十八、自動(dòng)化管理與集中策略
1. 配置集中管理
- 采用 include 引入統(tǒng)一黑白名單、認(rèn)證配置,便于多站點(diǎn)維護(hù)。
include /etc/nginx/whitelist.conf; include /etc/nginx/blacklist.conf;
2. 自動(dòng)化工具
- 配合 Ansible/SaltStack/Puppet 實(shí)現(xiàn)名單、限流、認(rèn)證等策略的自動(dòng)分發(fā)和熱更新。
十九、與WAF/堡壘機(jī)/認(rèn)證系統(tǒng)集成
1. WAF防護(hù)
- 可用 Nginx+OpenResty/Lua-resty-waf 或接入云WAF,實(shí)現(xiàn)SQL注入、XSS等攻擊防護(hù)。
2. 堡壘機(jī)/認(rèn)證系統(tǒng)
- 重要接口后端部署堡壘機(jī)或認(rèn)證代理,前端Nginx只允許堡壘機(jī)IP訪問。
3. 第三方認(rèn)證(OAuth2、JWT等)
- 可用 Lua 動(dòng)態(tài)解析JWT、OAuth2 Token,按業(yè)務(wù)規(guī)則控制訪問。
二十、常見安全場景實(shí)戰(zhàn)
1. 管理后臺(tái)只允許公司IP+二次認(rèn)證
location /admin/ {
allow 10.0.0.0/8;
deny all;
auth_basic "Admin Only";
auth_basic_user_file /etc/nginx/.htpasswd;
}2. API接口防刷+簽名校驗(yàn)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
if ($http_x_sign = "") { return 403; }
}3. 靜態(tài)資源防盜鏈+限速
location /static/ {
valid_referers none blocked *.example.com;
if ($invalid_referer) { return 403; }
limit_rate 100k;
}二十一、訪問控制優(yōu)化建議
- 分層分級(jí)設(shè)計(jì),重要資源多重防護(hù)
- 動(dòng)態(tài)名單、限流、認(rèn)證與自動(dòng)化結(jié)合,提升響應(yīng)和運(yùn)維效率
- 日志與監(jiān)控全覆蓋,異常及時(shí)告警
- 定期安全審計(jì)和回溯,防止策略失效或被繞過
到此這篇關(guān)于Nginx 訪問控制的多種方法的文章就介紹到這了,更多相關(guān)Nginx 訪問控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx基于多個(gè)ip的虛擬主機(jī)的詳細(xì)配置
本文詳細(xì)介紹了如何使用nginx配置基于多個(gè)IP地址的虛擬主機(jī),通過虛擬主機(jī),可以優(yōu)化服務(wù)器資源,提高安全性和靈活性,節(jié)省IP資源,文章也提供了基于域名和端口的虛擬主機(jī)配置代碼,方便讀者參考實(shí)施2024-11-11
SpringBoot前端后端分離之Nginx服務(wù)器下載安裝過程
Nginx是一款輕量級(jí)的Web服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,這篇文章主要介紹了SpringBoot前端后端分離之Nginx服務(wù)器,需要的朋友可以參考下2022-08-08
詳解Nginx防盜鏈和Nginx訪問控制與Nginx解析php的配置
這篇文章主要介紹了詳解Nginx防盜鏈和Nginx訪問控制與Nginx解析php的配置的相關(guān)資料,這里提供實(shí)例幫助大家,學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08
Nginx?map?實(shí)現(xiàn)時(shí)間格式轉(zhuǎn)換的方法
最近我們需要把?Nginx?的日志接入到自研的日志采集平臺(tái)上,但是這個(gè)平臺(tái)只支持?JSON?格式,所以需要把?Nginx?日志格式改成?JSON?格式,這篇文章主要介紹了Nginx?map?實(shí)現(xiàn)時(shí)間格式轉(zhuǎn)換,需要的朋友可以參考下2023-09-09

