赛博菩萨Cloudflare - 白嫖Saas回源自建优选IP加速CDN网站访问

赛博菩萨

当日是cloudflare.com啦,目前为止个人使用到最慈善最考虑最稳定的网络服务商。

1.需要准备的内容

  1. 2个域名,且必须为两个独立的域名,可以都托管在cloudflare,也可以只托管其中一个。
  2. 当然是cloudflare 账号一枚
  3. 一个已绑卡的paypal账户或者一张外币卡(信用卡最佳)

2.开始实操

以下内容为两个域名都托管在cloudflare为例,如你和我不一样,请灵活变通。
i. 进入cloudflare后台,假设你需要加速的站点主域名为default1.com,用于Saas回源的域名为testcdn1.xyz。

ii. 修改testcnd1.xyz的A记录解析到你VPS的IP,这里就是你VPS的真实地址。

iii. 然后进入SSL/TLS-自定义主机名>回退源填写你的回源域名testcdn1.xyz。

iiii. 再在上门添加自定义主机名,也就是你要加速的站点域名default.com,

  • 最低TLS版本:默认(TLS 1.0)
  • 证书类型: 由Cloudflare提供
  • 验证方式: TXT验证
  • 点击添加自定义主机名创建
  • 根据页面显示内容手动添加域名TXT解析记录,待证书状态和主机名状态都显示绿色有效即可。

iiiii. 返回Cloudflare控制中心 > 需要加速的站点主域名为default1.com的DNS配置页面,将default1.com域名解析CNAMEtestcdn1.xyz,以辅助完成上述TXT解析验证

3.配置CDN优选IP域名,将羊毛进行到底线。

此步骤其实可以忽略,直接google检索cf优选域名,进行选择开源或其他个人维护的CDN域名解析即可。

i.到testcdn1.xyz域名管理页面首页获取区域 ID,复制记录一下备用。

ii.创建API令牌

  • 点击创建令牌
  • 选择 [编辑区域DNS] - 使用模板
  • 权限选择区不改变,选择区域资源,修改为:包括>所有区域
  • 完成点击继续显示摘要获取API,复制记录一下备用 (API只会显示一次,请妥善保管)。

4.选择一台VPS安装Python

i. 连接SSH终端(VPS账号密码就不用我告诉你了吧),按照顺序执行以下命令。

sudo apt update
sudo apt install python3
sudo apt install python3-pip

遇到提示[Y/N],全程选择Y到最后一步,输入Phtyon -v验证是否安装成功。

ii. 寻找一个你习惯保存文件的目录,例如:/home/下,新建一个Python文件,名称任意(但不能为中文)。

  • 我这里命名为cf-speedtest2domains.py,也可以在电脑本地建文件再通过工具上传到此目录下。

iii. 插入以下代码,仅需要修改3个地方,此代码采用开源api接口,代码创作利用ChatGPT进行。

荣幸使用开源大佬cf优选api,https://api.345673.xyz/get_data 。

  • 修改下面源码中的标识部分,分辨为Cloudflare账户API,和对应域名区域ID以及你要的优选IP解析的二级域名,我这里用域名cf.testcdn1.xyz为优选IP的二级域名。
import requests
import csv

#########################只需要修改下面3项内容####################################
# Cloudflare API参数
api_token = "1" # ⚠ 修改1:这里填写步骤前面获取到的cloudflare账户API
zone_id = "2" # ⚠ 修改1:这里填写步骤前面获取到的cloudflare账户区域ID
domain = "3" # ⚠ 您的二级域名,我这里为cf.testcdn1.xyz
#########################以下内容不懂不可修改#####################################

# Cloudflare API端点
api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records"

# 请求标头
headers = {
"Authorization": f"Bearer {api_token}",
"Content-Type": "application/json"
}

# 删除指定二级域名下的所有 DNS 记录
def delete_all_dns_records():
response = requests.get(api_url, headers=headers, params={"name": domain})
if response.status_code == 200:
result = response.json()
dns_records = result["result"]
dns_record_ids = [record["id"] for record in dns_records]

for record_id in dns_record_ids:
delete_response = requests.delete(f"{api_url}/{record_id}", headers=headers)
if delete_response.status_code == 200:
print(f"已删除 DNS 记录: {record_id}")
else:
print(f"删除 DNS 记录时出错:{delete_response.text}")
else:
print("获取 DNS 记录时出错:", response.text)

# 获取优选 IP 数据并筛选延迟最低的 3 个数据
def fetch_and_filter_ips():
url = "https://api.345673.xyz/get_data"
key = "o1zrmHAF"
data = {"key": key}

response = requests.post(url, json=data)
if response.status_code == 200:
result = response.json()
if result["code"] == 200:
info = result["info"]

ip_list = []
for category_name, ips in info.items():
for ip_info in ips:
delay_str = ip_info["delay"].replace("ms", "")
try:
delay = float(delay_str)
ip_info["delay"] = delay
ip_info["category"] = category_name # 添加 category 信息
ip_list.append(ip_info)
except ValueError:
print("无法转换延迟值为浮点数:{}".format(ip_info['delay']))

# 按延迟排序并取前 3 个
ip_list.sort(key=lambda x: x["delay"])
top_3_ips = ip_list[:3]

with open('ip.csv', 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ["节点类别", "IP地址", "线路", "节点", "延迟", "下载速度", "时间"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()

for ip_info in top_3_ips:
writer.writerow({
"节点类别": ip_info["category"],
"IP地址": ip_info["ip"],
"线路": ip_info["line"],
"节点": ip_info["node"],
"延迟": ip_info["delay"],
"下载速度": ip_info["downloadspeed"],
"时间": ip_info["time"]
})

return [ip_info["ip"] for ip_info in top_3_ips]
else:
print("请求失败,错误信息:{}".format(result['info']))
else:
print("请求失败,状态码:{}".format(response.status_code))
return []

# 将筛选后的 IP 地址解析到 Cloudflare 域名下
def add_dns_records(ip_addresses):
for ip_address in ip_addresses:
data = {
"type": "A",
"name": domain,
"content": ip_address,
"ttl": 1,
"proxied": False
}
response = requests.post(api_url, headers=headers, json=data)
if response.status_code == 200:
print(f"IP地址 {ip_address} 已成功解析到 Cloudflare 域名下")
else:
print(f"解析IP地址 {ip_address} 时出错:{response.text}")

# 主函数
def main():
delete_all_dns_records()
ip_addresses = fetch_and_filter_ips()
if ip_addresses:
add_dns_records(ip_addresses)
print("所有操作已完成")
else:
print("没有符合条件的 IP 地址")

if __name__ == "__main__":
main()

iiii.回到控制窗口,测试执行以下命令,测试脚本是否可以正常使用。

python3 cf-speedtest2domains.py
# 这里python3 后面跟的就是你保存上面py源码的文件名。
  • 一些正常,你会获取到脚本返回日志的提示,一般如下。
# 返回日志内容,如果遇到报错,请根据日志内容自行检索解决办法。
已删除 DNS 记录: c540b0f77b320559a9e73bd340bd4ea1
已删除 DNS 记录: bbf0c86c7e50a6e35c05900d193a5846
已删除 DNS 记录: 689f033872587e1f20000d7b01834f4a
IP地址 162.159.153.62 已成功解析到 Cloudflare 域名下
IP地址 162.159.152.202 已成功解析到 Cloudflare 域名下
IP地址 162.159.136.54 已成功解析到 Cloudflare 域名下
# 也就是自动解析了符合条件的所有IP到了上文中设置cf.testcdn1.xyz二级域名下。

当你看到以上内容,恭喜你,已经成功编辑好了py脚本。

iiiii.设置自定运行

  • 一般我们可以通过两种方式来实现自动运行,crontab 和 VPS面板的计划任务

crontab 方法代码如下:

crontab -e
0 */6 * * * /usr/lib/python3 /home/cf-speedtest2domains.py
#6小时运行一次,根据自己的需求,可以修改时间。如果不清楚python3的路径,可使用 find / -name python3 查询。

计划任务 方法代码如下:

  • 常用的面板有很多,例如:宝塔、aapanel、1panel,这里不作赘述。
cd /< py文件存放目录 > && python3 < py文件 >
# 结合上文示例
cd /home && python3 cf-speedtest2domains.py

这样定时执行就部署完成,也就实现了自动将开源优选ip自动解析到设置的二级域名下(也就是自建优选IP的二级域名)。

5. 修改加速的站点主域名的CNAME解析到CDN优选IP域名。

i.返回Cloudflare控制中心 > 需要加速的站点主域名为default1.com的DNS配置页面。

ii.将default1.com的解析记录修改为优选IP的二级域名,这里按上述为cf.testcdn1.xyz。

  • 如有www,请直接cname到根域名下即可,可以直接设置为cf.testcdn1.xyz。

DONE

简单5步,上车成功,当然也会遇到很多报错,多数是SSL证书及cloudflare后台设置问题。

############################################################################################
下面附上一些常见错误:

重定向次数过多

提示我们重定向过多,这是因为HTTPS加密的问题,我们进入Cloudflare后台-SSL/TLS>概述
将SSL/TLS加密模式改为完全再次尝试访问

Invalid SSL Certificate或者fail

SSL证书有关的,VPS端检查站点是否配置https证书。

新增几个个通用脚本

直接可以使用github上一些开源api,提交,自行修改。

import requests
import csv

# Cloudflare API参数
api_token = "*********"
zone_id = "*****"
subdomain = "*****" # 您的二级域名

# Cloudflare API端点
api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records"

# 请求标头
headers = {
"Authorization": f"Bearer {api_token}",
"Content-Type": "application/json"
}

# 发送GET请求以获取所有指定二级域名下的DNS记录
response = requests.get(api_url, headers=headers, params={"name": subdomain})

# 检查响应状态码
if response.status_code == 200:
# 解析JSON响应
data = response.json()

# 遍历每个DNS记录并删除它们
for record in data['result']:
record_id = record['id']

# 构造删除记录的API端点
delete_url = f"{api_url}/{record_id}"

# 发送DELETE请求以删除记录
delete_response = requests.delete(delete_url, headers=headers)

# 检查删除记录的响应状态码
if delete_response.status_code == 200:
print(f"已成功删除DNS记录:{record['name']} - {record['content']}")
else:
print(f"删除DNS记录时出错:{delete_response.text}")

# 删除完毕后,您可以继续添加新的记录
# 定义文件URL和保存路径
url = "https://raw.githubusercontent.com/ymyuuu/IPDB/main/bestcf.txt"
save_path = "result.csv"

# 发送GET请求到URL
response = requests.get(url)

# 检查请求是否成功(状态码为200)
if response.status_code == 200:
# 解码响应内容为文本
content = response.text

# 将内容分割成行
lines = content.split('\n')

# 以写入模式打开CSV文件
with open(save_path, 'w', newline='', encoding='utf-8') as csvfile:
# 创建CSV写入器对象
csv_writer = csv.writer(csvfile)

# 遍历每一行
for line in lines:
# 通过空格分割行
data = line.split()

# 将数据写入CSV文件
csv_writer.writerow(data)

print("数据已保存到", save_path)

# 从CSV文件中读取IP地址并解析到Cloudflare域名下
with open(save_path, 'r', newline='', encoding='utf-8') as csvfile:
# 创建CSV读取器对象
csv_reader = csv.reader(csvfile)

# 跳过标题行(如果有的话)
next(csv_reader)

# 读取每一行数据
for row in csv_reader:
ip_address = row[0] # 假设IP地址在第一列

# Cloudflare API端点
api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records"

# 请求主体
data = {
"type": "A",
"name": subdomain,
"content": ip_address,
"ttl": 1, # TTL(生存时间),以秒为单位
"proxied": False # 关闭Cloudflare代理
}

# 发送POST请求以创建DNS记录
response = requests.post(api_url, headers=headers, json=data)

# 检查响应状态码
if response.status_code == 200:
print(f"IP地址 {ip_address} 已成功解析到 Cloudflare 域名下")
else:
print(f"解析IP地址 {ip_address} 时出错:", response.text)
else:
print("无法从URL检索数据")
else:
print("获取DNS记录时出错:", response.text)

or

import requests
import csv

# Cloudflare API参数
api_token = "****"
zone_id = "****"
subdomain = "****" # 您的二级域名

# Cloudflare API端点
api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records"

# 请求标头
headers = {
"Authorization": f"Bearer {api_token}",
"Content-Type": "application/json"
}

# 发送GET请求以获取所有指定二级域名下的DNS记录
response = requests.get(api_url, headers=headers, params={"name": subdomain})

# 检查响应状态码
if response.status_code == 200:
# 解析JSON响应
data = response.json()

# 遍历每个DNS记录并删除它们
for record in data['result']:
record_id = record['id']

# 构造删除记录的API端点
delete_url = f"{api_url}/{record_id}"

# 发送DELETE请求以删除记录
delete_response = requests.delete(delete_url, headers=headers)

# 检查删除记录的响应状态码
if delete_response.status_code == 200:
print(f"已成功删除DNS记录:{record['name']} - {record['content']}")
else:
print(f"删除DNS记录时出错:{delete_response.text}")

# 删除完毕后,您可以继续添加新的记录
# 定义文件URL和保存路径
url = "https://raw.githubusercontent.com/ymyuuu/IPDB/main/bestproxy.txt"
save_path = "result.csv"

# 发送GET请求到URL
response = requests.get(url)

# 检查请求是否成功(状态码为200)
if response.status_code == 200:
# 解码响应内容为文本
content = response.text

# 将内容分割成行
lines = content.split('\n')

# 以写入模式打开CSV文件
with open(save_path, 'w', newline='', encoding='utf-8') as csvfile:
# 创建CSV写入器对象
csv_writer = csv.writer(csvfile)

# 遍历每一行
for line in lines:
# 通过空格分割行
data = line.split()

# 将数据写入CSV文件
csv_writer.writerow(data)

print("数据已保存到", save_path)

# 从CSV文件中读取IP地址并解析到Cloudflare域名下
with open(save_path, 'r', newline='', encoding='utf-8') as csvfile:
# 创建CSV读取器对象
csv_reader = csv.reader(csvfile)

# 跳过标题行(如果有的话)
next(csv_reader, None)

# 读取每一行数据
for row in csv_reader:
if row: # 检查行是否为空
ip_address = row[0] # 假设IP地址在第一列

# 请求主体
data = {
"type": "A",
"name": subdomain,
"content": ip_address,
"ttl": 1, # TTL(生存时间),以秒为单位
"proxied": False # 关闭 Cloudflare 代理
}

# 发送POST请求以创建DNS记录
response = requests.post(api_url, headers=headers, json=data)

# 检查响应状态码
if response.status_code == 200:
print(f"IP地址 {ip_address} 已成功解析到 Cloudflare 域名下")
else:
print(f"解析IP地址 {ip_address} 时出错:", response.text)
else:
print("无法从URL检索数据")
else:
print("获取DNS记录时出错:", response.text)