之前在处理使用阿里云cdn网站的时候,我们可以通过nginx的$http_x_forwarded_for参数获取用户的真实IP。然后结合nginx配置对有攻击行为的IP做限制,例如返回403。具体方法可以参考这篇文章《Nginx网站使用CDN获取攻击用户真实IP和fail2ban自动禁止的方法》。这种方法可以减少业务压力,但本质上IP没有被禁止。接下来博主使用阿里云提供的api和脚本,从源头上禁止那些IP的访问。
第一步:安装python的sdk
pip install aliyun-python-sdk-cdn
sdk安装的具体网址:https://develop.aliyun.com/tools/sdk?#/python
第二步:申请key
从阿里云帐号控制菜单中选择accesskeys,按照提示创建。
第三步:运行脚本
我的脚本类似如下,获取IP的命令可以根据自己需求修改。
#!/usr/bin/env python from aliyunsdkcore import client from aliyunsdkcdn.request.v20141111 import SetIpBlackListConfigRequest import json import sys import os cdn_access_id='' cdn_access_key_secret='' def main(): #get blackip files=[ '/home/wwwlogs/blog.nbhao.org_error.log', ] blackips=[] for file in files: cmd="source /etc/profile;awk '{print $NF}' %s |awk '{a[$0]++}END{for(i in a){if(a[i] > 10){print i}}}'" % file result=os.popen(cmd,'r').readlines() result = map(lambda s: s.strip(), result) blackips=blackips+result blackips = list(set(blackips)) str_ips="" for ip in blackips: if str_ips=="": str_ips=ip else: str_ips=str_ips+","+ip #aliyun cdn action clt = client.AcsClient(cdn_access_id,cdn_access_key_secret) request=SetIpBlackListConfigRequest.SetIpBlackListConfigRequest() request.set_accept_format('json') request.add_query_param('DomainName','vps.nbhao.org') request.add_query_param('BlockIps',str_ips) try: result=clt.do_action(request) r_dict=json.loads(result) print r_dict except: print("Do ip black list error.") sys.exit() while True: import time main() time.sleep(600)
脚本我是从网站错误nginx日志中读取疑似攻击的IP的,然后每隔10分钟分析一次。
参考网址: