美文网首页
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