Nginx反向代理和負載均衡的安全加固方案
針對 Nginx 反向代理和負載均衡場景的安全加固,核心是保護代理鏈路、控制后端服務(wù)暴露、防止流量攻擊和強化節(jié)點安全。下面我會結(jié)合反向代理 / 負載均衡的核心特性,給出可落地的加固方案,包含具體配置和權(quán)限設(shè)置。
一、反向代理安全加固
反向代理的核心風(fēng)險是:代理配置不當導(dǎo)致后端服務(wù)暴露、請求偽造、緩存攻擊、DDoS 穿透到后端等。
1. 隱藏后端服務(wù)信息(核心)
避免通過響應(yīng)頭泄露后端服務(wù)器的 IP、版本等信息:
http {
# 1. 隱藏 Nginx 自身版本(基礎(chǔ)加固)
server_tokens off;
# 2. 清除/重寫后端響應(yīng)頭(防止泄露后端信息)
proxy_hide_header X-Powered-By; # 隱藏后端語言(如 PHP/Java)標識
proxy_hide_header Server; # 隱藏后端服務(wù)器版本
proxy_hide_header X-AspNet-Version;
# 3. 自定義響應(yīng)頭(可選)
add_header Server "Proxy Server" always;
# 4. 禁止傳遞客戶端 IP 外的敏感頭
proxy_set_header Accept-Encoding ""; # 防止壓縮攻擊
proxy_set_header X-Real-IP $remote_addr; # 僅傳遞真實IP(按需)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}2. 限制代理請求范圍(防止越權(quán)訪問后端)
僅代理指定路徑 / 域名,禁止訪問后端敏感接口:
server {
listen 443 ssl;
server_name proxy.example.com;
# 僅代理 /api 路徑到后端
location /api/ {
proxy_pass http://backend_server/;
proxy_set_header Host $host;
proxy_connect_timeout 5s; # 縮短連接超時,防止掛起
proxy_read_timeout 10s;
proxy_send_timeout 10s;
# 禁止訪問后端敏感路徑
if ($request_uri ~* "/admin|/config|/sql|/phpmyadmin") {
return 403;
}
}
# 禁止直接訪問代理服務(wù)器的其他路徑
location / {
return 403;
}
}3. 防止請求偽造(CSRF/Host 頭攻擊)
server {
# 1. 驗證 Host 頭,防止 Host 頭偽造
if ($host !~ ^(proxy.example.com|www.example.com)$) {
return 403;
}
# 2. 限制請求方法(僅允許必要的方法)
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 405;
}
# 3. 添加 CSRF 防護頭(針對后端接口)
add_header X-CSRF-Protection "1; mode=block" always;
}4. 代理緩存安全(防止緩存污染)
若啟用代理緩存,需避免緩存敏感數(shù)據(jù):
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location /api/ {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 1. 不緩存認證/敏感請求
proxy_cache_bypass $http_cookie $http_authorization;
proxy_no_cache $http_cookie $http_authorization;
# 2. 緩存文件權(quán)限加固
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
# 3. 防止緩存鍵污染
proxy_cache_key "$scheme$request_method$host$request_uri";
}
}
}
# 緩存目錄權(quán)限加固(僅 nginx 用戶可訪問)
chown -R nginx:nginx /var/cache/nginx
chmod -R 700 /var/cache/nginx二、負載均衡安全加固
負載均衡的核心風(fēng)險是:節(jié)點暴露、流量不均導(dǎo)致單點過載、健康檢查漏洞、DDoS 攻擊穿透到所有節(jié)點。
1. 后端節(jié)點隱藏與隔離
http {
# 1. 定義后端節(jié)點池(僅內(nèi)網(wǎng)可訪問,禁止公網(wǎng)暴露)
upstream backend_pool {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
# 負載均衡算法(默認輪詢,可選更安全的方式)
ip_hash; # 綁定IP到固定節(jié)點,防止會話劫持(適合有狀態(tài)服務(wù))
# least_conn; # 最少連接數(shù),防止節(jié)點過載
# 2. 啟用慢啟動(防止故障恢復(fù)后瞬間過載)
slow_start 60s;
# 3. 禁用不健康節(jié)點自動恢復(fù)(需手動確認)
# down; # 標記節(jié)點為永久下線
}
server {
listen 443 ssl;
server_name lb.example.com;
location / {
proxy_pass http://backend_pool;
# 4. 禁止客戶端直接訪問后端節(jié)點IP
if ($http_referer ~* "192.168.1.") {
return 403;
}
}
}
}2. 健康檢查加固(防止流量路由到故障節(jié)點)
Nginx 原生健康檢查基礎(chǔ)版,進階可使用 ngx_http_upstream_module 或第三方模塊(如 nginx-plus):
upstream backend_pool {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
# 基礎(chǔ)健康檢查(通過失敗次數(shù)判斷)
# max_fails:失敗3次標記為不可用
# fail_timeout:30秒內(nèi)不重試故障節(jié)點
}
# 進階:主動健康檢查(需 Nginx Plus 或 OpenResty)
# upstream backend_pool {
# zone backend 64k;
# server 192.168.1.10:8080;
# server 192.168.1.11:8080;
# health_check interval=5s fails=2 passes=2 uri=/health;
# }3. 流量控制(防止 DDoS 穿透到后端)
限制單 IP / 單節(jié)點的并發(fā)和請求速率,保護后端集群:
http {
# 1. 限制單IP并發(fā)連接(負載均衡層攔截)
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 50; # 單IP最大50個并發(fā)
# 2. 限制請求速率(防CC攻擊)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
listen 443 ssl;
server_name lb.example.com;
location / {
# 速率限制:突發(fā)20個請求,超出返回503
limit_req zone=req_limit burst=20 nodelay;
# 3. 限制后端節(jié)點的最大連接數(shù)
proxy_pass http://backend_pool;
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
proxy_buffering on; # 啟用緩沖,減少后端壓力
}
}
}4. 負載均衡節(jié)點權(quán)限加固
# 1. 負載均衡服務(wù)器僅開放 80/443 端口(防火墻) firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp firewall-cmd --reload # 2. 禁止負載均衡服務(wù)器訪問互聯(lián)網(wǎng)(僅內(nèi)網(wǎng)通向后端) # 編輯 /etc/sysctl.conf,禁用IP轉(zhuǎn)發(fā)(防止成為跳板) echo "net.ipv4.ip_forward = 0" >> /etc/sysctl.conf sysctl -p # 3. 后端節(jié)點僅允許負載均衡服務(wù)器訪問 # 在后端節(jié)點防火墻添加規(guī)則(以 firewalld 為例) firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="負載均衡IP" port protocol="tcp" port="8080" accept' firewall-cmd --permanent --add-port=8080/tcp --remove-port=8080/tcp # 禁止其他IP訪問 firewall-cmd --reload
三、通用加固(反向代理 + 負載均衡)
1. HTTPS 端到端加密(代理→后端也加密)
避免代理與后端之間的明文傳輸:
upstream backend_pool {
# 后端節(jié)點使用 HTTPS
server 192.168.1.10:443;
server 192.168.1.11:443;
}
server {
listen 443 ssl;
server_name lb.example.com;
location / {
proxy_pass https://backend_pool;
# 驗證后端證書(防止中間人攻擊)
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_ssl_trusted_certificate /etc/nginx/ssl/backend_ca.crt;
proxy_ssl_session_reuse on;
}
}2. 審計日志加固
記錄所有代理 / 負載均衡的訪問日志,便于溯源攻擊:
http {
log_format proxy_log '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$upstream_addr $upstream_status $upstream_response_time';
server {
listen 443 ssl;
server_name lb.example.com;
# 訪問日志記錄詳細信息
access_log /var/log/nginx/proxy_access.log proxy_log;
error_log /var/log/nginx/proxy_error.log warn;
}
}
# 日志權(quán)限加固
chown -R nginx:nginx /var/log/nginx
chmod -R 700 /var/log/nginx四、驗證加固效果
# 1. 檢查配置語法 nginx -t # 2. 重啟 Nginx systemctl restart nginx # 3. 驗證后端節(jié)點是否暴露 curl -I http://lb.example.com # 響應(yīng)頭不應(yīng)包含后端節(jié)點IP/版本 # 4. 驗證速率限制 ab -n 100 -c 60 http://lb.example.com/ # 模擬高并發(fā),應(yīng)返回503 # 5. 檢查日志是否正常記錄 tail -f /var/log/nginx/proxy_access.log
總結(jié)
- 反向代理核心:隱藏后端信息、限制請求范圍、防止緩存污染、驗證 Host 頭,避免后端服務(wù)暴露;
- 負載均衡核心:隔離后端節(jié)點(僅內(nèi)網(wǎng)訪問)、強化健康檢查、控制流量速率 / 并發(fā),防止 DDoS 穿透到所有節(jié)點;
- 通用加固:端到端 HTTPS 加密、詳細審計日志、最小權(quán)限配置,形成代理→后端的完整安全鏈路。
到此這篇關(guān)于Nginx(反向代理、負載均衡)安全加固的文章就介紹到這了,更多相關(guān)nginx安全加固內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx index指令使用及設(shè)置網(wǎng)站默認首頁
index指令用于指定處理請求時使用的默認文件,本文主要介紹了Nginx index指令使用及設(shè)置網(wǎng)站默認首頁,具有一定的參考價值,感興趣的可以了解一下2024-07-07
nginx實現(xiàn)http轉(zhuǎn)換為https的項目實踐
Nginx作為Web服務(wù)器時,可以通過配置實現(xiàn)HTTP跳轉(zhuǎn)HTTPS,本文主要介紹了nginx實現(xiàn)http轉(zhuǎn)換為https的實踐,具有一定的參考價值,感興趣的可以了解一下2025-03-03
Nginx跨域代理的完整排坑指南(從證書錯誤到CORS配置)
本文詳細記錄了一個項目中使用Nginx作為反向代理解決跨域問題的過程,從為子域名申請獨立SSL證書、處理CORS預(yù)檢請求、避免add_header語法錯誤、正確設(shè)置代理Host頭、以及后端HTTPS證書問題等方面逐一排查并解決,最終得到正確的Nginx配置,需要的朋友可以參考下2026-04-04
深入解析nginx-proxy/acme-companion高級部署方案
nginx-proxy/acme-companion項目提供了一種優(yōu)雅的解決方案,能夠自動為Docker容器管理的服務(wù)提供HTTPS支持,本文將重點介紹該項目的高級部署模式,幫助開發(fā)者構(gòu)建更安全、更靈活的容器化Web服務(wù)環(huán)境,感興趣的可以了解一下2026-05-05
Nginx反向代理出現(xiàn)502與504錯誤問題詳解及排查指南
Nginx 作為反向代理服務(wù)器時,502(Bad Gateway)和 504(Gateway Timeout)錯誤是常見的兩類問題,下面我們就來看看這兩個錯誤問題的排查與解決吧2025-05-05

