Nginx 訪問控制的多種方法
一、IP 白名單與黑名單
1. 允許/拒絕指定IP
location /admin/ {
allow 192.168.1.100; # 僅允許該IP訪問
allow 10.0.0.0/24; # 或允許整個網段
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ī)模黑名單。
二、基于路徑、方法、參數的訪問控制
1. 路徑限制
location /private/ {
deny all;
}2. 方法限制
location /api/ {
if ($request_method !~ ^(GET|POST)$) {
return 405;
}
}3. 參數限制
location /api/ {
if ($arg_token = "") {
return 403;
}
}三、HTTP 基本認證(Basic Auth)
1. 啟用賬號密碼訪問控制
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;
}五、客戶端證書校驗(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. 連接數限制
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 安全與精細控制
1. 精細化路徑/參數/方法控制
location /api/admin/ {
allow 127.0.0.1;
deny all;
}
location ~* /api/(delete|update)/ {
if ($request_method != "POST") {
return 405;
}
}2. 配合 OpenResty/Lua 動態(tài)訪問控制
可以根據業(yè)務邏輯、數據庫、Redis等動態(tài)判斷是否允許訪問。
九、企業(yè)級訪問控制建議
- 重要接口建議多重保護(IP+密碼+限流+Referer)
- 敏感路徑建議只對內網或特定用戶開放
- 日志記錄所有被拒絕的訪問,便于審計和溯源
- 定期更新黑名單、白名單,防止失效
- 結合 WAF、API 網關、堡壘機等安全產品提升防護等級
十、訪問控制常見問題排查
- 控制未生效?
- 檢查 location 優(yōu)先級、正則匹配順序。
- 誤封正常用戶?
- 檢查 IP/Referer/UA 規(guī)則,避免誤傷。
- 限流后接口不可用?
- 合理設置 burst,允許偶發(fā)高峰。
- 黑名單太大影響性能?
- 用 geo、map 或 Lua 動態(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; }
}
}
}十二、多級訪問控制策略
1. 服務全局、Server級、Location級控制
- http塊:全局黑名單/限流/Geo
- server塊:站點級白名單/認證
- location塊:路徑級精細控制
示例:
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)先級規(guī)則(如黑名單)放在上層,局部規(guī)則覆蓋全局。
十三、基于Header的訪問限制
1. 按Header內容限制訪問
常用于API簽名、Token、特定應用接入。
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;
}十四、按時間段控制訪問
適用于限時活動、夜間維護、灰度發(fā)布等。
map $time_iso8601 $block_time {
default 0;
~T02:..:.. 1; # 02點整點到02:59:59 拒絕
}
server {
if ($block_time) {
return 403;
}
}也可用 Lua/定時腳本實現更復雜的時間控制。
十五、灰度/AB測試的訪問控制
1. 按用戶ID、Cookie、IP分流
map $cookie_abtest $upstream_group {
default "old";
"A" "new";
}
server {
location / {
proxy_pass http://$upstream_group;
}
}可結合 Lua 實現更靈活的灰度策略。
十六、動態(tài)黑白名單(與外部系統(tǒng)結合)
1. 結合 Redis/MySQL 實現動態(tài)名單
- 用 OpenResty/Lua 讀取 Redis/MySQL,將名單實時更新到共享內存,支持熱更新。
- 適合大規(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
}十七、日志、告警與審計
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 動態(tài)賦值。
2. 集成告警
- 結合 ELK、Prometheus、Zabbix,監(jiān)控 403/405 等異常請求,自動觸發(fā)告警。
十八、自動化管理與集中策略
1. 配置集中管理
- 采用 include 引入統(tǒng)一黑白名單、認證配置,便于多站點維護。
include /etc/nginx/whitelist.conf; include /etc/nginx/blacklist.conf;
2. 自動化工具
- 配合 Ansible/SaltStack/Puppet 實現名單、限流、認證等策略的自動分發(fā)和熱更新。
十九、與WAF/堡壘機/認證系統(tǒng)集成
1. WAF防護
- 可用 Nginx+OpenResty/Lua-resty-waf 或接入云WAF,實現SQL注入、XSS等攻擊防護。
2. 堡壘機/認證系統(tǒng)
- 重要接口后端部署堡壘機或認證代理,前端Nginx只允許堡壘機IP訪問。
3. 第三方認證(OAuth2、JWT等)
- 可用 Lua 動態(tài)解析JWT、OAuth2 Token,按業(yè)務規(guī)則控制訪問。
二十、常見安全場景實戰(zhàn)
1. 管理后臺只允許公司IP+二次認證
location /admin/ {
allow 10.0.0.0/8;
deny all;
auth_basic "Admin Only";
auth_basic_user_file /etc/nginx/.htpasswd;
}2. API接口防刷+簽名校驗
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)化建議
- 分層分級設計,重要資源多重防護
- 動態(tài)名單、限流、認證與自動化結合,提升響應和運維效率
- 日志與監(jiān)控全覆蓋,異常及時告警
- 定期安全審計和回溯,防止策略失效或被繞過
到此這篇關于Nginx 訪問控制的多種方法的文章就介紹到這了,更多相關Nginx 訪問控制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot前端后端分離之Nginx服務器下載安裝過程
Nginx是一款輕量級的Web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,這篇文章主要介紹了SpringBoot前端后端分離之Nginx服務器,需要的朋友可以參考下2022-08-08
詳解Nginx防盜鏈和Nginx訪問控制與Nginx解析php的配置
這篇文章主要介紹了詳解Nginx防盜鏈和Nginx訪問控制與Nginx解析php的配置的相關資料,這里提供實例幫助大家,學習理解這部分內容,需要的朋友可以參考下2017-08-08

