lnmp 防盜鏈 訪問控制 反向代理

1 nginx 配置防盜鏈

防盜鏈的原理我們在lamp中已經有介紹,這裏不再重復,直接看配置過程。
核心語句為

  valid_referers none blocked server_names  *.test.com ;
    if ($invalid_referer) {
        return 403;
    }

當然我們要將其放在location裏面,結合之前的緩存有效期配置,就形成如下結構

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
     {
          expires      7d;    //針對上面匹配的文件,設置緩存時間為7天
          valid_referers none blocked server_names  *.test.com ;   //指定有效的referer 
          if ($invalid_referer) {
                 return 403;        //  如果是無效的referer,則禁止訪問,返回403
          }     
          access_log off;     //針對以上location匹配的文件不記錄訪問日誌
    }     

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 -I -e "http://www.baidu.com/1.txt" test.com/2.jpg
技術分享圖片
curl -x127.0.0.1:80 -I -e "http://test.com/1.txt" test.com/2.jpg
技術分享圖片

2 訪問控制

需求一,針對admin目錄做一個訪問限制,只允許本機127.0.0.1訪問,拒絕其他所有ip。配置如下

location /admin/
{ allow 127.0.0.1;
 deny all;
}

我們先來看下他的邏輯,在apache中,有一個 order ,會定義deny和allow的一個先後執行順序,而且每條規則都會去匹配。比如針對當前這個需求配置時這樣的

 <Directory /data/wwwroot/www.123.com/admin/>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Directory>

若果將上面改為Order allow,deny 則會deny 所有,allow 語句失效。在nginx 裏面從上往下只要匹配到規則就結束。第一條規則匹配到就不會去匹配第二條規則。

curl -x127.0.0.1:80 test.com/admin/index.html
curl -x192.168.226.130:80 test.com/admin/index.html

技術分享圖片
其中 192.168.226.130 是本機ens33 網卡ip
如果只限制個別ip 訪問則可以寫成

location /admin/
{  
    deny 192.168.226.130;
 }

默認是允許所有的。不需要寫allow all 了
也可以匹配正則限制

location ~ .*(upload|image)/.*\.php$
{
        deny all;
}

這樣就拒絕請求了upload或者image目錄下的php文件
備註:該段配置要加在解析php的配置前面,否則不能限制解析php
技術分享圖片
限制指定use_agent的域名訪問,匹配符~後面的*可以忽略大小寫匹配

if ($http_user_agent ~* ‘Spider/3.0|YoudaoBot|Tomato‘)
{
      return 403;
}
curl -x127.0.0.1:80 test.com -A "spider/3.0"

技術分享圖片
意思是限制一些爬蟲,或者有道機器人,或者tomato相關的訪問。就是可以有針對性的限制某些訪問。

3 解析php 配置

location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
    }

fastcgi_pass unix:/tmp/php-fcgi.sock; 該行指定監聽php-fpm的socket,可以是ip加端口的形式,寫法要和php-fpm配置文件保持一致。對應行為 listen = /tmp/php-fcgi.sock。配置文件為 /usr/local/php-fpm/etc/php-fpm.conf,我們安裝php時有指定配置文件路徑。
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;該行中的
/data/wwwroot/test.com 要跟虛擬主機保持一致
vim /data/wwwroot/test.com/2.php
寫入一下內容

<?php
echo "a really php script";
?>

執行-s reload 後curl 測試
curl -x127.0.0.1:80 test.com/2.php
技術分享圖片

4 nginx 代理

代理服務器:
通常說的代理就是正向代理,正向代理的過程隱藏了真實的客戶端,服務端不知道真實的客戶端是誰,×××服務器,就是正向代理。反向代理代理的是服務端,隱藏了真實的服務端。
正向代理中,proxy和client同屬一個LAN
反向代理中,proxy和server同屬一個LAN
技術分享圖片
編輯一個新的虛擬主機

vim /usr/local/nginx/conf/vhost/proxy.conf
 server
{
    listen 80;
    server_name proxybaidu.com; //本地代理服務器器域名

    location /
    {
        proxy_pass      http://61.135.169.125/;  //被代理的服務器ip
        proxy_set_header Host www.baidu.com; //指定被代理的服務器域名
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
crul -x127.0.0.1:80 proxybaidu.com

技術分享圖片
我們發現通過本地內網訪問到了百度首頁。為了理解代理,特意將代理服務器域名重命名了下,通常代理服務器域名會寫的和提供網站資源的服務器域名一樣,這樣對於客戶端來說就不會去區分,省去很多麻煩。百度這個ip 我們通過ping www.baidu.com 來獲取。
總結:上面實驗就是一個反向代理。怎麽理解反響代理隱藏服務端,代理服務器和真實服務端處於同一子網呢?該實驗我將proxybaidu.com更改為baidu.com,然後在windos 主機上設置本地dns ,再去訪問百度,完全看不出來是從我的虛擬機web中取的數據,因此隱藏了服務端。那麽為什麽說我的虛擬機web 和百度處於同一子網呢,回答這個問題之前,我先說下很關鍵的一點,就是我們所說的服務器和客戶端,局域網和公網,或者同一子網都是相對意義上的概念,單獨討論沒有意義。-x127.0.0.1:80 就是指定本地私網,對於該回環地址來說,因為我們的虛擬機 nat 到了主機所處的公網裏,所以從整體上看來我們的虛擬機web 和百度是處於同一子網的。

Linux學習總結(四十二)lnmp訪問控制篇