溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nginx訪問控制

發(fā)布時間:2020-07-21 23:18:46 來源:網(wǎng)絡 閱讀:182 作者:大屁孩兒 欄目:系統(tǒng)運維

Nginx的deny和allow
https://coding.net/u/aminglinux/p/nginx/git/blob/master/access/deny_allow.md

Nginx訪問控制 —— deny_allow

Nginx的deny和allow指令是由ngx_http_access_module模塊提供,Nginx安裝默認內置了該模塊。
除非在安裝時有指定 --without-http_access_module。

語法

語法:allow/deny address | CIDR | unix: | all

它表示,允許/拒絕某個ip或者一個ip段訪問.如果指定unix:,那將允許socket的訪問。
注意:unix在1.5.1中新加入的功能。

在nginx中,allow和deny的規(guī)則是按順序執(zhí)行的。

示例

示例1:
location /
{
allow 192.168.0.0/24;
allow 127.0.0.1;
deny all;
}

說明:這段配置值允許192.168.0.0/24網(wǎng)段和127.0.0.1的請求,其他來源IP全部拒絕。

示例2:
location ~ "admin"
{
allow 110.21.33.121;
deny all
}
說明:訪問的uri中包含admin的請求,只允許110.21.33.121這個IP的請求。
nginx訪問控制

nginx訪問控制
nginx訪問控制

基于location的訪問控制

在生產(chǎn)環(huán)境中,我們會對某些特殊的請求進行限制,比如對網(wǎng)站的后臺進行限制訪問。
這就用到了location配置。

示例1

location /aming/
{
deny all;
}

說明:針對/aming/目錄,全部禁止訪問,這里的deny all可以改為return 403.

nginx訪問控制
示例2

location ~ ".bak|.ht"
{
return 403;
}
說明:訪問的uri中包含.bak字樣的或者包含.ht的直接返回403狀態(tài)碼。

測試鏈接舉例:

  1. www.aminglinux.com/123.bak
  2. www.aminglinux.com/aming/123/.htalskdjf

nginx訪問控制
示例3

location ~ (data|cache|tmp|image|attachment).*.php$
{
deny all;
}

說明:請求的uri中包含data、cache、tmp、image、attachment并且以.php結尾的,全部禁止訪問。

測試鏈接舉例:

  1. www.aminglinux.com/aming/cache/1.php
  2. www.aminglinux.com/image/123.phps
  3. www.aminglinux.com/aming/datas/1.php
    nginx訪問控制

Nginx基于$document_uri的訪問控制

這就用到了變量$document_uri,根據(jù)前面所學內容,該變量等價于$uri,其實也等價于location匹配。

示例1

if ($document_uri ~ "/admin/")
{
return 403;
}

說明:當請求的uri中包含/admin/時,直接返回403.

if結構中不支持使用allow和deny。

測試鏈接:

  1. www.aminglinux.com/123/admin/1.html 匹配
  2. www.aminglinux.com/admin123/1.html 不匹配
  3. www.aminglinux.com/admin.php 不匹配

nginx訪問控制
示例2

if ($document_uri = /admin.php)
{
return 403;
}

說明:請求的uri為/admin.php時返回403狀態(tài)碼。

測試鏈接:

  1. www.aminglinux.com/admin.php 匹配
  2. www.aminglinux.com/123/admin.php 不匹配

nginx訪問控制

示例3
#下面兩種的結果不同
if ($document_uri ~ '/data/|/cache/..php$')
#if ($document_uri ~ '(/data/|/cache/).
.php$')
{
return 403;
}

說明:請求的uri包含data或者cache目錄,并且是php時,返回403狀態(tài)碼。

測試鏈接:

  1. www.aminglinux.com/data/123.php 匹配
  2. www.aminglinux.com/cache1/123.php 不匹配

nginx訪問控制

nginx基于$request_uri訪問控制

$request_uri比$docuemnt_uri多了請求的參數(shù)。
主要是針對請求的uri中的參數(shù)進行控制。

示例

if ($request_uri ~ "gid=\d{9,12}")
{
return 403;
}

說明:\d{9,12}是正則表達式,表示9到12個數(shù)字,例如gid=1234567890就符號要求。

測試鏈接:

  1. www.aminglinux.com/index.php?gid=1234567890&pid=111 匹配
  2. www.aminglinux.com/gid=123 不匹配

nginx訪問控制
背景知識:
曾經(jīng)有一個客戶的網(wǎng)站cc***,對方發(fā)起太多類似這樣的請求:/read-123405150-1-1.html
實際上,這樣的請求并不是正常的請求,網(wǎng)站會拋出一個頁面,提示帖子不存在。
所以,可以直接針對這樣的請求,return 403狀態(tài)碼。

Nginx基于$user_agent的訪問控制

user_agent大家并不陌生,可以簡單理解成瀏覽器標識,包括一些蜘蛛爬蟲都可以通過user_agent來辨識。
通過觀察訪問日志,可以發(fā)現(xiàn)一些搜索引擎的蜘蛛對網(wǎng)站訪問特別頻繁,它們并不友好。
為了減少服務器的壓力,其實可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬蟲全部封掉。
另外,一些cc***,我們也可以通過觀察它們的user_agent找到規(guī)律。

示例

if ($http_user_agent ~ 'YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato')
{
return 403;
}
說明:user_agent包含以上關鍵詞的請求,全部返回403狀態(tài)碼。

測試:

  1. curl -A "123YisouSpider1.0"
  2. curl -A "MJ12bot/v1.4.1"
    nginx訪問控制

Nginx基于$http_referer的訪問控制

在前面講解rewrite時,曾經(jīng)用過該變量,當時實現(xiàn)了防盜鏈功能。
其實基于該變量,我們也可以做一些特殊的需求。

示例

背景:網(wǎng)站被黑掛馬,搜索引擎收錄的網(wǎng)頁是有問題的,當通過搜索引擎點擊到網(wǎng)站時
由于查找***需要時間,不能馬上解決,為了不影響用戶體驗,可以針對此類請求做一個特殊操作。
比如,可以把從百度訪問的鏈接直接返回404狀態(tài)碼,或者返回一段html代碼。

if ($http_referer ~ 'baidu.com')
{
return 404;
}

或者

if ($http_referer ~ 'baidu.com')
{
return 200 "<html><script>window.location.href='//$host$request_uri';</script></html>";
}

nginx訪問控制

Nginx限速
https://coding.net/u/aminglinux/p/nginx/git/blob/master/access/limit.md
Nginx的限速

可以通過ngx_http_limit_conn_module和ngx_http_limit_req_module模塊來實現(xiàn)限速的功能。

ngx_http_limit_conn_module

該模塊主要限制下載速度。

  1. 并發(fā)限制

配置示例
http
{
...
limit_conn_zone $binary_remote_addr zone=aming:10m;
...
server
{
...
limit_conn aming 10;
...
}
}
說明:首先用limit_conn_zone定義了一個內存區(qū)塊索引aming,大小為10m,它以$binary_remote_addr作為key。
該配置只能在http里面配置,不支持在server里配置。

limit_conn 定義針對aming這個zone,并發(fā)連接為10個。在這需要注意一下,這個10指的是單個IP的并發(fā)最多為10個。

nginx訪問控制

  1. 速度限制

location ~ /download/ {
...
limit_rate_after 512k;
limit_rate 150k;
...
}
說明:limit_rate_after定義當一個文件下載到指定大小(本例中為512k)之后開始限速;
limit_rate 定義下載速度為150k/s。

注意:這兩個參數(shù)針對每個請求限速。
nginx訪問控制
nginx訪問控制
nginx訪問控制
nginx訪問控制

ngx_http_limit_req_module

該模塊主要用來限制請求數(shù)。

  1. limit_req_zone

語法: limit_req_zone $variable zone=name:size rate=rate;
默認值: none
配置段: http

設置一塊共享內存限制域用來保存鍵值的狀態(tài)參數(shù)。 特別是保存了當前超出請求的數(shù)量。
鍵的值就是指定的變量(空值不會被計算)。
如limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

說明:區(qū)域名稱為one,大小為10m,平均處理的請求頻率不能超過每秒一次,鍵值是客戶端IP。
使用$binary_remote_addr變量, 可以將每條狀態(tài)記錄的大小減少到64個字節(jié),這樣1M的內存可以保存大約1萬6千個64字節(jié)的記錄。
如果限制域的存儲空間耗盡了對于后續(xù)所有請求,服務器都會返回 503 (Service Temporarily Unavailable)錯誤。
速度可以設置為每秒處理請求數(shù)和每分鐘處理請求數(shù),其值必須是整數(shù),
所以如果你需要指定每秒處理少于1個的請求,2秒處理一個請求,可以使用 “30r/m”。

  1. limit_req

語法: limit_req zone=name [burst=number] [nodelay];
默認值: —
配置段: http, server, location

設置對應的共享內存限制域和允許被處理的最大請求數(shù)閾值。
如果請求的頻率超過了限制域配置的值,請求處理會被延遲,所以所有的請求都是以定義的頻率被處理的。
超過頻率限制的請求會被延遲,直到被延遲的請求數(shù)超過了定義的閾值,
這時,這個請求會被終止,并返回503 (Service Temporarily Unavailable) 錯誤。

這個閾值的默認值為0。如:
limit_req_zone $binary_remote_addr zone=aming:10m rate=1r/s;
server {
location /upload/ {
limit_req zone=aming burst=5;
}
}

限制平均每秒不超過一個請求,同時允許超過頻率限制的請求數(shù)不多于5個。

如果不希望超過的請求被延遲,可以用nodelay參數(shù),如:

limit_req zone=aming burst=5 nodelay;

示例

http {
limit_req_zone $binary_remote_addr zone=aming:10m rate=1r/s;

server {
    location  ^~ /download/ {  
        limit_req zone=aming burst=5;
    }
}

}

nginx訪問控制
![](https://s1.51cto.com/images/blog/201912
nginx訪問控制
nginx訪問控制
將burst改為10后的結果如下
nginx訪問控制
nginx訪問控制

設定白名單IP

如果是針對公司內部IP或者lo(127.0.0.1)不進行限速,如何做呢?這就要用到geo模塊了。

假如,預把127.0.0.1和192.168.100.0/24網(wǎng)段設置為白名單,需要這樣做。
在http { }里面增加:
geo $limited {
default 1;
127.0.0.1/32 0;
192.168.100.0/24 0;
}

map $limited $limit {
1 $binary_remote_addr;
0 "";
}

原來的 “l(fā)imit_req_zone $binary_remote_addr ” 改為“l(fā)imit_req_zone $limit”

完整示例:

http {
geo $limited {
default 1;
127.0.0.1/32 0;
192.168.100.0/24 0;
}

map $limited $limit {
    1 $binary_remote_addr;
    0 "";
}

limit_req_zone $limit zone=aming:10m rate=1r/s;

server {
    location  ^~ /download/ {  
        limit_req zone=aming burst=5;
    }
}

}

Nginx用戶認證
https://coding.net/u/aminglinux/p/nginx/git/blob/master/access/auth.md

Nginx的用戶認證

當訪問一些私密資源時,最好配置用戶認證,增加安全性。

步驟和示例

安裝httpd

yum install -y httpd

使用htpasswd生產(chǎn)密碼文件

htpasswd -c /usr/local/nginx/conf/htpasswd aming

配置nginx用戶認證

  location  /admin/
  {
      auth_basic              "Auth";
      auth_basic_user_file   /usr/local/nginx/conf/htpasswd;
  }

測試

curl -uaming:passwd www.aminglinux.com/admin/1.html

    ![](https://s1.51cto.com/images/blog/201912/22/2aa8fa5e12209e54c2446f69d8c91de5.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI