美文网首页
nginx配置显示源IP并拒绝恶意IP请求笔记!

nginx配置显示源IP并拒绝恶意IP请求笔记!

作者: DragonersLi | 来源:发表于2022-04-19 17:38 被阅读0次
nginx请求日志IP访问异常

查看日志,发现27.221.108.0/24的IP段请求访问频繁异常,通过安恒云后台查看IP威胁看到该IP绑定的域名是安恒云自己的,和waf接入的域名一致。ping 服务器域名waf指向的IP段和请求异常的IP是同一波段!
安恒云waf在服务器IP外层封装一层IP防护;但客户端发来的请求也不是直接到达该IP,而是通过安恒云自己的IP转发客户端请求。所以造成了,请求IP都是来自他们自己IP的现象!
在阿里云服务器安全组禁用或者宝塔防火墙上禁用及nginx上deny该IP,都会造成正常用户访问出错。

请求异常频繁的IP威胁查询

宝塔系统防火墙配置屏蔽ip或ip段,或阿里云后台安全组公网入方向配置黑名单会直接无法访问;
nginx.conf或站点配置文件中禁用ip或ip段,请求还是会进来,只不过请求状态变成了403

  deny 27.221.108.0/24;  #因为使用了waf代理,不能直接使用deny

发短信接口已经注释,访问404.但是nginx访问日志还是不停请求进来,黑名单屏蔽URL级别/api/system/smsSend*带上通配符*;IP地址不填默认全部。等几分钟设置生效后,再次查看请求已经进入黑名单页面。日志也无记录了!

安恒云黑名单屏蔽url请求

notepad++软件正则去重复行内容^(.*?)$\s+?^(?=.*^\1$)
ctrl+H查找目标,勾选重复查找和下面的正则表达式及匹配新行;全部替换即可!
当我下载了攻击IP想去重的时候,发现5000多个去重效果不理想。改成一次1000个就效果很明显!
攻击ip加入黑名单!

notepad++软件正则去重

nginx限制IP访问频率;因为waf代理了客户端请求IP,所以下面设置会让网站无法正常访问

#nginx.conf配置文件中加入:

http{

limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s;
#请求频率  二进制客户端IP  存储区=名字:10M大小存储访问频率 频率=10次/秒;
limit_conn_zone $binary_remote_addr zone=addr:10m;
#并发连接数  二进制客户端IP 存储区=名字:10M大小;
limit_conn_zone $server_name zone=perserver:10m;
#并发连接数  服务名称 存储区=名字:10M大小;
 
}   
        
        
#项目域名配置文件中加入:
server{

  location / {
 limit_req zone=req_zone burst=5 nodelay;
#请求频率=上面设置的名字  频率超过5次,请求会被延迟 超过频率限制的请求被延迟,直到请求数超过定义的阈值,请求会被终止,返回503;
 limit_conn addr 5;
#限制并发数  上面设置的名字 并发数为5;
       
        } 
}
每次查看流量攻击都很麻烦,要去安恒云后台,下载Excel表格,然后通过一系列去重统计等,才能去操作加入黑名单。所以想有没有可以在服务器请求日志里显示源IP,通过命令行统计,不是更方便快捷吗?所以才有了下面的笔记!思路就两步:①nginx请求日志显示源IP②通过脚本命令定时统计并写入黑名单

waf不仅代理了服务器响应,还代理了客户端IP请求。所以ping 服务器ip看到的是waf ip,查看nginx请求日志也是显示waf同网段ip,没显示真实源ip,nginx使用deny命令拒绝ip是行不通的,无法通过黑名单或请求频率来限制。会导致服务访问出问题。客户端发起请求经过代理后,它在访问nginx时会以格式(客户端ip,代理ip1,代理ip2)被封装为一个$proxy_add_x_forwarded_for变量中。X-Forwarded-For: client, proxy1, proxy2

PHP打印服务信息,可以看到HTTP_X_FORWARDED_FOR真实IP和REMOTE_ADDR代理后的客户端IP

dd($_SERVER); #打印服务
...
  "HTTP_X_FORWARDED_FOR" => "115.220.136.253"  //真实源IP  
  "SERVER_ADDR" => "172.27.132.72" //服务器内网IP
  "REMOTE_PORT" => "11221" 
  "REMOTE_ADDR" => "116.211.138.197" //客户端的IP,已经被waf服务代理了这是waf的IP
 ...

使用waf代理客户端IP,日志记录IP为waf代理IP

waf代理IP
116.211.138.197 - - [18/Apr/2022:11:55:59 +0800] 
"GET /api/product/907 HTTP/1.1"  200  20114
"https://m.xxx.com/product/info/907" 
"Mozilla/5.0 (Linux; Android 9; ANE-AL00 Build/HUAWEIANE-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.116 Mobile Safari/537.36 Html5Plus/1.0 (Immersed/30.0)"

配置nginx抓取源IP后,显示真实IP

115.220.136.xxx - 116.211.138.xxx aliwaf [19/Apr/2022:13:40:54 +0800] "GET https://m.xxx.com/index.php/index/index/status/3 HTTP/1.1" 200 3658 "https://m.xxx.com/index.php/index/index/status/0" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0"

配置显示源IP及拒绝对该源IP提供服务

1.在nginx.confhttp内配置:获取代理头部X-Forwarded-For字段
2.重新定义日志记录格式:log_format 格式名称 具体记录
3.在具体网站的配置文件中配置日志记录后追加记录日志的格式名称:main;
4.用正则匹配源IP进行403 Forbidden
#nginx.conf配置
http
    {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  //获取代理头部X-Forwarded-For字段
 log_format main '$http_x_forwarded_for - $remote_addr $remote_user ' '[$time_local] "$request_method $scheme://$host$request_uri $server_protocol" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"';
...
}

#项目配置文件
server
{
    ...




      
   # include blacklist.conf; #黑名单IP禁用
   # deny xxx.xxx.xxx.xxx; #直接deny源IP不行,因为使用了WAF代理,还是可以访问

        # 使用正则匹配源IP,访问转到403 Forbidden 
       # 注意if后面和右小括号的空格,不然nginx配置文件会报错
       # 多个ip使用 | 隔开
     if ($proxy_add_x_forwarded_for ~ ^(xx.xx.xx.xx|xx.xxx.xxx.xxx)) {  
         return 403;
     }

  
 

 


  ...
 access_log  /www/wwwlogs/m.xxx.com.log main; #使用main的日志记录格式



}

定时脚本每隔一段时间拉黑恶意访问频繁IP

    tail -n10000 /www/wwwlogs/*.log  | grep -iE "smsSend"  | awk '{print $1,$4,$7}' | awk '{print $1}' |sort |uniq -c |sort -rn| awk '{if($1>5)print "deny "$2";"}'  > /www/server/nginx/conf/blacklist.conf

通过上面拒绝源IP服务,通过定时脚本自动封禁IP有些麻烦,所以把下面配置改一下:

更改配置前:封禁多个IP

 if ($proxy_add_x_forwarded_for ~ ^(xx.xx.xx.xx|xx.xxx.xxx.xxx)) {  
         return 403;
     }

更改配置后:封禁多个IP,动态追加

include blacklist.conf; #黑名单IP禁用

#blacklist.conf文件动态追加内容
 if ($proxy_add_x_forwarded_for ~ ^(xx.xx.xx.xx)) {  return 403; }
 if ($proxy_add_x_forwarded_for ~ ^(xx.xxx.xxx.xxx)) {  return 403; }
  ...

定时脚本,每隔半小时执行一次,统计网站所有日志最近1w次请求源IP,访问超过500次就加入黑名单,返回404
tail -n10000 /www/wwwlogs/*.xxx.com.log |awk '{print $1}' |sort |uniq -c |sort -rn| awk '{if($1>500) print " if ($proxy_add_x_forwarded_for ~ ^("$2")) { return 403; } "}' > /www/server/nginx/conf/blacklist.conf

相关文章

网友评论

      本文标题:nginx配置显示源IP并拒绝恶意IP请求笔记!

      本文链接:https://www.haomeiwen.com/subject/hlvojrtx.html