针对流量转发写的入口故障转发仅支持Cloudflare

2023-04-15T18:22:31

前言

我购买了好几个流量中转服务,但是总会出来类似于跑路或入口不可用,每次都要手动去跳转,非常麻烦!
因此就产生了这个脚本!

代码

#!/bin/bash

# Cloudflare API 凭据
auth_email="############"
auth_key="############"

# 域名信息
name="############"  # 主域名
name_2="############"  # 二级域名
content_cm1="############"  # 端口开启时的 CNAME 记录值
content_cm2="############"  # 端口关闭时的 CNAME 记录值

# 获取区域 ID
zone=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones" \
-H "X-Auth-Email: ${auth_email}" \
-H "X-Auth-Key: ${auth_key}" \
-H "Content-Type: application/json" | jq -r '.result[] | select(.name == "'"${name}"'") | .id')

if [[ -z $zone ]]; then
  echo "错误:未找到区域 ID。"
  exit 1
fi

echo "区域 ID:$zone"

# 获取记录 ID
record=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${zone}/dns_records" \
-H "X-Auth-Email: ${auth_email}" \
-H "X-Auth-Key: ${auth_key}" \
-H "Content-Type: application/json" | jq -r '.result[] | select(.name == "'"${name_2}"'") | .id')

if [[ -z $record ]]; then
  echo "错误:未找到记录 ID。"
  exit 1
fi

echo "记录 ID:$record"

# 设置初始 CNAME 记录值
content=""

# 持续监视目标端口
while true; do
  # 检查目标端口是否开启
  if nc -z -w 2 cm1.moni.cyou 49803 > /dev/null 2>&1; then
    # 如果目标端口开启,则将 CNAME 记录值设置为初始值
    content="$content_cm1"
    echo "主入口:${content}"
  else
    # 如果目标端口关闭,则将 CNAME 记录值设置为备份值
    content="$content_cm2"
    echo "备入口:${content}"
  fi

  # 使用新的 CNAME 记录值更新 DNS 记录
  response=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/${zone}/dns_records/${record}" \
  -H "X-Auth-Email: ${auth_email}" \
  -H "X-Auth-Key: ${auth_key}" \
  -H "Content-Type: application/json" \
  --data "{\"type\":\"CNAME\",\"name\":\"${name_2}\",\"content\":\"${content}\",\"ttl\":120,\"proxied\":false}" | jq -r '.success')
  
  if [[ $response == "true" ]]; then
    echo "DNS 记录更新成功。${content}"
  else
    echo "更新 DNS 记录时出错。"
  fi

  # 等待 5 分钟
  sleep 300

 done

代码保存格式 **.sh这样扩展名即可!
同时我也发布到了Github,你可以直接使用!

使用说明

不要怀疑我编写脚本的专业性

这TM是ChatGPT写的!

我只在CnetOS7.9上用,其他平台我没有测试,自行测试

需要的环境:

yum -y install nc

yum -y install jq

特别提示

你自己要先去创建一个二级域名才行,不然就是失败,这个脚本没有创建二级域名的功能哦

专门针对流量转发搞得玩意儿

如果你不是CentOS的系统怎么办?

复制脚本代码扔到ChatGPT里面

然后说:“以此为基础,我的系统平台是乌班图,请帮我修改成乌班图能使用的脚本,功能请保持不变!”

就完事儿了!我只是以乌班图系统举例,你自己啥平台,就写啥系统

cloudflare_DNS

自动更新cloudflare_DNS域名解析

Cloudflare API 凭据

auth_email="##########" #Cloudflare 邮箱

auth_key="##########" #Cloudflare KEY

name="" # 主域名

name_2="" # 二级域名

content_cm1="" # 端口开启时的 CNAME 记录值

content_cm2="" # 端口关闭时的 CNAME 记录值

检查目标端口是否开启

if nc -z -w 2 cm1.moni.cyou 49803 > /dev/null 2>&1; then
这里的主入口 cm1.moni.cyou 49803 需要修改的

场景

你流量转发买了多家 或 同一家,做了主备入口操作

意思是:

主广港隧道 A.12345.com:55555

备沪港隧道 B.12345.com:55555

入口不一样,但是端口一样

效果

在终端用户什么都不修改的情况下,主要入口坏了,

那么此时需要切换到备用上

机场主原先操作:在后台修改节点的入口域名 缺点:用户需要刷新订阅

个人用原先操作:我特么上不了了,我自己改下域名呗

他人用户的操作:TMD什么破商家,又不能用了,TM几天了都没修改好(实际上机场主已经弄了,用户不会刷新)

因此本方法来了!他来了,他来了,贼鸡儿靓的靓仔来了!

随便准备个VPS,执行本脚本

那么主入口不可用的时候,会自动解析备用入口,

主入口连通的时候,又会自动解析回主入口。

他人用户呢,什么都不修改,只需要等待域名解析好自然而然的久切换过去!

这样就可以做到终端用户什么都不用修改。

前提是 流量转发要做同样的端口

举例

在某某家购买了流量转发,他们家拥有广州移动入口、上海电信入口 或者说 广港隧道、沪港隧道

你要做的是,不同入口做同样出口!

主广港隧道 A.12345.com:55555

备沪港隧道 B.12345.com:55555

在检查目标端口开启这里

if nc -z -w 2 cm1.moni.cyou 49803 > /dev/null 2>&1; then

修改成如下,注意域名和端口

if nc -z -w 2 A.12345.com 55555 > /dev/null 2>&1; then

这个时候会监视 主广港隧道 的端口是否正常

如果正常的那就用这个主广港隧道,如果关闭了,会解析到 备沪港隧道 B.12345.com:55555

如果主入口修复了,会解析回主广港隧道 A.12345.com:55555

此时会有叼毛问 如何运行脚本

./cloudflare_DNS.sh

此时又会有叼毛问 如何后台运行脚本

nohup ./cloudflare_DNS.sh
然后关闭ssh窗口

特别注意

官方说:不能将此API用于具有.cf、.ga、.gq、.ml或.tk TLD(顶级域)的域

大白话:上面的结尾的域名不能用API操作

Github地址

https://github.com/q592850/cloudflare_DNS

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »