【问题标题】:x-forwarded-for header is not shown on Envoy responsex-forwarded-for 标头未显示在 Envoy 响应中
【发布时间】:2020-07-22 11:23:24
【问题描述】:

我有一个有效的 LDS.yaml 文件,我想在标题中添加x-forwarded-for,因为在特使文档中说如果特使作为边缘服务器工作,它应该显示出来。但是当我使用这个best practice configurationhttps://www.envoyproxy.io/docs/envoy/latest/configuration/best_practices/edge时,没有显示标题x-forwarded-for

这是我的 LDS.yaml

version_info: "0"
resources:
  # not enforcing https
  - name: "http_listener"
    "@type": type.googleapis.com/envoy.api.v2.Listener  
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    filter_chains:
      filters:
        - name: envoy.filters.network.http_connection_manager
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
            server_name: foo.example.com
            request_timeout: 60s
            use_remote_address: true # enabling x-forward-for
            xff_num_trusted_hops: 1 # only show 1 x-forward-for
            always_set_request_id_in_response: true # enable x-request-id
            codec_type: auto
            stat_prefix: ingress_http
            http_filters:
              - name: envoy.filters.http.router
                typed_config: {}
            route_config:
...

有什么问题吗?

谢谢!

【问题讨论】:

    标签: envoyproxy


    【解决方案1】:

    use_remote实际上禁用了X-FORWARDED-FOR的使用

    如果设置为 true,则连接管理器将在确定内部与外部来源并处理各种标头时使用客户端连接的真实远程地址。如果设置为 false 或不存在,连接管理器将使用 x-forwarded-for HTTP 标头。有关详细信息,请参阅 x-forwarded-for、x-envoy-internal 和 x-envoy-external-address 的文档。

    use_remotefalse 时应使用xff_num_trusted_hops

    Google 可以很好地记录 X-Forwarded-For 标头在其平台 (Source) 上的外观和行为。

    X-Forwarded-For: <client-ip>,<load-balancer-ip>

    我不确定这是一两次跳转,但如果请求来自 Google LB,您可以“信任”(?)client-ip 是通信的实际 IP使用 Google LB。


    我自己正在努力让特使记录整个X-FORWARDED-FOR 标头。

    当我使用use_remote: true 时,我得到了负载平衡器的 IP 地址。当我使用use_remote: false 时,我得到-。无论哪种情况,我都知道这些不是我正在寻找的 X-FORWARDED-FOR 标头。 (Envoy: Access logging)


    我想看看我是否真的收到了 X-Forwarded-For 标头,因此我编辑了访问日志块以记录 X-Forwarded-For 的几个不同实例和我自己的自定义标头:

    #add this to "envoy.filters.network.http_connection_manager" config
    access_log:
      - name: envoy.access_loggers.stdout
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
          log_format:
            json_format: 
              a: "%REQ(X-Forwarded-For)%"
              b: "%REQ(X-FORWARDED-FOR)%"
              mine: "%REQ(X-MY-HEADER)%"
    

    curl -k http://my-envoy.com:8080/ready -v -H 'X-MY-HEADER: mine'

    {"a":null,"b":null,"mine":"mine"}
    

    所以在我的例子中,envoy 前面的代理默认没有设置 X-Forwarded-For 标头。

    然后我可以通过发出这个 curl 请求来验证这一点:

    curl -k http://my-envoy.com:8080/ready -v -H 'X-MY-HEADER: mine' -H 'X-Forwarded-For: 127.0.0.1'

    {"b":"127.0.0.1","a":"127.0.0.1","mine":"mine"}
    

    所以访问日志不区分大小写,如果确实存在,它记录标头 X-Forwarded-For 标头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2018-06-15
      • 2022-09-24
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2021-05-20
      相关资源
      最近更新 更多