Godaddy上有200个不同的域名,我们来批量修改它们的NameServers,指向CloudFlare的免费Plan。
涉及Godaddy的API,CloudFlare的API
上次网站被DDOS攻击,服务器供应商SoftLayer竟然直接关掉我们的服务器,为时一天,说不要影响他们其他的服务器!
深深的怨气+怒气!
CloudFlare(简称CF)提供免费的抗击服务,还提供一些基本的统计服务,相当可以,
还没有数量限制(虽然利用API批量加入时,会限制每次最多100个域名),
免费送的HTTPS证书也很方便,搭配VPS的免费的Let's Encrypt证书,舒心!
域名列表
Godaddy账号
对应的API Keys https://developer.godaddy.com/keys
Godaddy API手册 https://developer.godaddy.com/doc/endpoint/domains
CloudFlare账号 https://cloudflare.com
CloudFlare-API 批量添加域名 https://support.cloudflare.com/hc/en-us/articles/360000841472
CloudFlare-API 列出已添加的域名 https://api.cloudflare.com/#zone-list-zones
1. 先生成CF的API-Keys,打开https://dash.cloudflare.com/,右上角“My Profile”,然后下面找到“Global API Key”,生成。
2. 开始批量添加域名,把域名写在一个domains.txt,每个域名一行,每次不可超过100个,太多了需要分几次添加。
3. 打开命令行,
export [email protected]
export CF_API_KEY=这里填写刚才的Global API Key
然后cd到存放domains.txt的目录,使用以下命令开始自动添加:
for domain in $(cat domains.txt); do \
curl -X POST -H "X-Auth-Key: $CF_API_KEY" -H "X-Auth-Email: $CF_API_EMAIL" \
-H "Content-Type: application/json" \
"https://api.cloudflare.com/client/v4/zones" \
--data '{"name":"'$domain'","jump_start":true}'; done
CloudFlare后台就能看到这些域名,等待验证通过!
以上是参考“Adding Domains via the API”,https://support.cloudflare.com/hc/en-us/articles/360000841472,需要删掉一段参数,否则会报错:
account: {"id: "id_of_that_account"},
现在只要在Godaddy上设置好每个域名的NameServers即可:
Nameserver 1 : kim.ns.cloudflare.com
Nameserver 2 : tim.ns.cloudflare.com
但是很麻烦,毕竟Godaddy逐个管理域名,再找到DNS页面修改,也是很累(我要做几百个。。。)
Godaddy提供了RESTful API,我们使用PHP等工具可以逐个cURL-Patch 即可修改对应的NS。
以下是具体方法。
1. 建一个Key和对应的Secret : https://developer.godaddy.com/keys
2. 新建一个脚本,这里演示利用PHP来修改同一个GoDaddy用户下的所有的域名的NS,
注意:
$all_dn是全部域名列表,$dn_autorenew是部分已设置好Auto renew的域名列表。
需要修改$API_KEY,$API_SECRET。预设项“kim.ns.cloudflare.com”等需要看情况修改。
gdapi.php
PATCH
* 请注意参数$head_array的成员不是k=>v,而是用冒号":"连起来的字符串
*
* @param type $url
* @param type $data | array('key' => 'value')
* @param type $head_array | array() | array('key1:value1', 'key2:value2')
* @return type
*/
function patchurl($url,$data, $head_array = array()){
$data = json_encode($data);
$headers = array(
'Content-type:application/json'
);
if(is_array($head_array) && count($head_array)){
$headers = array_merge($headers, $head_array);
}
$ch = curl_init();
curl_setopt ($ch,CURLOPT_URL,$url);
curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
$output = curl_exec($ch);
curl_close($ch);
$output = json_decode($output);
return $output;
}
$current_domain = '';
$data = array(
"locked" => true,
"nameServers" => array(
'kim.ns.cloudflare.com',
'tim.ns.cloudflare.com'
),
"renewAuto" => false,
//"subaccountId" => "" // 这里可以直接删掉,因为空值会报错:body.subaccountId does not meet minimum length of 1
);
$data_arn = $data;
$data_arn['renewAuto'] = true;
$headers = array(
'Authorization: sso-key' . ' '.$API_KEY.':'.$API_SECRET
);
$arr_d_all = explode(PHP_EOL, $all_dn);
$arr_d_arn = explode(PHP_EOL, $dn_autorenew);
foreach ($arr_d_all as $current_domain) {
$url = 'https://api.godaddy.com/v1/domains/'.$current_domain;
if(in_array($current_domain, $arr_d_arn)){
$data_to_send = $data_arn;
} else {
$data_to_send = $data;
}
error_log('Dealing with: '.$current_domain);
$res = patchurl($url, $data_to_send, $headers);
echo '
';
echo ''.$current_domain.'
';
print_r($res);
error_log('Finished');
}
echo 'All domains are finished!
';
/* 如果页面是空白的,没有报错,代表成功,在Godaddy检查一下这个域名的NS设置 */
3. 现在Godaddy+CloudFlare都能打通了。
4.复查Godaddy+CF的设置是否妥当。