暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在 Cloudflare Workers 中实现修改阿里云策略的功能

老柴杂货铺 2025-01-13
53

在 Cloudflare Workers 中实现修改阿里云策略的功能是可行的。Cloudflare Workers 是一个无服务器平台,支持使用 JavaScript 编写代码并运行在 Cloudflare 的边缘节点上。可以通过 Workers 调用阿里云的 API 来实现策略修改。

以下是实现步骤和示例代码:


实现步骤

  1. 获取阿里云 API 的 AccessKey

    • 登录阿里云控制台,创建 AccessKey(AccessKey ID 和 AccessKey Secret)。

    • 确保 AccessKey 有权限执行相关操作(如修改安全组规则)。

  2. 编写 Cloudflare Worker 代码

    • 使用 JavaScript 编写 Worker 代码,调用阿里云 API。

    • 使用 fetch
       或 axios
       发送 HTTP 请求。

  3. 部署 Worker

    • 将代码部署到 Cloudflare Workers。并在workers中配置变量。

    • accessKeyId = '你的AccessKey ID';
    • accessKeySecret = '你的AccessKey Secret';


    • regionId = 'cn-hangzhou'// 区域 ID
    • securityGroupId = 'sg-xxxxxx'// 安全组 ID

  4. 测试 Worker

    • 通过 HTTP 请求触发 Worker,验证功能是否正常。

    • 1.直接访问,返回访问ip

    • 2.新增了一个接口ctt,可以显示区域:

3.使用接口api,并传入参数,添加阿里云策略
https://your-worker.example.com/api?action=authorize&ip=1.2.3.4&port=80&desc=test
检查返回结果,确认安全组规则是否修改成功。
示例代码:
    // Cloudflare Worker 入口
    addEventListener('fetch', (event) => {
        event.respondWith(handleRequest(event.request));
      });
      
      async function handleRequest(request) {
        try {
          解析请求参数
          
          const url = new URL(request.url);
          const { pathname } = new URL(request.url);
          const country = request.headers.get("cf-ipcountry");
          const city = request.headers.get("cf-ipcity");
          const asn = request.headers.get("x-asn");
          const action = url.searchParams.get('action'); // 操作类型(如 authorize/revoke)
          var ip = url.searchParams.get('ip'); // 允许的 IP 地址
          const userip = request.headers.get('CF-Connecting-IP'); // 客户访问ip
          const port = url.searchParams.get('port'); // 端口号
          var desc = url.searchParams.get('desc'); // 注释
      
          // 如果未传递ip,则使用userip
          if (!ip) {
            ip = userip;
          }
      
          // 如未传递desc,则赋值一个文本
          if (!desc) {
            desc = `Cloudflare Allow IP:${ip}`;
          }
      
          if (pathname === "/ctt") {
            return new Response(`${desc}:${pathname}:${country}:${city}:${asn}`, { status: 500 });
          }
      
          if (!action || !port) {
            return new Response(`${ip}`, { status: 500 });
          }
      
      
          
          // 调用阿里云 API
          if (pathname === "/api") {
            const result = await callAliyunAPI(action, ip, port, desc);
            // 返回结果
            return new Response(JSON.stringify(result), {
            headers: { 'Content-Type''application/json' },
            });
          }
        
      
        } catch (error) {
          return new Response(`Error: ${error.message}`, { status: 500 });
        }
      }
      
      // 调用阿里云 API 的函数
      async function callAliyunAPI(action, ip, port, desc) {
        //修改为在workers中添加变量
        //const accessKeyId =    //'你的AccessKey ID';
        //const accessKeySecret = '你的AccessKey Secret';
        //const regionId = 'cn-hangzhou'// 区域 ID
        //const securityGroupId = 'sg-xxxxxx'// 安全组 ID
      
        // 阿里云 API 的公共参数
        const commonParams = {
          Format: 'JSON',
          Version: '2014-05-26'// API 版本
          AccessKeyId: accessKeyId,
          SignatureMethod: 'HMAC-SHA1',
          Timestamp: new Date().toISOString().replace(/\.\d+Z$/'Z'),
          SignatureVersion: '1.0',
          SignatureNonce: Math.random().toString(36).substring(7),
          RegionId: regionId,
          SecurityGroupId: securityGroupId,
          IpProtocol: 'tcp',
          PortRange: `${port}/${port}`,
          SourceCidrIp: ip,
          Policy: 'accept',
          Priority: 1,
          NicType: 'internet',
          Description: desc,
        };
      
        // 根据操作类型设置 API 名称
        const apiName = action === 'authorize' ? 'AuthorizeSecurityGroup' : 'RevokeSecurityGroup';
        commonParams.Action = apiName;
      
        // 生成签名
        const signature = await generateSignature(commonParams, accessKeySecret);
        commonParams.Signature = signature;
      
        // 发送请求
        const apiUrl = 'https://ecs.aliyuncs.com/';
        const response = await fetch(apiUrl, {
          method: 'POST',
          headers: { 'Content-Type''application/x-www-form-urlencoded' },
          body: new URLSearchParams(commonParams),
        });
      
        return response.json();
      }
      
      // 使用 Web Crypto API 生成签名的函数
      async function generateSignature(params, accessKeySecret) {
        // 将参数排序并编码
        const sortedParams = Object.keys(params)
          .sort()
          .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
          .join('&');
      
        // 构造待签名的字符串
        const stringToSign = `POST&%2F&${encodeURIComponent(sortedParams)}`;
      
        // 使用 Web Crypto API 生成 HMAC-SHA1 签名
        const encoder = new TextEncoder();
        const key = await crypto.subtle.importKey(
          'raw',
          encoder.encode(accessKeySecret + '&'),
          { name: 'HMAC', hash: 'SHA-1' },
          false,
          ['sign']
        );
        const signatureArray = await crypto.subtle.sign('HMAC', key, encoder.encode(stringToSign));
      
        // 将签名转换为 Base64
        const signatureBase64 = btoa(String.fromCharCode(...new Uint8Array(signatureArray)));
        return signatureBase64;
      }



    文章转载自老柴杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论