【问题标题】:Is there a way to prevent envoy from adding specific headers?有没有办法阻止特使添加特定的标头?
【发布时间】:2020-08-25 16:28:45
【问题描述】:

根据此处的文档https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers#x-forwarded-proto Envoy 代理在请求中添加了 Header X-Forwarded-Proto,由于某种原因头部值错误;它将它设置为http,尽管传入的请求方案是https,这会导致我的应用程序代码出现一些问题,因为它取决于此标头的正确值。

这是 envoy 的错误吗?我可以阻止特使这样做吗?

【问题讨论】:

  • 我假设你使用 istio 就像你使用 istio 标签一样,我在 github 上检查了这个问题,并且有相关的 github issue 与此相关。据我了解,您可以使用 envoy 过滤器将所有 http X-Forwarded-Proto 更改为 https,请查看 thisthis 评论。另外看看alpha api
  • @Jakub 非常感谢你,这正是我的问题,我以与提到的 cmets 之一相同的方式解决了它。
  • 很高兴它为您工作!我添加了一个答案以提高知名度。如果它有助于考虑投票/接受答案。

标签: kubernetes istio envoyproxy


【解决方案1】:

正如我在 cmets 中提到的,与 github issue 相关。

有没有办法阻止特使添加特定的标头?

关于那个,有 istio dev @howardjohn comment

我们目前有两种选择:

不会有第三个;相反,我们将推广 alpha API。


所以第一个选项是特使过滤器。


上面的github问题有2个答案。

Answer@jh-sz 提供

一般来说,当 Envoy 部署为边缘节点(也称为前端代理)时,use_remote_address 应设置为 true,而当 Envoy 用作网格部署中的内部服务节点时,可能需要设置为 false。

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: xff-trust-hops
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      istio: ingressgateway
  configPatches:
  - applyTo: NETWORK_FILTER
    match:
      context: ANY
      listener:
        filterChain:
          filter:
            name: "envoy.http_connection_manager"
    patch:
      operation: MERGE
      value:
        typed_config:
          "@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager"
          use_remote_address: true
          xff_num_trusted_hops: 1


Answer@vadimi 提供

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: my-app-filter
spec:
  workloadLabels:
    app: my-app
  filters:
  - listenerMatch:
      portNumber: 5120
      listenerType: SIDECAR_INBOUND
    filterName: envoy.lua
    filterType: HTTP
    filterConfig:
      inlineCode: |
        function envoy_on_request(request_handle)
          request_handle:headers():replace("x-forwarded-proto", "https")
        end
        function envoy_on_response(response_handle)
        end

第二个选项是 Alpha api,此功能正在积极开发中,被认为是 pre-alpha。


Istio 提供了管理 X-Forwarded-For (XFF) 和 X-Forwarded-Client-Cert (XFCC) 等设置的能力,这些设置取决于网关工作负载的部署方式。这是目前正在开发的功能。有关 X-Forwarded-For 的更多信息,请参阅 IETF 的 RFC

您可以选择在各种网络拓扑中部署 Istio 入口网关(例如,在 Cloud Load Balancer、自我管理的负载平衡器后面或直接将 Istio 入口网关公开到 Internet)。因此,这些拓扑需要不同的入口网关配置,以便将 IP 地址和证书等正确的客户端属性传输到集群中运行的工作负载。

XFF 和 XFCC 标头的配置在 Istio 安装期间通过 MeshConfig 或通过添加 pod 注释进行管理。请注意,Meshconfig 配置是所有网关工作负载的全局设置,而 pod 注释会覆盖每个工作负载的全局设置。

【讨论】:

    【解决方案2】:

    发生这种情况的原因很可能是因为您在 Envoy/Istio 前面有一个或多个代理。

    您需要告诉 Envoy 前面有多少个代理,以便它可以正确设置转发的标头(例如 X-Forwarded-ProtoX-Forwarded-For)。

    在 Istio 1.4+ 中,您可以使用 Envoy 过滤器实现此目的:

    apiVersion: networking.istio.io/v1alpha3
    kind: EnvoyFilter
    metadata:
      name: xff-trust-hops
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      configPatches:
      - applyTo: NETWORK_FILTER
        match:
          context: ANY
          listener:
            filterChain:
              filter:
                name: "envoy.http_connection_manager"
        patch:
          operation: MERGE
          value:
            typed_config:
              "@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager"
              use_remote_address: true
              xff_num_trusted_hops: 1 # Change as needed
    

    请注意,如果 Envoy 前面有多个代理,则必须将 xff_num_trusted_hops 变量更改为正确的数量。例如,如果您有 GCP 或 AWS 云负载均衡器,您可能需要将此值增加到 2。

    在 Istio 1.8+ 中,您将能够通过 Istio 运算符进行配置,例如:

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      meshConfig:
        defaultConfig:
          gatewayTopology:
            numTrustedProxies: 1 # Change as needed
    

    更多信息请见here

    【讨论】:

    • 感谢您回答我的问题与here所描述的问题完全相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    相关资源
    最近更新 更多