最近老王博客(laowangblog.com)一直被人 DDoS 攻击,持续好几天了,每天来几次,腾讯云被打是 2 小时黑洞,之后自动恢复,所以为了应对 DDoS 攻击,老王昨天花了 2 小时写了个结合 Cloudflare API 自动切换域名 DNS 记录的 Python 代码,这里分享下主要代码内容。
一、API TOKEN 申请
使用 Cloudflare API,需要一个 API TOKEN,直接申请即可,申请地址:https://dash.cloudflare.com/profile/api-tokens
申请时,给予这个 API 令牌编辑 DNS 的权限,如下图:
另外还需要一个 Cloudflare Zone ID,这个是每个域名单独的,在域名概述页面可以看到:
二、获取并更新 DNS 记录
使用 Cloudflare API 修改 DNS 记录主要分为两步:
- 获取 DNS 记录的 id;
- 更新此 DNS 记录。
这里需要注意,传过去的授权不是 API 令牌,而是 Bearer + API 令牌。
1、获取 DNS 记录的 id
def get_record_id(dns_name, zone_id, token): resp = requests.get( 'https://api.cloudflare.com/client/v4/zones/{}/dns_records'.format(zone_id), headers={ 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' }) if not json.loads(resp.text)['success']: return None domains = json.loads(resp.text)['result'] for domain in domains: if dns_name == domain['name']: return domain['id'] return None
2、更新此 DNS 记录
def update_dns_record(dns_name, zone_id, token, dns_id, ip, proxied=False): resp = requests.put( 'https://api.cloudflare.com/client/v4/zones/{}/dns_records/{}'.format( zone_id, dns_id), json={ 'type': 'A', 'name': dns_name, 'content': ip, 'proxied': proxied }, headers={ 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' }) if not json.loads(resp.text)['success']: return False return True
3、调用方法
dns_name 就是 DNS 记录,例如 www.laowangblog.com,ip 就是修改的 ip 地址,proxied 是是否开启代理。
dns_id = get_record_id(dns_name, zone_id, token) result = update_dns_record(dns_name, zone_id, token, dns_id, ip, proxied)
三、结合 crontab 自动更新 DNS
代码写好了,但是没必要手动更新 DNS,毕竟你也不知道什么时候需要更新,所以我们这里结合 crontab 实现自动更新 DNS。
简而言之就是将 python 代码写好后,设置 crontab 定时任务,每一分钟检查一次目标 ip,如果 ip 没有响应(被 DDoS 攻击了),则切换到 CF,并开启代理,如果 ip 恢复响应了(腾讯云被 DDoS 攻击后 2 小时恢复正常),则切换到腾讯云 ip,并关闭代理。
这里我们需要的知识包括:
- 设置 crontab:《Linux 利用 crontab 实现定时任务格式与用法简介》
- 自动备份网站数据:《基于 LNMP 一键脚本 的 WordPress 网站一键备份脚本分享》、《借助rsync实现VPS之间数据的远程同步,备份VPS数据》
效果展示:
今天凌晨 12 点 39 分腾讯云服务器被攻击导致 IP 封堵了,2 点 39 恢复正常:
脚本是 12 点 40 分开始换 DNS 记录,2 点 39 分恢复后切换到正常 IP。log 英语语法问题请忽略,最近实在太忙了,结果昨天还要抽空 2 小时写个脚本。
四、后记
这种一直 DDoS 攻击别人服务器的人到底是什么心态,我寻思老王博客就是一个个人博客,也没有恶意攻击别人的博文,能得罪什么人呢?实在是搞不懂。这个人前天夜里 2 点多发起攻击,一天攻击了好几次,昨天夜里 12 点多发起攻击,都不用睡觉的吗?
和气生财,这种恶意攻击真的很没有意思,如果是网络上的博文侵犯我们的权益或声誉了,我们可以直接留言联系博主说明情况,真的很没必要做这种有损阴德的事。