服务器攻防记(资料整理)

Posted on Posted in nginx

服务器攻防记(资料整理)

公司有个投票业务,很蛋疼的是公众投票,无限制(无登录,无验证,无次数),结果…就疯了,各种刷票进来

防护1 : nginx 配置

## 用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址最多有 50 个并发连接
## 你想开 几千个连接 刷死我? 超过 50 个连接,直接返回 503 错误给你,根本不处理你的请求了
limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m ;
limit_conn  TotalConnLimitZone  50;
limit_conn_log_level notice;

## 用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址每秒处理 10 个请求
## 你想用程序每秒几百次的刷我,没戏,再快了就不处理了,直接返回 503 错误给你
limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m  rate=10r/s;
limit_req_log_level notice;

## 具体服务器配置
server {
    listen   80;
    location ~ \.php$ {
                ## 最多 5 个排队, 由于每秒处理 10 个请求 + 5个排队,你一秒最多发送 15 个请求过来,再多就直接返回 503 错误给你了
        limit_req zone=ConnLimitZone burst=5 nodelay;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        include fastcgi_params;
    }   

}

cdn 后的 nginx

## 这里取得原始用户的IP地址
map $http_x_forwarded_for  $clientRealIp {
    ""  $remote_addr;
    ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
}

## 针对原始用户 IP 地址做限制
limit_conn_zone $clientRealIp zone=TotalConnLimitZone:20m ;
limit_conn  TotalConnLimitZone  50;
limit_conn_log_level notice;

## 针对原始用户 IP 地址做限制
limit_req_zone $clientRealIp zone=ConnLimitZone:20m  rate=10r/s;
#limit_req zone=ConnLimitZone burst=10 nodelay; #如果开启此条规则,burst=10的限制将会在nginx全局生效
limit_req_log_level notice;

## 具体Server:如下在监听php部分新增限制规则即可
server {
    listen   80;
    location ~ \.php$ {
                ## 最多 5 个排队, 由于每秒处理 10 个请求 + 5个排队,你一秒最多发送 15 个请求过来,再多就直接返回 503 错误给你了
        limit_req zone=ConnLimitZone burst=5 nodelay;

        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        include fastcgi_params;
    }   

}

防护二 : 脚本控制

#!/bin/bash

cur_dir=$(cd `dirname $0`; pwd)
cd $cur_dir
start_time=`date -d"$last_minutes minutes ago" +"%H:%M:%S"`
stop_time=`date +"%H:%M:%S"`

banipconf=/usr/local/nginx/conf/banip.conf # nginx 配置中把这个文件include
tmpfile=/tmp/50.list

tac /var/log/server.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($4,RSTART+14,21);if(t>=st && t<=et) {print $0}}' | awk '{print$1}' | sort | uniq -c | sort -nr | head -n 50 > ${tmpfile}

while read line
do
count=`echo $line | awk '{print $1}'`

#ip=`echo $line | awk '{print $2}' | awk -F "." '{print $1"."$2".0.0/16;"}'`
#屏蔽单个IP的命令是
#deny 123.45.6.7
#封整个段即从123.0.0.1到123.255.255.254的命令
#deny 123.0.0.0/8
#封IP段即从123.45.0.1到123.45.255.254的命令
#deny 124.45.0.0/16

ip=`echo $line | awk '{print $2";"}'`
tag=`cat ${banipconf} | grep ${ip} | wc -l`
if [ $count -gt 10 ] && [ $tag -eq 0 ]; then
echo "deny ${ip}" >> ${banipconf}
#/etc/init.d/nginx reload
#sleep 1
fi
done < ${tmpfile}

防护三 : other

  • ModSecurity 应用层WAF,功能强大,能防御的攻击多,配置复杂
  • ngx_lua_waf 基于ngx_lua的web应用防火墙,使用简单,高性能和轻量级
  • http_guard 基于openresty
  • fail2ban 通过分析日志来判断是否使用iptables拦截
  • DDoS Deflate 通过netstat判断ip连接数,并使用iptables屏蔽
» 转载请注明来源:若我若鱼 » 服务器攻防记(资料整理)

Leave a Reply

Your email address will not be published. Required fields are marked *

17 + 3 =