Nginx服務之防盜鏈功能

Nginx防盜鏈

一.原理

二.配置指令

三.實例配置

一.原理

盜鏈是一種損害原有網站合法利益,給原網站所在服務器造成額外負擔的非法行爲。要採取防盜鏈的措施,首先需要了解盜鏈的實現原理。 客戶端向服務器請求資源時,爲了減少網絡帶寬,提高響應時間,服務器一般不會一次將所有資源完整地傳回給客戶端。比如在請求一個網頁時,首先會傳回該網頁的文本內容,當客戶端瀏覽器在解析文本的過程中發現有圖片存在時,會再次向服務器發起對該圖片資源的請求,服務器將存儲的圖片資源再發送給客戶端。在這個過程中,如果該服務器上只包含了網頁的文本內容,並沒有存儲相關的圖片資源,而是將圖片資源鏈接到其他站點的服務器上去了,這就形成了盜鏈行爲。

wKioL1gsBdbTaORsAAEfiXw75v4402.png-wh_50

比如內網用戶通過Internet訪問域名爲www.test.com這個服務器上的WEB服務,而該服務器沒有存儲圖片資源,而是將圖片鏈接到域名爲www.fz.com服務器上,這就形成了盜鏈行爲。這種情況下客戶端請求 圖片資源實際上是來自其他的服務器。

要實現防盜鏈,需要了解HTTP協議中的請求頭部的Referer頭域和採用URL的格式表示訪問當前網頁或者文件的源地址。通過該頭域的值,我們可以檢測到訪問目標資源的源地址。這樣,如果我們檢測到Referer頭域中的值並不是自己站點內的URL,就採取組織措施,實現防盜鏈。

需要注意是,由於Referer頭域中的值可以被更改的,因此該方法不能完全阻止所有盜鏈行爲。


二.配置指令

Nginx配置中有一個指令valid_referers,用來獲取Referer頭域中的值,並且根據該值的情況給Nginx全局變量$invalid_referer的值,如果Referer頭域中沒有符合valid_referers指令配置的值,$invalid_referer變量將會被賦值爲1。

valid_referer指令的語法結構爲:

valid_referers none | blocked | server_names | string ....;
none 檢測Referer頭域不存在的請求
blocked 檢測Referer頭域的值被防火牆或者代理服務器刪除或僞裝的情況。
這種情況下,該頭域的值不以“http://”或者“https://”開頭
server_names 設置一個或多個URL,檢測Referer頭域的值是否是這些URL中的某個。
從nginx 0.5.33以後支持使用通配符“*”。


三.實例配置

環境:2臺CentOS6操作系統的主機

盜鏈服務器的IP爲192.168.16.133 域名www.test.com

被盜鏈服務器爲192.168.16.130  域名www.fz.com

一臺win7客戶端用來測試,IP爲192.168.16.128

最終達到的效果是,www.fz.com站點成功防盜鏈,而且將客戶端請求的URL重寫爲http://summer.fz.com/123.jpg,成功防止盜鏈行爲。


1.盜鏈服務器的配置

(1)查看Linux服務器版本

[root@nginx ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@nginx ~]# uname -r
2.6.32-573.el6.x86_64

(2)然後我提前編譯安裝好了Nginx服務,這是nginx版本

[root@nginx ~]# nginx -v
nginx version: nginx/1.11.5

(3)編輯nginx配置文件,創建一個測試的站點

server {              				server標籤
listen       80;      				偵聽80端口
server_name  www.test.com;     			域名爲www.test.com 
location / {   					location塊
root   /var/html/test;   			網站根目錄在/var/html/test
index  index.html index.htm; 			index首頁
access_log      logs/test_access.log;  		訪問日誌路徑
error_log       logs/test_error.log;        	錯誤日誌路徑
}

(4)檢測語法,平滑重啓

[root@nginx test]# nginx -t  檢測語法,是否有錯誤
nginx: the configuration file /application/nginx-1.10.1/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.1/conf/nginx.conf test is successful
[root@nginx test]# nginx -s reload 平滑重啓



2.被盜鏈服務器的配置

(1)查看Linux版本

[root@LNMP ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@LNMP ~]# uname -r
2.6.32-573.el6.x86_64

(2)然後我也是提前編譯安裝好了Nginx服務,這是nginx版本

[root@LNMP ~]# nginx -v
nginx version: nginx/1.10.1

(3)編輯nginx配置文件,創建一個測試的站點

 server {
         listen       80;
         server_name  www.fz.com;
         root    /var/html/fz;
         access_log logs/fz_access.log;
         error_log  logs/fz_error.log;
}

(4)檢測語法,平滑重啓

[root@LNMP conf]# nginx -t
nginx: the configuration file /application/nginx-1.10.1/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.1/conf/nginx.conf test is successful
[root@LNMP conf]# nginx -s reload


3.現在基本都搭建好,現在www.test.com站點服務器上添加一個html文件

(1)echo雙引號的內容的意思是,當客戶端訪問自身服務器的www.test.com圖片資源時,由於沒有圖片提供給客戶端,將圖片資源鏈接到www.fz.com上,從而返回給客戶端。

[root@nginx conf]# cd /var/html/test/
[root@nginx test]# echo "<img src = "http://www.fz.com/p_w_picpaths/blog-img1.jpg">" > index.html

客戶端用瀏覽器訪問www.test.com,返回的是www.fz.com上 圖片資源 ,盜鏈成功

wKiom1gsGoqgo8BMAACRqPvt55k279.png-wh_50

可以看到Referer的頭域的值來自www.test.com


(2)根據文件類型實現防盜鏈的配置實例

在www.fz.com服務器上編輯nginx.conf配置文件

 28     server {
 29         listen       80;
 30         server_name  www.fz.com;
 31         root    /var/html/fz;
 32         location ~ .*\.(gif|jpg|png|flv|swf|rar|zip)$  
 33         {
 34         valid_referers fz.com *.fz.com;
 35         if ($invalid_referer)
 36         {
 37         rewrite ^/ http://summer.fz.com/123.jpg;
 38         }
 39 }
 40 }
 41         server {
 42         listen  80;
 43         server_name summer.fz.com;
 44         root /var/html/time;
 46 }
 47 }

在配置中,32行當有網絡連接對以gid、jpg、png爲後綴的圖片資源、以flv、swf爲後綴的媒體資源以rar、zip爲後綴的壓縮存檔資源發起請求時,34行如果檢測到Referer頭域中沒有符合valid_referers指令配置的值,就將客戶端請求 URL重寫爲http://summer.fz.com/123.jpg。


爲什麼還要一個server標籤,這是有原因的,當時自己看書看博文學習做實驗的時候,發現一直跳轉不到想要的結果,而是一個空白頁面,幾經周折,在51的博文無意發現關於Nginx防盜鏈的一段話,就是37行的rewrite ^/ http://summer.fz.com/123.jpg

這個圖片是盜鏈返回的圖片,也就是替換盜鏈網站所有盜鏈的圖片。這個圖片要放在沒有設置防盜鏈的網站上,因爲防盜鏈的作用,這個圖片如果也放在防盜鏈網站上就會被當作防盜鏈顯示不出來了,盜鏈者的網站所盜鏈圖片會顯示X符號。

     

所以爲了達到自己期待效果,新建一個server標籤,讓URL重寫到該站點下的圖片。

最後,我用客戶端再次訪問www.test.com,看看結果怎樣?

wKioL1gsIqnC5d0EAACSqgEIhcs005.png-wh_50


可以看到請求頭信息和原始頭信息,因爲www.fz.com做了防盜鏈,只要不是以*.fz.com域名的訪問,都轉到summer.fz.com/123.jpg去。


最後補充一下,這只是個人的做法,以供參考,那個畫圖IP地址是練習用的,公網上不能用私有地址的啦。

謝謝各位,成功那刻,心裏美滋滋的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章