Nginx安全防護(hù)的多種方法
核心安全配置
1.編譯安裝 Nginx
(1)安裝支持軟件
Nginx 的配置及運(yùn)行需要 pcre、zlib 等軟件包的支持,因此應(yīng)預(yù)先安裝這些軟件的開發(fā)包(devel),以便提供相應(yīng)的庫和頭文件,確保 Nginx 的安裝順利完成。
[root@localhost “]# dnf install -y gcc make pcre-devel zlib-developenssl-devel perl-ExtUtils-MakeMaker git wget tar
(2)創(chuàng)建運(yùn)行用戶、組和日志目錄
[root@localhost]# useradd -M-s /sbin/nologin nginx [root@localhost# mkdir -p /var/log/nginx [root@localhost]#chown -R nginx:nginx /var/log/nginx
(3)編譯安裝 Nginx
[root@localhost ]# tar zxf nginx-l.26.3. tar.gz [root@localhost “]# cd nginx-1.26.3 [root@localhost nginx-l.26.3]#./configure--prefix=/usr/local/nginx --pid-path=/var/run/nginx.pid --user=nginx --group=nginx --with-http_ssl module --with-http v2 module --with-http realip module --with-http_stub status module\ #狀態(tài)統(tǒng)計(jì)模塊 with-http_gzip static module --with-pcre --with-stream [root@localhost nginx-l.26.3]# make && make install
為主程序 nginx 創(chuàng)建鏈接文件
[root@localhost nginx-1.26.3]# 1n-s /usr/local/nginx/sbin/nginx/usr/local/sbin/
(4)添加Nginx系統(tǒng)服務(wù)
[root@localhost]# vim /lib/systemd/system/nginx.service [Unit] Description=The NGINX HTTP and reverse proxy server After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/sbin/nginx-t ExecStart=/usr/local/sbin/nginx ExecReload=/usr/local/sbin/nginx-s reload ExecStop=/bin/ki11-S QUIT $MAINPID TimeoutStopSec=5 KillMode=process PrivateTmp=true User=root Group=root [Install] WantedBy=multi-user.target [root@localhost ~]#systemctl daemon-reload [root@localhost ~]#systemctl start nginx [root@localhost ~]#systemctl enable nginx
2.隱藏版本號(hào)
在生產(chǎn)環(huán)境中,需要隱藏 Nginx 的版本號(hào),以避免泄漏 Nginx 的版本,使攻擊者不能針對(duì)特定版本進(jìn)行攻擊。在隱藏版本號(hào)之前,可以使用 Fiddler 工具抓取數(shù)據(jù)包,查看Nginx 版本,也可以在 0penEuler 中使用命令 curl -Ihttp://192.168.10.202/查看:
[root@localhost ~]# curl -l 192.168.10.202
HTTP/1.1 200 OK
Server:nginx/1.26.3//版本號(hào)
... ... //省略部分內(nèi)容
#修改配置文件
[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; //隱藏版本號(hào)
... ... //省略部分內(nèi)容
[root@localhost ~]#nginx -t
[root@localhost ~]#nginx -s reload
[root@localhost ~]#curl -I 192.168.10.202
HTTP/1.1 200 OK
Server:nginx //版本號(hào)被隱藏
... ... //省略部分內(nèi)容3.限制危險(xiǎn)請(qǐng)求方法
不安全的請(qǐng)求方式,是潛在的安全風(fēng)險(xiǎn),TRACE(易引發(fā)XST攻擊)、PUT/DELETE(文件修改風(fēng)險(xiǎn))、CONNECT(代理濫用),通過正則表達(dá)式匹配請(qǐng)求方法,非白名單方法返回 444(無響應(yīng)關(guān)閉連接)
1.修改配置文件
[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
server {
... ...
if ($request_method !~"(GET HEAD|POST)$ ) {
return 444;
}
... ...
}
2.驗(yàn)證測(cè)試請(qǐng)求
測(cè)試 PUT/DELETE 請(qǐng)求
[root@localhost ~]#curl -XPUT -I 192.168.10.202
curl:(52)Empty reply from server
查看 access. log
192.168.10.202--[11/Mar/2025:18:30:46 +0800]"PUT / HTTP/1.1" 444 0 "-" "curl/8.4.0"PS:注意測(cè)試 TRACE 和 CONNECT 方法時(shí),狀態(tài)碼不是 444。原因如下:
- CONNECT 請(qǐng)求的目標(biāo)不是代理服務(wù)器時(shí),服務(wù)器必須返回400Bad Request,Nginx 核心層在請(qǐng)求解析階段直接攔截,根本不進(jìn)入后續(xù)的 location 處理流程
- 現(xiàn)代 Nginx默認(rèn)禁用 TRACE 方法,在 ngx http core module 階段直接返回 405 Not Allowed
4.請(qǐng)求限制(CC攻擊防御)
CC 攻擊(Challenge Collapsar 攻擊)是一種常見的網(wǎng)絡(luò)攻擊方式,通過大量合法或偽造的小流量請(qǐng)求來耗盡服務(wù)器資源,導(dǎo)致正常用戶無法訪問網(wǎng)站。要在 Nginx 中有效防止 CC 攻擊,可以采用多種策略和方法。
CC攻擊,也稱為連接數(shù)攻擊或請(qǐng)求速率限制攻擊,通過模擬大量用戶訪問來消耗服務(wù)器資源,從而使得正常用戶無法正常訪問網(wǎng)站。為了防止此類攻擊,可以使用 Nginx 提供的模塊來限制請(qǐng)求速率和并發(fā)連接數(shù)
(1)使用 Nginx的 limit req 模塊限制請(qǐng)求速率
編輯配置文件
[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
http {
# 定義限制區(qū)(10MB 內(nèi)存/每秒 10 請(qǐng)求)
limit_req_zone $binary_remote_addr zone=req_limit:l0m rate-10r/s;
# 其他全局配置...
server {
location / {
root html;
index index.html index.php;
limit_reg_zone=req_limit burst=20 nodelay;
}
... ...
}
}關(guān)鍵參數(shù)說明:
- limit_req_zone:定義共享內(nèi)存區(qū)
- $binary_remote_addr:是一個(gè)內(nèi)置變量,用于表示客戶端IP地址的二進(jìn)制格式
- zone=req_limit:10m 創(chuàng)建名為req_limit的共享內(nèi)存區(qū),大小10M,用來存儲(chǔ)客戶端IP
- rate=10r/s:限制并發(fā)數(shù),每個(gè)IP每秒可以發(fā)起的請(qǐng)求次數(shù)
- limit——req:實(shí)現(xiàn)速率限制
- zone=req_limit:綁定到預(yù)定義的共享內(nèi)存區(qū)
- burst=20:類似于等候區(qū),超出并發(fā)數(shù)的請(qǐng)求會(huì)等候區(qū),等候區(qū)占滿后,多余的請(qǐng)求會(huì)立刻返回503
- nodelay:立即處理突發(fā)請(qǐng)求而不延遲,相當(dāng)于立即處理等候區(qū)的請(qǐng)求,多余的請(qǐng)求會(huì)立刻返回503
(2)壓力測(cè)試驗(yàn)證
安裝 ab 測(cè)試工具
ApacheBench(簡(jiǎn)稱 ab)是 Apache HTTP 服務(wù)器自帶的一個(gè)輕量級(jí)、易用的HTTP服務(wù)器性能測(cè)試工具。它主要用于評(píng)估服務(wù)器在并發(fā)訪問下的性能表現(xiàn),包括響應(yīng)時(shí)間、吞吐量等關(guān)鍵指標(biāo)。
[root@localhost ~]#dnf install httpd-tools -y 發(fā)起測(cè)試請(qǐng)求 共發(fā)起 300 個(gè)請(qǐng)求,每次發(fā)起 30 個(gè)請(qǐng)求 [root@localhost ~]#ab -n 300 -c 30 http://192.168.10.202/ 查看 access.log 發(fā)現(xiàn)大量請(qǐng)求日志狀態(tài)碼 503 [root@localhost ~]#tail -300/usr/local/nginx/logs/access.log|grep -c 503 279
5.防盜鏈
防盜鏈(Hotlink Protection)是一種防止其他網(wǎng)站直接鏈接到你的服務(wù)器資源(如圖片、視頻、文件等)的技術(shù)。通過防盜鏈設(shè)置,可以避免他人盜用你的帶寬和服務(wù)器資源,提升安全性和資源利用率。
防盜鏈原理
防盜鏈的核心是檢查請(qǐng)求的 Referer 頭(HTTP 請(qǐng)求頭字段),判斷請(qǐng)求來源是否合法:
Referer頭表示當(dāng)前請(qǐng)求的來源頁面 URL。- 如果請(qǐng)求來自非法域名(如其他網(wǎng)站),Nginx 可以拒絕訪問或返回錯(cuò)誤。
Nginx 防盜鏈配置
Nginx 通過 valid_referers 指令實(shí)現(xiàn)防盜鏈,語法如下:
valid_referers none | blocked | server_names | string ...;
- none:允許沒有 Referer 頭的請(qǐng)求(如直接訪問)。
- blocked:允許 Referer 頭被防火墻或代理刪改的請(qǐng)求。
- server_names:允許指定的域名或服務(wù)器名。
- string:自定義允許的域名或正則表達(dá)式。
配置示例
以下是常見的防盜鏈配置場(chǎng)景:
1. 基礎(chǔ)防盜鏈配置
location ~* \.(jpg|jpeg|png|gif|mp4)$ {
valid_referers none blocked example.com *.example.net;
if ($invalid_referer) {
return 403;
# 或重定向到警告圖片
# rewrite ^ /anti-hotlink.jpg;
}
} - 作用:保護(hù)圖片和視頻文件。
- 邏輯:僅允許來自 example.com、*.example.net 的請(qǐng)求,或沒有 Referer 的請(qǐng)求(如瀏覽器直接訪問)。
- 阻止行為:非法請(qǐng)求返回 403 錯(cuò)誤碼。
2. 允許空 Referer(直接訪問)
valid_referers none blocked example.com *.example.net;
none:允許直接輸入 URL 或本地文件打開的資源請(qǐng)求。blocked:允許 Referer 被防火墻修改的請(qǐng)求。
3. 高級(jí)配置(安全鏈)
通過生成加密鏈接防止盜鏈(需配合程序生成臨時(shí) URL):
location /protected/ {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr secret";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410; # 鏈接過期
}
} 注意事項(xiàng)
Referer 的局限性
- Referer 可能被偽造(需結(jié)合其他方法如 Token 驗(yàn)證)。
- 部分瀏覽器或隱私設(shè)置可能不發(fā)送 Referer。
靜態(tài)資源與動(dòng)態(tài)資源
- 靜態(tài)資源(如圖片)通常通過
location匹配文件擴(kuò)展名。 - 動(dòng)態(tài)資源(如 API)可通過校驗(yàn) Token 或簽名。
日志記錄
可記錄非法請(qǐng)求用于分析:
log_format hotlink '$time_iso8601 $invalid_referer $http_referer'; access_log /var/log/nginx/hotlink.log hotlink;
案例
(1)修改 Windows 的C:\Windows\System32\drivers\etc\hosts 文件,設(shè)置域
名和 IP 映射關(guān)系
192.168.10.202 www. aaa.com 192.168.10.201 www.bbb.com
(2)修改兩臺(tái)Cent0s 的 hosts 文件,設(shè)置域名和 IP 映射關(guān)系
192.168.10.202 www.aaa.com 192.168.10.201 www.bbb.com
(3)把圖片 1ogo.jpg 放到源主機(jī)(www.aaa.com)的工作目錄下
[root@localhost ~]#ls /usr/local/nginx/html index.html kgc.png
(4)編輯原網(wǎng)站首頁文件
[root@localhost ~]#vim /usr/local/nginx/html/index.html
<html>
<body>
<hl>aaa It work!
<img src="kgc.png”/〉 //網(wǎng)頁中顯示圖片的代碼
</h1>
</body>
</htm1>(5)測(cè)試訪問源網(wǎng)站
(6)編輯盜鏈網(wǎng)站首頁文件
[root@localhost ~]#vim /usr/local/nginx/html/index.html
<html>
<body>
<hl>bbb It work!
<img src="http://www.aaa.com/kgc.png”/> //網(wǎng)頁中顯示圖片
</h1>
</body>
</htm1>(7)測(cè)試訪問盜鏈網(wǎng)站(盜鏈成功)
(8)配置Nginx防盜鏈
[root@localhost #vim /usr/local/nginx/conf/nginx.conf
location *.(gifljpg jpeg pnglbmp|swf|flv mp4 webplico)$ {
root html;
valid referers aaa.com *.aaa.com;
if($invalid referer) {
return 403;
}
[root@localhost ~]#nginx -t
[root@localhost ~]#nginx -s reload- ~*\.(jpg|gif|swf)$:這段正則表達(dá)式表示匹配不區(qū)分大小寫,以.jpg或. gif 或.swf 結(jié)尾的文件;
- Valid referers:設(shè)置信任的網(wǎng)站,可以正常使用圖片;
- 后面的網(wǎng)址或者域名:referer 中包含相關(guān)字符串的網(wǎng)址;
- If 語句:如果鏈接的來源域名不在 valid referers 所列出的列表中,$invalid referer 為1,則執(zhí)行后面的操作,即進(jìn)行重寫或返回 403 頁面。
(9)測(cè)試訪問盜鏈網(wǎng)站(盜鏈?zhǔn)。?/p>
到此這篇關(guān)于Nginx安全防護(hù)的多種方法的文章就介紹到這了,更多相關(guān)Nginx安全防護(hù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx部署vue項(xiàng)目,給訪問路徑加前綴的實(shí)現(xiàn)
這篇文章主要介紹了nginx部署vue項(xiàng)目,給訪問路徑加前綴的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
nginx主動(dòng)健康檢查功能實(shí)現(xiàn)
nginx_upstream_check_module是一個(gè)Nginx的第三方模塊,它可以實(shí)現(xiàn) Nginx的主動(dòng)健康檢查功能,本文將介紹一個(gè)基于 Nginx 的第三方模塊 nginx_upstream_check_module,它可以實(shí)現(xiàn) Nginx 的主動(dòng)健康檢查功能,可以幫助我們更加有效地管理后端服務(wù)器,需要的朋友可以參考下2023-05-05
Nginx配置多個(gè)訪問路徑的實(shí)現(xiàn)
本文主要介紹了Nginx配置多個(gè)訪問路徑的實(shí)現(xiàn),Nginx通過配置多個(gè)service就可以實(shí)現(xiàn)多訪問路徑,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
蘋果M1芯片安裝nginx 并且部署vue項(xiàng)目步驟詳解
在本篇文章里小編給大家整理了一篇關(guān)于蘋果M1芯片安裝nginx 并且部署vue項(xiàng)目步驟詳解內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-11-11
Nginx?Tomcat負(fù)載均衡動(dòng)靜分離原理解析
這篇文章主要為大家介紹了Nginx?Tomcat負(fù)載均衡動(dòng)靜分離原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
解決Nginx location中配置proxy_pass轉(zhuǎn)發(fā)時(shí)斜線‘/‘導(dǎo)致404問題
這篇文章主要介紹了解決Nginx location中配置proxy_pass轉(zhuǎn)發(fā)時(shí)斜線‘/‘導(dǎo)致404問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
nginx實(shí)現(xiàn)單主機(jī)多域名映射的項(xiàng)目實(shí)踐
本文主要介紹了nginx實(shí)現(xiàn)單主機(jī)多域名映射的項(xiàng)目實(shí)踐,配置不同的子域名映射到不同的內(nèi)部服務(wù)端口,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02

