根据此处https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers#x-forwarded-proto的文档
Envoy代理将标头X-Forwarded-Proto
添加到请求中,由于某种原因标头值错误;尽管传入请求方案为http
,但仍将其设置为https
,由于它取决于此标头的正确值,因此在我的应用程序代码中会引起一些问题。
这是使节中的错误吗?我可以阻止特使这样做吗?
答案 0 :(得分:3)
正如我在评论中提到的,与此相关的github issue。
有没有一种方法可以防止特使添加特定的标题?
有istio dev @howardjohn comment关于
我们目前有两种选择:
不会有三分之一;相反,我们将推广alpha API。
所以第一个选择是使节过滤器。
以上github问题中有2个答案。
Answer由@ jh-sz提供
通常,将Envoy部署为边缘节点(也称为前端代理)时,use_remote_address应该设置为true,而当将Envoy用作网状部署中的内部服务节点时,use_remote_address可能需要设置为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
AND
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地址和证书)传输到群集中运行的工作负载。
在Istio安装过程中,可以通过MeshConfig或通过添加Pod批注来管理XFF和XFCC标头的配置。请注意,Meshconfig配置是所有网关工作负载的全局设置,而pod注释会根据每个工作负载覆盖全局设置。
答案 1 :(得分:2)
发生这种情况的原因很可能是因为您在Envoy / Istio前面有一个或多个代理。
您需要告诉Envoy它前面有多少代理,以便它可以正确设置转发的标头(例如X-Forwarded-Proto
和X-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。