针对流量转发写的入口故障转发仅支持Cloudflare
前言
我购买了好几个流量中转服务,但是总会出来类似于跑路或入口不可用,每次都要手动去跳转,非常麻烦!
因此就产生了这个脚本!
代码
#!/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操作