跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • tg群组
折叠

数字游民论坛

  1. 论坛主页
  2. 版块
  3. 自由职业与技能市场
  4. 不需设置trustIPs, 使用traefik在 Cloudflare 后安全获取客户端真实 IP

不需设置trustIPs, 使用traefik在 Cloudflare 后安全获取客户端真实 IP

已定时 已固定 已锁定 已移动 自由职业与技能市场
服务器
3 帖子 2 发布者 68 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • A 离线
    A 离线
    admin
    写于 最后由 admin 编辑
    #1

    目标

    通过 Cloudflare 添加自定义 header 和 token,在 Traefik 中启用 header 转发并验证 token,最后在后端安全获取客户端真实 IP。


    步骤

    1. 在 Cloudflare 中设置自定义 Header 和 Token
    1. 登录 Cloudflare 仪表盘,选择你的域名。
    2. 导航到 Rules(规则) > Transform Rules(转换规则) > Modify Request Header(修改请求头)。
    3. 创建一个新规则:
      • 规则名称:例如 Add-Auth-Token
      • 匹配条件:选择所有传入请求(All incoming requests),或根据需要设置特定路径。
      • 操作:选择 Add Header(添加头部)。
      • Header 名称:例如 X-Auth-Token。
      • Header 值:输入一个安全的 token,例如 your-secret-token-123(建议使用复杂且唯一的字符串)。
    4. 保存并部署规则。
      • 所有通过 Cloudflare 的请求都会带上 X-Auth-Token: your-secret-token-123。
    2. 在 Traefik 中启用 Header 转发

    Traefik 默认会转发所有 header,我们只需要确保它能正确处理 Cloudflare 的真实 IP header(如 CF-Connecting-IP)。

    1. 编辑 Traefik 的配置文件(traefik.yml):
      entryPoints:
        web:
          address: ":80"
          forwardedHeaders:
            insecure: true  # 允许转发所有 header,包括 CF-Connecting-IP
      
      • insecure: true 表示 Traefik 会信任并转发上游(如 Cloudflare)发送的 header,无需显式指定 trustedIPs。
    3. 在站点配置中匹配 Header 和 Token

    在 Traefik 的动态配置中,添加中间件以验证 X-Auth-Token,确保只有合法请求被转发到后端。

    1. 创建路由规则(例如在动态配置文件中):
        routers:
          my-site:
            rule: "Host(`example.com`) && Header(`X-Auth-Token`, `your-secret-token-123`)"
            service: my-service
        services:
          my-service:
            loadBalancer:
              servers:
                - url: "http://backend:8080"
      
    4. 在后端程序中安全获取真实 IP

    在后端代码中,进一步验证 X-Auth-Token,确保只有来自 Cloudflare 的合法请求的 IP 被信任。

    示例(使用 Python Flask):

    from flask import Flask, request
    
    app = Flask(__name__)
    VALID_TOKEN = "your-secret-token-123"
    
    @app.route('/')
    def get_client_ip():
        auth_token = request.headers.get("X-Auth-Token")
        if auth_token != VALID_TOKEN:
            return "Unauthorized: Invalid token", 403
        
        # 信任 Cloudflare 的 CF-Connecting-IP
        real_ip = request.headers.get("CF-Connecting-IP", request.remote_addr)
        return f"Client Real IP: {real_ip}"
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", port=8080)
    

    这种方法的优点

    1. 无需维护 trustedIPs 列表:
      • 使用 trustedIPs 需要手动列出 Cloudflare 的 IP 范围(如 173.245.48.0/20 等),而 Cloudflare 的 IP 列表可能会更新。每次更新都需要手动调整配置,非常麻烦且容易出错。
      • 本方法通过 token 验证请求来源,完全避免了依赖 IP 列表的维护问题。
    2. 更高的灵活性:
      • Token 可以随时在 Cloudflare 仪表盘中更改,无需修改服务器端配置文件,操作更简单。
      • 相比硬编码 IP 范围,token 的动态性更适合快速调整安全策略。
    3. 增强安全性:
      • 即使攻击者伪造了 Cloudflare 的 IP,也无法通过 token 验证,确保只有合法请求被信任。
      • 避免了因 IP 列表过时而导致的安全漏洞。
    4. 简化配置:
      • 不需要频繁同步 Cloudflare 的 IP 列表到 Traefik,减少了配置复杂度和维护成本。

    注意事项

    1. 安全性:
      • X-Auth-Token 是核心验证依据,建议定期更新并通过环境变量管理。
      • 如果使用 forwardedHeaders.insecure: true,确保后端严格验证 token。
    2. 测试:
      • 使用 curl 测试:
        curl -H "X-Auth-Token: your-secret-token-123" http://example.com
        
      • 确认返回的是客户端真实 IP。

    总结

    通过 Cloudflare 添加 X-Auth-Token,在 Traefik 中启用 header 转发并验证 token,后端检查 token 后获取真实 IP,这种方法既安全又高效。相比使用 trustedIPs 的传统方式,它避免了 IP 列表维护的麻烦,提供了更高的灵活性和安全性。

    1 条回复 最后回复
    0
    • R 离线
      R 离线
      raintrip
      编写于 最后由 编辑
      #2

      middlewares:
      - auth-token
      这个是在哪里呢?

      A 1 条回复 最后回复
      0
      • R raintrip

        middlewares:
        - auth-token
        这个是在哪里呢?

        A 离线
        A 离线
        admin
        编写于 最后由 编辑
        #3

        @raintrip 在 不需设置trustIPs, 使用traefik在 Cloudflare 后安全获取客户端真实 IP 中说:

        middlewares:
        - auth-token
        这个是在哪里呢?

        不需要, 已经去掉了

        1 条回复 最后回复
        0
        回复
        • 在新帖中回复
        登录后回复
        • 从旧到新
        • 从新到旧
        • 最多赞同


        • 登录

        • 没有帐号? 注册

        • 登录或注册以进行搜索。
        • 第一个帖子
          最后一个帖子
        0
        • 版块
        • 最新
        • 标签
        • 热门
        • tg群组