侧边栏壁纸
  • 累计撰写 57 篇文章
  • 累计创建 37 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

利用 Cloudflare Workers访问GitHub

nankle
2025-04-16 / 0 评论 / 0 点赞 / 8 阅读 / 19646 字
温馨提示:
本文最后更新于 2025-04-17,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

我们在学习研究其他人的代码时,偶尔会遇到git访问不了的情况,通过 Cloudflare 的 workers 来实现反向代理,访问 GitHub。

关于 Cloudflare

要实现在国内利用 workers 访问 GitHub。那么前提条件就是你有一个 Cloudflare 账号以及一个域名。关于什么是 Cloudflare,这里简单说一下:

Cloudflare 是一家广受认可的公司,在互联网行业中享有良好声誉。他们的服务被许多大型企业和网站使用,以提供网络安全防护、DDoS 攻击防御和性能优化等功能,也是目前还提供免费 CDN 的良心厂商之一。简称 赛博大活佛。

那么话不多说,我们直接开始今天的教程。

准备工作

登录自己的 CF 账号,且将你的域名,托管到 CF。这一步很重要。 将域名托管到 CF 的方法也很简单,我们只要去对应的域名厂商,把 name server 服务器改成 CF 的就行。

类型

NS

bowen.ns.cloudflare.com

NS

leia.ns.cloudflare.com

注意:CF 的 name server 服务器并不是只有以上两个。得看你添加站点的时候的页面提示是哪两个。

创建 Worker

  1. 点击左侧菜单栏的 Workers 和 Pages

  2. 点击概述 – 创建 – 创建 worker,然后名字和代码不用管。我们先直接点击部署。当然,你也可以起你想要的名字,不过这个并不太重要。

  3. 部署成功后,页面会提示部署成功。然后此时我们再点击编辑代码。

复制代码

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 污染,还是无法访问该站点的。此时我们就需要添加我们自己的域名,从而实现访问了。

添加自定义域名

  1. 然后我们点击 设置 – 触发器 - 添加自定义域名,然后保存

  2. 将域名托管到 CF 的好处是,我们无需先新建一个域名记录,在 worker 这里直接输入自定义域名,就可以自动帮我们创建好了。如下图,输入自己的期望域名后,点击保存即可

  3. 保存之后,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}")

运行结果为:

0

评论区