记一次 X-Forwarded-For 问题排查

· · 科技·工程

环境:阿里云边缘安全加速 ESA、Caddy

Caddyfile:

bpoj.top {
  encode zstd gzip
  log {
    output file /data/access.log {
      roll_size 1gb
      roll_keep_for 72h
    }
    format json
  }
  # Handle static files directly, for better performance.
  root * /root/.hydro/static
  @static {
    file {
      try_files {path}
    }
  }
  handle @static {
    file_server
  }
  handle {
    reverse_proxy http://127.0.0.1:8888
  }
}

使用 Caddy 作为反代服务器时,会出现后端 X-Forwarded-For 取值异常的情况,导致无法获取用户的真实 ip。

原因分析:如果 Caddyfile 没有配置 trusted_proxies,Caddy 会忽略客户端传来的 xff 值并自己解析 xff 给上游,这样后端实际拿到的 X-Forwarded-For 值一般是 client_ip,也就是阿里云加速节点的实际 ip。

相关文档:

解决方案:

{
  servers {
    trusted_proxies static <回源 ip 段>
    trusted_proxies_strict
    client_ip_headers X-Forwarded-For ali-real-client-ip
  }
}
bpoj.top {
  encode zstd gzip
  log {
    output file /data/access.log {
      roll_size 1gb
      roll_keep_for 72h
    }
    format json
  }
  # Handle static files directly, for better performance.
  root * /root/.hydro/static
  @static {
    file {
      try_files {path}
    }
  }
  handle @static {
    file_server
  }
  handle {
    reverse_proxy http://127.0.0.1:8888
  }
}

或者 esa 使用默认请求头配置,后端直接读取 ali-real-client-ip 标头。