天天看点

Nginx http_access_module access阶段 限制IP地址访问权限

Nginx http_access_module access阶段 限制IP地址访问权限

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 http_access_module access阶段 限制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的访问 

Nginx http_access_module access阶段 限制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;
}      

继续阅读