请求异常频繁的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段,或阿里云后台安全组公网入方向配置黑名单会直接无法访问;
nginx.conf
或站点配置文件中禁用ip或ip段,请求还是会进来,只不过请求状态变成了403
deny 27.221.108.0/24; #因为使用了waf代理,不能直接使用deny
安恒云黑名单屏蔽url请求发短信接口已经注释,访问404.但是nginx访问日志还是不停请求进来,黑名单屏蔽URL级别
/api/system/smsSend*
带上通配符*
;IP地址不填默认全部。等几分钟设置生效后,再次查看请求已经进入黑名单页面。日志也无记录了!
notepad++软件正则去重
notepad++
软件正则去重复行内容^(.*?)$\s+?^(?=.*^\1$)
ctrl+H
查找目标,勾选重复查找和下面的正则表达式及匹配新行;全部替换即可!
当我下载了攻击IP想去重的时候,发现5000多个去重效果不理想。改成一次1000个就效果很明显!
攻击ip加入黑名单!
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.conf
的http
内配置:获取代理头部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
网友评论