NGINX根据客户端真实ip限制/referer限制

最近后端服务被攻击,所有接口被疯狂调用,记录一次nginx应对攻击的方案,包括黑白名单、referer限定等。

一、NGINX根据用户真实IP限源

1、nginx日志打印

在nginx.conf配置文件中的http模块打印

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

2、NGINX根据用户真实IP限源

同样在http模块中,将客户端真实ip记录在X-Forwarded-For中

#配置使deny可以根据客户端真实ip禁用
real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;
real_ip_recursive on;

ngx_http_realip_module 模块有如下三个指令;

①:set_real_ip_from

  • 该指令用于设置授信 IP,即请求过来时由某个头字段携带的 IP 中 nginx 自己认为可信的 IP,该头字段由 real_ip_header 指令指定;
  • 该指令值一般是前几层代理的 IP ;

②:real_ip_header

  • 该指令用于告知 nginx 从每个客户端请求中的哪个头字段来获取客户端真实的 IP;
  • 该指令默认值是 X-Real-IP,不过现在主流的都是通过 X-Forwarded-For 字段来获取客户端真实 IP,X-Forwarded-For 目前已经是主流运用的字段了;
  • 我们也可以在 nginx 配置时自定义一个新的字段;

③:real_ip_recursive

nginx 从 real_ip_header 指令指定的头字段中获取 IP,可能会有多个 IP 值;

  • 当 real_ip_recursive 指令值为 off,nginx 从获取到 IP 值中从右往左(也即从后往前)的顺序,以最后一个 IP 值作为客户端的真实 IP ,此时不会排除授信 IP;
  • 当 real_ip_recursive 指令值为 on,nginx 从获取到 IP 值中从右往左(也即从后往前)的顺序,排除 set_real_ip_from 指令指定的授信 IP,以最后一个非授信 IP 值作为客户端的真实 IP ;

3、NGINX的黑白名单deny/allow

经过slb的请求默认会将真实ip放在$http_x_forwarded_for中,根据日志中打印出的攻击ip进行禁用,同样在http模块中。

#禁用某个ip
deny 123.123.123.123;
#禁用某个ip段
deny 123.123.123.0/24;
#禁用全部ip
deny all;

Nginx的deny和allow指令是由ngx_http_access_module模块提供,Nginx安装默认内置了该模块。

语法
1、allow 指令
        允许哪些 IP 访问,all 表示允许所有;
2、deny 指令
        禁止哪些 IP 访问,all 表示禁止所有;
作用域 http / server / location / limit_except ;

二、nginx根据referer限制

根据nginx日志中打印的$http_referer来进行限制

1、Nginx Referer模块

nginx模块ngx_http_referer_module通常用于阻挡来源非法的域名请求。当一个请求头的Referer字段中包含一些非正确的字段,这个模块可以禁止这个请求访问站点。构造Referer的请求很容易实现,所以使用这个模块并不能100%的阻止这些请求。

2、valid_referers 指令

语法: valid_referers none | blocked | server_names | string … ;

配置段: server, location

指定合法的来源'referer', 他决定了内置变量$invalid_referer的值,如果referer头部包含在这个合法网址里面,这个变量被设置为0,否则设置为1. 需要注意的是:这里并不区分大小写的.

参数说明:

none:请求头缺少Referer字段,即空Referer
blocked:请求头Referer字段不为空(即存在Referer),但是值被代理或者防火墙删除了,这些值不以“http://”或“https://”开头,通俗点说就是允许“http://”或"https//"以外的请求。
server_names:Referer请求头白名单。
arbitrary string:任意字符串,定义服务器名称或可选的URI前缀,主机名可以使用*号开头或结尾,Referer字段中的服务器端口将被忽略掉。
regular expression:正则表达式,以“~”开头,在“http://”或"https://"之后的文本匹配。

e.g.


server {
    ......
    #配置合法referers,其余拦截
    #微信小程序域名:servicewechat.com  浙里办域名:mapi.zjzwfw.gov.cn
    valid_referers blocked servicewechat.com mapi.zjzwfw.gov.cn Apifox;
    if ($invalid_referer) { 
	    return 403 ; 
    } 
    ......
}

上面配置合法的Referer为 servicewechat.com / mapi.zjzwfw.gov.cn / Apifox 和 无Referer(浏览器直接访问,就是没有Referer的) ; 其他非法Referer请求过来时, $invalid_referer 值为1 , 就return 403。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值