被DD/CC攻击时使用阿里云DNS自动切换IP或CDN

1 篇文章 0 订阅
<?php
date_default_timezone_set('UTC');
define("ACCESSKEYID", '*************');
define("ACCESSKEYSECRET", '********************');
define("RID", '***************');
 
$s = init();
$h = 'blog';//主机记录值 根据自己的填写
$domain1 = 'https://blog.kieng.cn/'; //源站 IP/cname
$domain2 = 'http://http-status-123456.kieng.cn/'; //跟源站一个 IP 的域名用于判断服务器是否正常运转/A 记录
$ip1 = 'blog.kieng.cn.alicdn.com'; //源站 IP/cname
$ip2 = 'blog.kieng.cn.tengxun.com'; //备用 IP/cname
 
// 当 status.txt 为 0 为正常 访问源站
if (!$s) {
	$http_status = getHeaders($domain1);
	// 源站正常
	if ($http_status) {
		// 写入日志
		goLog('log', 1, $ip1);
 
		die(jsonm(['code' => 0, 'msg' => '执行成功!源站正常!']));
	} else {
		// 超时或状态码不为 200/404
		goLog('log', 2, $ip2);
		// 改 status.txt 为 1
		file_put_contents(__DIR__ . '/status.txt', '1');
		// 切换到备用 IP
		UpdateDomainRecord(RID, $ip2, 'CNAME', $h);
		die(jsonm(['code' => 0, 'msg' => '执行成功!以切换为备用站 IP']));
	}
 
} else {
	//反之 status.txt 为 1 已经切换为备用站
	$http_status = getHeaders($domain2);
	// 源站 IP 恢复正常
	if ($http_status) {
		// 写入日志
		goLog('log', 3, $ip1);
		// 改回 status.txt 为 0
		file_put_contents(__DIR__ . '/status.txt', '0');
		// 切回到正常 IP
		UpdateDomainRecord(RID, $ip1, 'CNAME', $h);
 
		die(jsonm(['code' => 0, 'msg' => '执行成功!源站以恢复,以切换为源站']));
	} else {
		//继续使用备用站 IP
		goLog('log', 4, $ip2);
 
		die(jsonm(['code' => 0, 'msg' => '执行成功!源站未恢复,正在使用备用站']));
	}
}
 
/**
 * 更新 ip/cname
 */
function UpdateDomainRecord($rid, $ip, $type = 'A', $rr = 'cloudflare') {
	$requestParams = array(
		"Action" => "UpdateDomainRecord",
		"RecordId" => $rid,
		"RR" => $rr, //主机记录(我用这个用别的自己修改一下)
		"Type" => $type,
		"Value" => $ip, //记录值
	);
	$val = requestAli($requestParams);
	return $val;
}
 
/*
写日志
$msg 1 正常 2.切换为热备 IP 3.切换回源站 IP 4.使用备用站 IP
 */
function goLog($status = 'log', $msg = 1, $ip) {
	$log_path = __DIR__ . '/' . $status . '/' . date('Y-m-d');
	// 写出日志
	// 创建目录
	mkFolder($log_path);
	$filename = $log_path . "/http.log";
	$handle = fopen($filename, "a+");
	switch ($msg) {
	case 1:
		fwrite($handle, date('Y-m-d H:i:s') . '----status:访问成功,无异常----ip:' . $ip . "\n");
		break;
	case 2:
		fwrite($handle, date('Y-m-d H:i:s') . '----status:异常已切换----ip:' . $ip . "\n");
		break;
	case 3:
		fwrite($handle, date('Y-m-d H:i:s') . '----status:以切回源站----ip:' . $ip . "\n");
		break;
	case 4:
		fwrite($handle, date('Y-m-d H:i:s') . '----status:现为备用站----ip:' . $ip . "\n");
		break;
 
	default:
		fwrite($handle, date('Y-m-d H:i:s') . '----status:访问成功,无异常----ip:' . $ip . "\n");
		break;
	}
	fclose($handle);
 
	return;
}
 
/*
初始化 建立所需数据文本
 */
function init() {
	$path = __DIR__ . '/';
	// status.txt  为 0 是源站 为 1 则以切换到热备站
	if (!file_exists($path . 'status.txt')) {
		file_put_contents($path . 'status.txt', 0);
		return false;
	} else {
		if (file_get_contents($path . 'status.txt') == 0) {
			return false;
		} else {
			return true;
		}
	}
}
 
/*
创建目录
 */
function mkFolder($path) {
	if (!is_readable($path)) {
		is_file($path) or mkdir($path, 0700, true);
	}
}
 
/*
判断 http code
 */
function getHeaders($url) {
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_HEADER, 1);
	curl_setopt($curl, CURLOPT_NOBODY, 1);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($curl, CURLOPT_TIMEOUT, 10); //超时 10s
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
	curl_exec($curl);
	$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	curl_close($curl);
	if ($http_code == 200 || $http_code == 404) {
		return true;
	} else {
		return false;
	}
}
 
/*
执行操作
 */
 
function requestAli($requestParams, $accessKeyId = ACCESSKEYID, $accessSecrec = ACCESSKEYSECRET) {
	$publicParams = array(
		"Format" => "JSON",
		"Version" => "2015-01-09",
		"AccessKeyId" => $accessKeyId,
		"Timestamp" => date("Y-m-d\TH:i:s\Z"),
		"SignatureMethod" => "HMAC-SHA1",
		"SignatureVersion" => "1.0",
		"SignatureNonce" => substr(md5(rand(1, 99999999)), rand(1, 9), 14),
	);
 
	$params = array_merge($publicParams, $requestParams);
	$params['Signature'] = sign($params, $accessSecrec);
	$uri = http_build_query($params);
	$url = 'http://alidns.aliyuncs.com/?' . $uri;
	return curl($url);
}
 
/*
计算密匙
 */
function sign($params, $accessSecrec = ACCESSKEYSECRET, $method = "GET") {
	ksort($params);
	$stringToSign = strtoupper($method) . '&' . percentEncode('/') . '&';
 
	$tmp = "";
	foreach ($params as $key => $val) {
		$tmp .= '&' . percentEncode($key) . '=' . percentEncode($val);
	}
	$tmp = trim($tmp, '&');
	$stringToSign = $stringToSign . percentEncode($tmp);
 
	$key = $accessSecrec . '&';
	$hmac = hash_hmac("sha1", $stringToSign, $key, true);
 
	return base64_encode($hmac);
}
 
/*
格式
 */
function percentEncode($value = null) {
	$en = urlencode($value);
	$en = str_replace("+", "%20", $en);
	$en = str_replace("*", "%2A", $en);
	$en = str_replace("%7E", "~", $en);
	return $en;
}
 
/*
发送请求
 */
function curl($url) {
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$result = curl_exec($ch);
	return $result;
}
 
function jsonm($data) {
 
	header('content-type:application/json;charset=utf-8');
 
	return stripslashes(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
 
}

按 F12,随便修改一下记录 比如修改一下 TTL 时间

然后把代码存为 xxx.php 放在随便一个服务器里,然后在计划任务里定时执行一下.多久检查一次就看自己了.用腾讯云函数也可以,无所谓 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阿里云CDN加速配置教程如下: 1. 在阿里云控制台中,选择CDN,进入CDN控制台。 2. 在控制台中,选择域名管理,然后点击【添加域名】按钮。 3. 在添加域名页面,输入您的主域名,并选择合适的业务类型,例如站点加速、点播、直播等。 4. 点击【下一步】,进入加速区域设置页面。***根据您的实际情况,选择源站类型,可以是IP地址、阿里云OSS、阿里云视频点播等。 6. 配置好源站后,点击【下一步】,进入CNAME配置页面。在此页面,您会得到一个加速后的CNAME域名,将您的主域名作CNAME指向该域名。 7. 完成CNAME配置后,点击【下一步】,进入HTTPS配置页面。您可以选择是否开启HTTPS加速,并配置相应的证书。 8. 完成HTTPS配置后,点击【下一步】,进入流量分配页面。根据您的需求,设置合适的流量分配。 9. 点击【下一步】,进入确认订单页面。确认您的配置信息,并点击【确认】,提交订单。 10. 完成订单提交后,CDN加速配置就完成了。您可以在域名管理页面查看到您的加速域名信息。 通过以上步骤,您就可以成功配置阿里云CDN加速。CDN加速可以将您的源站内容分发至最接近用户的节点,提高用户访问的响应速度和成功率。同CDN节点也可以缓存访问量较大的网页内容和对象,以提高网站访问的速度和质量。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值