Python使用Cloudflare API实现自动修改DNS记录方法

发布时间:

最近博客一直被人恶意DDoS攻击,持续好几天了,每天来几次,阿里云被打是24小时黑洞,t腾讯云被打是2小时黑洞,之后自动恢复,所以为了应对 DDoS 攻击,于是写了个结合 Cloudflare API 自动切换域名 DNS 记录的 Python 代码,这里分享下主要代码内容。

一、API TOKEN 申请

使用 Cloudflare API,需要一个 API TOKEN,直接申请即可,申请地址:https://dash.cloudflare.com/profile/api-tokens

申请时,给予这个 API 令牌编辑 DNS 的权限,如下图:

Python使用Cloudflare API实现自动修改DNS记录方法
另外还需要一个 Cloudflare Zone ID,这个是每个域名单独的,在域名概述页面可以看到:

Python使用Cloudflare API实现自动修改DNS记录方法
二、获取并更新 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,并关闭代理。

四、后记

这种一直 DDoS 攻击别人服务器的人到底是什么心态,我寻思就是一个个人博客,也没有恶意攻击别人的博文,能得罪什么人呢?实在是搞不懂。