我们在学习研究其他人的代码时,偶尔会遇到git访问不了的情况,通过 Cloudflare 的 workers 来实现反向代理,访问 GitHub。
关于 Cloudflare
要实现在国内利用 workers 访问 GitHub。那么前提条件就是你有一个 Cloudflare 账号以及一个域名。关于什么是 Cloudflare,这里简单说一下:
Cloudflare 是一家广受认可的公司,在互联网行业中享有良好声誉。他们的服务被许多大型企业和网站使用,以提供网络安全防护、DDoS 攻击防御和性能优化等功能,也是目前还提供免费 CDN 的良心厂商之一。简称 赛博大活佛。
那么话不多说,我们直接开始今天的教程。
准备工作
登录自己的 CF 账号,且将你的域名,托管到 CF。这一步很重要。 将域名托管到 CF 的方法也很简单,我们只要去对应的域名厂商,把 name server 服务器改成 CF 的就行。
注意:CF 的 name server 服务器并不是只有以上两个。得看你添加站点的时候的页面提示是哪两个。
创建 Worker
点击左侧菜单栏的 Workers 和 Pages
点击概述 – 创建 – 创建 worker,然后名字和代码不用管。我们先直接点击部署。当然,你也可以起你想要的名字,不过这个并不太重要。
部署成功后,页面会提示部署成功。然后此时我们再点击编辑代码。
复制代码
export default {
async fetch(request, env) {
const _url = new URL(request.url);
const hostname = _url.hostname
_url.hostname = "github.com"
const req = new Request(_url, request);
req.headers.set('origin', 'https://github.com');
const res = await fetch(req);
let newres = new Response(res.body, res);
let location = newres.headers.get('location');
if (location !== null && location !== "") {
location = location.replace('://github.com', '://'+hostname);
newres.headers.set('location', location);
}
return newres;
},
};
复制
复制以上代码后,点击右上角的 部署。部署最新的代码即可。
到这一步,我们已经完成了 50% 了。此时如果你有科技的力量。那么已经可以通过 CF 分配的域名访问该站点了,如果是国内网络那么由于 DNS 污染,还是无法访问该站点的。此时我们就需要添加我们自己的域名,从而实现访问了。
添加自定义域名
然后我们点击 设置 – 触发器 - 添加自定义域名,然后保存
将域名托管到 CF 的好处是,我们无需先新建一个域名记录,在 worker 这里直接输入自定义域名,就可以自动帮我们创建好了。如下图,输入自己的期望域名后,点击保存即可
保存之后,1 分钟之内的时间,CF 就会帮我们设置好记录以及开启 HTTPS。然后我们访问我们的自定义域名,大功告成!!!
重要提示: 千万要注意,我们搭建好的站点尽量我们自己小范围学习使用,如果有滥用情况,CF 可能会有概率封号的。
来源:https://cloud.tencent.com/developer/article/2481633
后续:
经过一段时间后,cloudflare发来了邮件,说我的这个地址涉嫌钓鱼网站,已经给我封禁,为了能自己使用,不让别人访问,我重新创建了一个地址,并增加了防火墙,只有我家的ip才能访问
ip不等于就会阻止
因为家宽的ip可能会变,我写了一个程序,定时执行更新ip(cloudflare支持通过api调用修改配置),具体步骤为:
1. 获取动态 DNS 的最新 IP 地址
2. 获取 Cloudflare 中规则集的所有规则
3. 提取当前配置的 IP 地址
4. 比较最新 IP 和当前配置的 IP
5. 如果不同则更新防火墙规则
代码如下:
import requests
import json
import dns.resolver # 需要安装 dnspython 库
import re
# Cloudflare API 配置
CLOUDFLARE_API_URL = "https://api.cloudflare.com/client/v4/"
ZONE_ID = "0ee75b1661a9**********80ddadb4c2" # 替换为你的Zone ID
API_TOKEN = "Qm-MU6Wl**********XFn9gTUVLHuxDDk-kfOQ" # 替换为你的API Token
RULESET_ID = "031d1ddad0**********5e0ce35612b" # 替换为你的Ruleset ID
RULE_ID = "d2208d8ebd**********f3673089dad" # 替换为你的防火墙规则ID
# 动态DNS域名
DYNAMIC_DNS_DOMAIN = "***.***.top"
# 获取动态DNS解析的IP地址
def get_dynamic_dns_ip():
try:
# 查询域名的A记录
answers = dns.resolver.resolve(DYNAMIC_DNS_DOMAIN, 'A')
# 返回第一个解析到的IP地址
return str(answers[0])
except Exception as e:
raise Exception(f"获取动态DNS IP失败: {e}")
# 获取Cloudflare中指定规则集的所有规则
def get_ruleset_rules():
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
}
url = f"{CLOUDFLARE_API_URL}zones/{ZONE_ID}/rulesets/{RULESET_ID}"
# 发送 GET 请求
response = requests.get(url, headers=headers)
if response.status_code == 200:
ruleset_data = response.json()
return ruleset_data["result"]["rules"]
else:
raise Exception(f"获取规则集失败: {response.text}")
# 更新Cloudflare防火墙规则
def update_firewall_rule(ip_address):
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
}
url = f"{CLOUDFLARE_API_URL}zones/{ZONE_ID}/rulesets/{RULESET_ID}/rules/{RULE_ID}"
# 构造请求体
payload = {
"action": "block",
"description": "github仅自己使用",
"enabled": True,
"expression": f'(http.request.full_uri wildcard "https://git-test.1890603.xyz/*" and ip.src ne {ip_address})',
"id": RULE_ID
}
# 发送 PATCH 请求
response = requests.patch(url, headers=headers, data=json.dumps(payload))
if response.status_code == 200:
print("防火墙规则更新成功!")
else:
print(f"防火墙规则更新失败: {response.text}")
if __name__ == "__main__":
try:
# 1. 获取动态 DNS 的最新 IP 地址
latest_ip = get_dynamic_dns_ip()
print(f"动态DNS解析的最新IP地址为: {latest_ip}")
# 2. 获取 Cloudflare 中规则集的所有规则
print("正在从Cloudflare获取规则集中的所有规则...")
rules = get_ruleset_rules()
target_rule = None
for rule in rules:
if rule["id"] == RULE_ID:
target_rule = rule
break
if not target_rule:
raise Exception(f"未找到ID为 {RULE_ID} 的规则,请检查配置是否正确。")
# 3. 提取当前配置的 IP 地址
rule_expression = target_rule["expression"]
print(f"当前防火墙规则的表达式为: {rule_expression}")
match = re.search(r'ip\.src ne (\d+\.\d+\.\d+\.\d+)', rule_expression)
if not match:
raise Exception("无法从防火墙规则表达式中提取IP地址,请检查规则格式是否正确。")
current_ip = match.group(1)
print(f"当前防火墙规则中配置的IP地址为: {current_ip}")
# 4. 比较最新 IP 和当前配置的 IP
if latest_ip == current_ip:
print("动态DNS解析的IP地址与防火墙规则中的IP地址相同,无需更新。")
else:
print(f"动态DNS解析的IP地址({latest_ip})与防火墙规则中的IP地址({current_ip})不同,正在更新防火墙规则...")
# 5. 更新防火墙规则
update_firewall_rule(latest_ip)
except Exception as e:
print(f"发生错误: {e}")
运行结果为:
评论区