简介
设置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.默认值
这里使用一个参数:
名称:
a
r
g
P
A
R
A
M
E
T
E
R
H
T
T
P
描
述
:
请
求
中
某
个
参
数
的
值
,
如
/
i
n
d
e
x
.
p
h
p
?
s
i
t
e
=
w
w
w
.
b
a
i
d
u
.
c
o
m
,
可
以
用
arg_PARAMETER HTTP 描述: 请求中某个参数的值, 如/index.php?site=www.baidu.com, 可以用
argPARAMETERHTTP描述:请求中某个参数的值,如/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基本访问状态信息等的模块