欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二、Nginx常用模块-IP黑白名单

程序员文章站 2022-06-03 21:17:10
...

简介

设置IP黑白名单之前,我们先要了解下用到的模块。
http_access_module ngx_http_geo_module ngx_http_map_module

IP访问控制模块 http_access_module

Nginx的deny和allow指令是由 模块提供,Nginx安装默认内置了该模块。 除非在安装时有指定 --without-http_access_module。
用来对特定IP的进行访问控制
默认是允许所有IP访问,若部分允许需要定义deny all

  • allow
    语法: allow address | CIDR | unix: | all;
    默认值: —
    区块: http, server, location, limit_except
    允许某个ip或者一个ip段访问
  • deny
    语法: deny address | CIDR | unix: | all;
    默认值: —
    区块: http, server, location, limit_except
  • allow、deny实例
location / {
	deny 192.168.1.1;
	allow 192.168.1.0/24;
	allow 47.98.147.49;
	deny all;
}

比如可以限制某些目录下的某些文件的访问, 具体可以自己组合

  • 禁止访问所有目录下的 sql|log|txt|jar|sh|py 后缀的文件
location ~.*\.(sql|log|txt|jar|war|sh|py|php) {
	deny all;
}

ngx_http_geo_module

ngx_http_geo_module 模块创建变量,并根据客户端IP地址对变量赋值。
语法: geo [$address] $variable { … }
默认值: —
上下文: http

geo $geo {
    default        0;
    127.0.0.1/32   2;
    192.168.1.0/24 1;
    10.1.0.0/16    1;
}

定义从指定的变量获取客户端的IP地址。
默认情况下,nginx从$remote_addr变量取得客户端IP地址,但也可以从其他变量获得(0.7.27版),比如:

geo $arg_remote_addr $geo {
    ...;
}

ngx_http_map_module

文档:http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_map_module.html

模块 ngx_http_map_module 可以创建一些和另外变量相关联的变量。
语法: map string $variable { … }
默认值: —
上下文: http

如果源变量值没有匹配到任何变量,则设置一个默认值作为结果。 当没有设置 default,将会用一个空的字符串作为默认的结果。
如果源值匹配了多余一个的指定变量,例如掩码和正则同时匹配,那么将会按照下面的顺序进行优先选择:
1.没有掩码的字符串
2.最长的带前缀的字符串,例如: “.example.com”
3.最长的带后缀的字符串,例如:“mail.

4.按顺序第一个先匹配的正则表达式 (在配置文件中体现的顺序)
5.默认值

这里使用一个参数:
名称:
argPARAMETERHTTP/index.php?site=www.baidu.comarg_PARAMETER HTTP 描述: 请求中某个参数的值, 如/index.php?site=www.baidu.com, 可以用arg_site取得www.baidu.com这个值.
这里我们使用参数name来给geo赋值IP(必须是IP),然后再让$name根据geo的值返回不同的信息
我们和geo结合使用实例:

http模块内
geo $arg_name $geo {
        default 0;
        127.0.0.1 1;
        1.2.3.4 2;
        1.2.3.5 3;
    }

    map $geo $name{
        0 default;
        1 forbin;
        2 allow;
        3 other;
    }
server模块内:
location = /test1 {
       default_type text/html ;
       return 200  $name;
}

访问web返回

http://localhost/test1 =>default
http://localhost/test1?name=1.2.3.5 =>other

IP黑白名单

我们就可以使用这三个模块来进行IP黑白名单的设置。
这里我们只分析白名单:
我们希望只被我们允许的网段能访问我们,其他都不可以访问。其中geo默认是从$remote_addr中获取IP,这里我们为了方便测试,改成从url的参数name中获取IP。
这里只用到geo和return

#http模块内:
#0是返回空字符串,1是返回远程地址(允许访问)
geo $arg_name $geo {
    default 0;
    1.2.3.0/24 1;
}
map $geo $name{
        0 "";
        1 $remote_addr;
    }
  #server模块内:
location = /test1 {
        if ( $geo != 1 ) {
          return 403;
        }
        default_type text/html ;
        return 200  $name;
}    

访问WEB

http:/localhost/test1?name=1.2.3.4=>返回客户端地址
http:/localhost/test1?name=1.2.4.4=>返回403
http:/localhost/test1=>返回403

总结

ngx_http_core_module
ngx_http_access_module 访问控制模块
ngx_http_gzip_module
ngx_http_fastcgi_module
ngx_http_proxy_module
ngx_http_upstream_module
ngx_http_rewrite_module
ngx_http_limit_conn_module 限制用户并发连接数以及请求数模块
ngx_http_limit_req_module 根据定义的key限制nginx请求过程的速率
ngx_http_log_module
ngx_http_auth_basic_module web认证模块
ngx_http_ssl_module
ngx_http_stub_status_module 记录nginx基本访问状态信息等的模块