欢迎来到好人卡资源网,专注网络技术资源收集,我们不仅是网络资源的搬运工,也生产原创资源。寻找资源请留言

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

linux sky995 来源:KIENG 2年前 (2020-12-20) 534次浏览 0个评论

就是记录一下而已

思路大概是这样:

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

当然你源站 IP 没有暴露的话,用不到备用备用服务器.只需要切换到抗 D 抗 C 的 CDN 上就行.比如Cloudflare

代码

  1. <?php
  2. date_default_timezone_set('UTC');
  3. define("ACCESSKEYID", '*************');
  4. define("ACCESSKEYSECRET", '********************');
  5. define("RID", '***************');
  6.  
  7. $s = init();
  8. $h = 'blog';//主机记录值 根据自己的填写
  9. $domain1 = 'https://blog.kieng.cn/'; //源站 IP/cname
  10. $domain2 = 'http://http-status-123456.kieng.cn/'; //跟源站一个 IP 的域名用于判断服务器是否正常运转/A 记录
  11. $ip1 = 'blog.kieng.cn.alicdn.com'; //源站 IP/cname
  12. $ip2 = 'blog.kieng.cn.tengxun.com'; //备用 IP/cname
  13.  
  14. // 当 status.txt 为 0 为正常 访问源站
  15. if (!$s) {
  16. $http_status = getHeaders($domain1);
  17. // 源站正常
  18. if ($http_status) {
  19. // 写入日志
  20. goLog('log', 1, $ip1);
  21.  
  22. die(jsonm(['code' => 0, 'msg' => '执行成功!源站正常!']));
  23. } else {
  24. // 超时或状态码不为 200/404
  25. goLog('log', 2, $ip2);
  26. // 改 status.txt 为 1
  27. file_put_contents(__DIR__ . '/status.txt', '1');
  28. // 切换到备用 IP
  29. UpdateDomainRecord(RID, $ip2, 'CNAME', $h);
  30. die(jsonm(['code' => 0, 'msg' => '执行成功!以切换为备用站 IP']));
  31. }
  32.  
  33. } else {
  34. //反之 status.txt 为 1 已经切换为备用站
  35. $http_status = getHeaders($domain2);
  36. // 源站 IP 恢复正常
  37. if ($http_status) {
  38. // 写入日志
  39. goLog('log', 3, $ip1);
  40. // 改回 status.txt 为 0
  41. file_put_contents(__DIR__ . '/status.txt', '0');
  42. // 切回到正常 IP
  43. UpdateDomainRecord(RID, $ip1, 'CNAME', $h);
  44.  
  45. die(jsonm(['code' => 0, 'msg' => '执行成功!源站以恢复,以切换为源站']));
  46. } else {
  47. //继续使用备用站 IP
  48. goLog('log', 4, $ip2);
  49.  
  50. die(jsonm(['code' => 0, 'msg' => '执行成功!源站未恢复,正在使用备用站']));
  51. }
  52. }
  53.  
  54. /**
  55. * 更新 ip/cname
  56. */
  57. function UpdateDomainRecord($rid, $ip, $type = 'A', $rr = 'cloudflare') {
  58. $requestParams = array(
  59. "Action" => "UpdateDomainRecord",
  60. "RecordId" => $rid,
  61. "RR" => $rr, //主机记录(我用这个用别的自己修改一下)
  62. "Type" => $type,
  63. "Value" => $ip, //记录值
  64. );
  65. $val = requestAli($requestParams);
  66. return $val;
  67. }
  68.  
  69. /*
  70. 写日志
  71. $msg 1 正常 2.切换为热备 IP 3.切换回源站 IP 4.使用备用站 IP
  72. */
  73. function goLog($status = 'log', $msg = 1, $ip) {
  74. $log_path = __DIR__ . '/' . $status . '/' . date('Y-m-d');
  75. // 写出日志
  76. // 创建目录
  77. mkFolder($log_path);
  78. $filename = $log_path . "/http.log";
  79. $handle = fopen($filename, "a+");
  80. switch ($msg) {
  81. case 1:
  82. fwrite($handle, date('Y-m-d H:i:s') . '----status:访问成功,无异常----ip:' . $ip . "\n");
  83. break;
  84. case 2:
  85. fwrite($handle, date('Y-m-d H:i:s') . '----status:异常已切换----ip:' . $ip . "\n");
  86. break;
  87. case 3:
  88. fwrite($handle, date('Y-m-d H:i:s') . '----status:以切回源站----ip:' . $ip . "\n");
  89. break;
  90. case 4:
  91. fwrite($handle, date('Y-m-d H:i:s') . '----status:现为备用站----ip:' . $ip . "\n");
  92. break;
  93.  
  94. default:
  95. fwrite($handle, date('Y-m-d H:i:s') . '----status:访问成功,无异常----ip:' . $ip . "\n");
  96. break;
  97. }
  98. fclose($handle);
  99.  
  100. return;
  101. }
  102.  
  103. /*
  104. 初始化 建立所需数据文本
  105. */
  106. function init() {
  107. $path = __DIR__ . '/';
  108. // status.txt 为 0 是源站 为 1 则以切换到热备站
  109. if (!file_exists($path . 'status.txt')) {
  110. file_put_contents($path . 'status.txt', 0);
  111. return false;
  112. } else {
  113. if (file_get_contents($path . 'status.txt') == 0) {
  114. return false;
  115. } else {
  116. return true;
  117. }
  118. }
  119. }
  120.  
  121. /*
  122. 创建目录
  123. */
  124. function mkFolder($path) {
  125. if (!is_readable($path)) {
  126. is_file($path) or mkdir($path, 0700, true);
  127. }
  128. }
  129.  
  130. /*
  131. 判断 http code
  132. */
  133. function getHeaders($url) {
  134. $curl = curl_init();
  135. curl_setopt($curl, CURLOPT_URL, $url);
  136. curl_setopt($curl, CURLOPT_HEADER, 1);
  137. curl_setopt($curl, CURLOPT_NOBODY, 1);
  138. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  139. curl_setopt($curl, CURLOPT_TIMEOUT, 10); //超时 10s
  140. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
  141. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
  142. curl_exec($curl);
  143. $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
  144. curl_close($curl);
  145. if ($http_code == 200 || $http_code == 404) {
  146. return true;
  147. } else {
  148. return false;
  149. }
  150. }
  151.  
  152. /*
  153. 执行操作
  154. */
  155.  
  156. function requestAli($requestParams, $accessKeyId = ACCESSKEYID, $accessSecrec = ACCESSKEYSECRET) {
  157. $publicParams = array(
  158. "Format" => "JSON",
  159. "Version" => "2015-01-09",
  160. "AccessKeyId" => $accessKeyId,
  161. "Timestamp" => date("Y-m-d\TH:i:s\Z"),
  162. "SignatureMethod" => "HMAC-SHA1",
  163. "SignatureVersion" => "1.0",
  164. "SignatureNonce" => substr(md5(rand(1, 99999999)), rand(1, 9), 14),
  165. );
  166.  
  167. $params = array_merge($publicParams, $requestParams);
  168. $params['Signature'] = sign($params, $accessSecrec);
  169. $uri = http_build_query($params);
  170. $url = 'http://alidns.aliyuncs.com/?' . $uri;
  171. return curl($url);
  172. }
  173.  
  174. /*
  175. 计算密匙
  176. */
  177. function sign($params, $accessSecrec = ACCESSKEYSECRET, $method = "GET") {
  178. ksort($params);
  179. $stringToSign = strtoupper($method) . '&' . percentEncode('/') . '&';
  180.  
  181. $tmp = "";
  182. foreach ($params as $key => $val) {
  183. $tmp .= '&' . percentEncode($key) . '=' . percentEncode($val);
  184. }
  185. $tmp = trim($tmp, '&');
  186. $stringToSign = $stringToSign . percentEncode($tmp);
  187.  
  188. $key = $accessSecrec . '&';
  189. $hmac = hash_hmac("sha1", $stringToSign, $key, true);
  190.  
  191. return base64_encode($hmac);
  192. }
  193.  
  194. /*
  195. 格式
  196. */
  197. function percentEncode($value = null) {
  198. $en = urlencode($value);
  199. $en = str_replace("+", "%20", $en);
  200. $en = str_replace("*", "%2A", $en);
  201. $en = str_replace("%7E", "~", $en);
  202. return $en;
  203. }
  204.  
  205. /*
  206. 发送请求
  207. */
  208. function curl($url) {
  209. $ch = curl_init();
  210. curl_setopt($ch, CURLOPT_URL, $url);
  211. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  212. $result = curl_exec($ch);
  213. return $result;
  214. }
  215.  
  216. function jsonm($data) {
  217.  
  218. header('content-type:application/json;charset=utf-8');
  219.  
  220. return stripslashes(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
  221.  
  222. }

RID 这个值,其实可以通过 API 去获取,但是没写.其实只需要在DNS解析管理那修改一下记录就能看见,如图:
[记录]被DD/CC攻击时使用阿里云DNS自动切换IP或CDN
按 F12,随便修改一下记录 比如修改一下 TTL 时间
[记录]被DD/CC攻击时使用阿里云DNS自动切换IP或CDN

这个字符串就是 RID,填写一下就可以.

阿里云有DNS的 SDK.但是不想用.随便写写大概就是这么个意思.

然后把代码存为 xxx.php 放在随便一个服务器里,然后在计划任务里定时执行一下.多久检查一次就看自己了.用腾讯云函数也可以,无所谓. [记录]被DD/CC攻击时使用阿里云DNS自动切换IP或CDN

最后

腾讯云有 D 监控就可以实现.我用的阿里云DNS没找到在哪.估计得花钱..大概思路就是这样.其实写日志什么也可以用别人写好的库,但是在腾讯云函数上没法执行.就这样就好了.


好人卡资源网 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:[记录]被DD/CC攻击时使用阿里云DNS自动切换IP或CDN
喜欢 (5)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址