http_access_module子產品摘要
[root@localhost nginx-1.16.1]# ./configure --help | grep http_access_module
--without-http_access_module --可以看到access子產品是http_access_module子產品提供的
通路控制子產品 ,該子產品可以實作簡單的防火牆功能,過濾特定的主機。這個子產品在我們編譯nginx時會預設編譯進nginx的二進制檔案中,access設定就相當于設定白名單和黑名單(可以限制IP限制通路某些URL)。
如果server指令塊,location指令塊沒有配置限制指令,那麼将會繼承http的限制指令,但是一旦配置了會覆寫http的限制指令。或者說作用域小的配置會覆寫作用域大的配置。access子產品在内網當中允許企業服務限制通路Nginx是十分有效的。
[root@www nginx-1.16.1]# ./configure --help | grep access
--without-http_access_module disable ngx_http_access_module
隻有在編譯的時候指定--without-http_access_module,要不然會預設編譯進去
HTTP Access子產品提供了一個簡單的基于host名稱的通路控制。通過該子產品,可以允許或禁止指定的IP位址或IP位址段通路某些虛拟主機或目錄
allow|deny 指令文法
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
allow: 允許通路的IP或者網段,不能後面接多個IP,但是可以允許網段。
deny: 拒絕通路的ip或者網段。
從文法上看,它允許配置在http指令塊中,server指令塊中還有locatio指令塊中,這三者的作用域有所不同。
如果配置在http指令段中,将對所有server(虛拟主機)生效,配置在server指令段中,對目前虛拟主機生效,配置在location指令塊中,對指定的目錄生效,預設是沒有防火牆,所有的IP都能進行通路。
示範用例
在http指令塊下配置:
對單ip進行限制:正常情況下使用浏覽器去通路網站是可以正常通路的
通過Nginx的access日志擷取到用戶端的IP并且對其進行限制
192.168.179.4 - - [23/Jul/2020:21:52:48 -0400]
"GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
http {
include mime.types;
default_type application/octet-stream;
# 限制192.168.179.4這個ip通路
deny 192.168.179.4;
...
}
/usr/local/nginx/sbin/nginx -s reload --配置完記得重載配置檔案。
#在自己服務上通路
[root@localhost ~]# curl -I 192.168.179.101
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Fri, 24 Jul 2020 02:00:06 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 23 Mar 2020 12:32:23 GMT
Connection: keep-alive
ETag: "5e78ac57-264"
Accept-Ranges: bytes
通過浏覽器用戶端去通路,可以看到限制了該IP的通路
對網段進行限制:
如果想讓整個網段都不能通路,隻需要将這個ip改為網段即可。
http {
include mime.types;
default_type application/octet-stream; --将ip改為網段
deny 192.168.75.0/24;
...
}
server指令塊配置:
配置方法都是一樣的,隻是作用範圍不同。
server {
listen 80;
server_name localhost;
deny 192.168.75.135;
...
}
在自己伺服器上通路
[root@localhost ~]# curl -I 192.168.75.130
HTTP/1.1 200 OK
Server: nginx/1.16.0
Date: Mon, 22 Jul 2019 02:45:06 GMT
在192.168.75.135機器上通路:
[root@localhost ~]# curl -I 192.168.75.130
HTTP/1.1 403 Forbidden
Server: nginx/1.16.0
限制網段同上。
location指令塊配置:
在location指令塊配置通路控制。
這種配置是最多的,因為有時候我們要限制使用者對某些檔案或者目錄的通路,這些檔案通常是比較重要的或者私密的。
location /secret {
deny 192.168.75.135;
}
建立目錄以及測試檔案:
[root@localhost ~]# mkdir -p /usr/local/nginx/html/secret
[root@localhost ~]# echo "this is secret" >/usr/local/nginx/html/secret/index.html
在本機通路
[root@localhost ~]# curl 192.168.75.130/secret/index.html
this is secret
在192.168.75.135上通路
[root@localhost ~]# curl 192.168.75.130/secret/index.html
<html>
<head><title>403 Forbidden</title></head>
location /secret {
allow 192.168.75.130;
deny all;
}