istio: Some HTTP/2 requests fail with duplicate value in envoy authority request header
Is this the right place to submit this?
- This is not a security vulnerability or a crashing bug
- This is not a question about how to use Istio
Bug Description
Hi all,
I am using SAP BTP Kyma and hitting a truly strange situation. I’m at a bit of a loss as to why this issue is occurring, but it seems it might be occurring between Kyma and Istio, and since there are differing areas of expertise in those repos, I am cross-posting this issue in both repositories and linking them together (not something I’d typically do.)
Background
We use SAP BTP Kyma, which uses Istio:
- Kubernetes v1.26.9
- Istio v1.19.3
Within Kyma, we are using an API Rule to allow traffic. It is a very broad rule currently, allowing put/get/post/delete requests across .*
Kyma, as I understand, uses Istio VirtualServices to work with a single kyma-gateway.
I am newer to troubleshooting both Istio and Kyma, so I don’t want anyone to assume that I know something I don’t; let me know if I’m missing something conceptually.
The Problem
All HTTP/1.x requests to our app succeed. However, some HTTP/2 requests succeed, and some do not.
- I can make HTTP/2 requests via Insomnia (on Windows) or curl (via WSL) and receive a successful response.
- In some cases, with some clients – Apidog on Windows, or an SAP environment that’s making an HTTP/1.1 request and wrapping it in HTTP/2 – those same calls result in a 404 error (I can flip a switch for HTTP/2 support on/off on the client and it will work when not an HTTP/2 request). Same body, same URL, same content-type, etc. etc.
After a bunch of troubleshooting and getting deeper into the Istio logs, I noticed a pattern.
In the requests that fail, the authority header within istio seems to be duplicated. E.g. if the correct authority is xyz, the value being shown in the logs is xyz,xyz. Requests that fail seem to consistently have this occur, and I have never seen it occur in a successful request.
I am having difficulty understanding whether:
- The calling clients are somehow doing something they shouldn’t that’s not in the spirit of HTTP/2
- The Kyma/istio integration is causing this to be duplicated
- Something within Istio is causing it to be duplicated.
Logs
Istio logs for a failed request
2023-11-29T19:16:18.155693Z debug envoy filter external/envoy/source/extensions/filters/listener/tls_inspector/tls_inspector.cc:137 tls:onServerName(), requestedServerName: cip.REDACTED.kyma.ondemand.com thread=24
2023-11-29T19:16:18.203382Z debug envoy http2 external/envoy/source/common/http/http2/codec_impl.cc:1605 [Tags: "ConnectionId":"1735723"] updating connection-level initial window size to 268435456 thread=24
2023-11-29T19:16:18.204324Z debug envoy http external/envoy/source/common/http/conn_manager_impl.cc:378 [Tags: "ConnectionId":"1735723"] new stream thread=24
2023-11-29T19:16:18.204510Z debug envoy http external/envoy/source/common/http/conn_manager_impl.cc:1165 [Tags: "ConnectionId":"1735723","StreamId":"511241007191140157"] request headers complete (end_stream=false):
':method', 'POST'
':scheme', 'https'
':path', '/api/SvcRequest/ProcessServiceRequest'
':authority', 'cip.REDACTED.kyma.ondemand.com,cip.REDACTED.kyma.ondemand.com'
'content-type', 'application/xml; charset=utf-8'
'content-length', '1816'
'accept', 'application/xml'
'authorization', 'Bearer REDACTED'
'user-agent', 'SAP NetWeaver Application Server (1.0;757)'
'accept-encoding', 'gzip, br'
thread=24
2023-11-29T19:16:18.204576Z debug envoy connection external/envoy/source/common/network/connection_impl.h:98 [C1735723] current connecting state: false thread=24
2023-11-29T19:16:18.204632Z debug envoy filter source/extensions/filters/http/alpn/alpn_filter.cc:61 cannot find route entry thread=24
2023-11-29T19:16:18.204655Z debug envoy router external/envoy/source/common/router/router.cc:408 [Tags: "ConnectionId":"1735723","StreamId":"511241007191140157"] no route match for URL '/api/SvcRequest/ProcessServiceRequest' thread=24
2023-11-29T19:16:18.204669Z debug envoy http external/envoy/source/common/http/filter_manager.cc:946 [Tags: "ConnectionId":"1735723","StreamId":"511241007191140157"] Preparing local reply with details route_not_found thread=24
2023-11-29T19:16:18.204711Z debug envoy http external/envoy/source/common/http/filter_manager.cc:988 [Tags: "ConnectionId":"1735723","StreamId":"511241007191140157"] Executing sending local reply. thread=24
2023-11-29T19:16:18.204760Z debug envoy http external/envoy/source/common/http/conn_manager_impl.cc:1819 [Tags: "ConnectionId":"1735723","StreamId":"511241007191140157"] encoding headers via codec (end_stream=true):
':status', '404'
'date', 'Wed, 29 Nov 2023 19:16:17 GMT'
'server', 'istio-envoy'
thread=24
2023-11-29T19:16:18.204775Z debug envoy http external/envoy/source/common/http/conn_manager_impl.cc:237 [Tags: "ConnectionId":"1735723","StreamId":"511241007191140157"] doEndStream() resetting stream thread=24
2023-11-29T19:16:18.204783Z debug envoy http external/envoy/source/common/http/conn_manager_impl.cc:1888 [Tags: "ConnectionId":"1735723","StreamId":"511241007191140157"] stream reset: reset reason: local reset, response details: - thread=24
2023-11-29T19:16:18.204851Z debug envoy http2 external/envoy/source/common/http/http2/codec_impl.cc:1225 [Tags: "ConnectionId":"1735723"] sent reset code=0 thread=24
2023-11-29T19:16:18.204881Z debug envoy http2 external/envoy/source/common/http/http2/codec_impl.cc:1350 [Tags: "ConnectionId":"1735723"] stream 1 closed: 0 thread=24
Istio logs for a successful request
2023-11-29T18:01:12.409335Z debug envoy filter external/envoy/source/extensions/filters/listener/tls_inspector/tls_inspector.cc:137 tls:onServerName(), requestedServerName: cip.REDACTED.kyma.ondemand.com thread=23
2023-11-29T18:01:12.446095Z debug envoy http2 external/envoy/source/common/http/http2/codec_impl.cc:1605 [Tags: "ConnectionId":"1733026"] updating connection-level initial window size to 268435456 thread=23
2023-11-29T18:01:12.446162Z debug envoy http external/envoy/source/common/http/conn_manager_impl.cc:378 [Tags: "ConnectionId":"1733026"] new stream thread=23
2023-11-29T18:01:12.446285Z debug envoy http external/envoy/source/common/http/conn_manager_impl.cc:1165 [Tags: "ConnectionId":"1733026","StreamId":"16013734393669961989"] request headers complete (end_stream=false):
':method', 'POST'
':path', '/api/SvcRequest/ProcessServiceRequest'
':scheme', 'https'
':authority', 'cip.REDACTED.kyma.ondemand.com'
'content-type', 'application/xml'
'user-agent', 'SeanInsomnia/8.3.0'
'authorization', 'Bearer REDACTED'
'accept', '*/*'
'content-length', '1816'
thread=23
2023-11-29T18:01:12.446330Z debug envoy connection external/envoy/source/common/network/connection_impl.h:98 [C1733026] current connecting state: false thread=23
2023-11-29T18:01:12.446407Z debug envoy filter source/extensions/filters/http/alpn/alpn_filter.cc:92 override with 3 ALPNs thread=23
2023-11-29T18:01:12.446467Z debug envoy router external/envoy/source/common/router/router.cc:478 [Tags: "ConnectionId":"1733026","StreamId":"16013734393669961989"] cluster 'outbound|80||cip.sct-products.svc.cluster.local' match for URL '/api/SvcRequest/ProcessServiceRequest' thread=23
2023-11-29T18:01:12.446569Z debug envoy router external/envoy/source/common/router/router.cc:690 [Tags: "ConnectionId":"1733026","StreamId":"16013734393669961989"] router decoding headers:
':method', 'POST'
':path', '/api/SvcRequest/ProcessServiceRequest'
':scheme', 'https'
':authority', 'cip.REDACTED.kyma.ondemand.com'
'content-type', 'application/xml'
'user-agent', 'SeanInsomnia/8.3.0'
'authorization', 'Bearer REDACTED'
'accept', '*/*'
'content-length', '1816'
'x-forwarded-for', '10.250.0.4'
'x-forwarded-proto', 'https'
'x-envoy-internal', 'true'
'x-request-id', '144dda5d-3b6e-4d6c-8950-fd617f61f188'
'x-envoy-peer-metadata-id', 'router~100.64.0.49~istio-ingressgateway-5b96c5b95f-5vxdj.istio-system~istio-system.svc.cluster.local'
'x-envoy-peer-metadata', 'ChoKCkNMVVNURVJfSUQSDBoKS3ViZXJuZXRlcwodCgxJTlNUQU5DRV9JUFMSDRoLMTAwLjY0LjAuNDkKGQoNSVNUSU9fVkVSU0lPThIIGgYxLjE5LjMKzwMKBkxBQkVMUxLEAyrBAwodCgNhcHASFhoUaXN0aW8taW5ncmVzc2dhdGV3YXkKEwoFY2hhcnQSChoIZ2F0ZXdheXMKFAoIaGVyaXRhZ2USCBoGVGlsbGVyCjYKKWluc3RhbGwub3BlcmF0b3IuaXN0aW8uaW8vb3duaW5nLXJlc291cmNlEgkaB3Vua25vd24KGQoFaXN0aW8SEBoOaW5ncmVzc2dhdGV3YXkKGQoMaXN0aW8uaW8vcmV2EgkaB2RlZmF1bHQKMAobb3BlcmF0b3IuaXN0aW8uaW8vY29tcG9uZW50EhEaD0luZ3Jlc3NHYXRld2F5cwoxCiRwb2RzLndhcmRlbi5reW1hLXByb2plY3QuaW8vdmFsaWRhdGUSCRoHc3VjY2VzcwoSCgdyZWxlYXNlEgcaBWlzdGlvCjkKH3NlcnZpY2UuaXN0aW8uaW8vY2Fub25pY2FsLW5hbWUSFhoUaXN0aW8taW5ncmVzc2dhdGV3YXkKLwojc2VydmljZS5pc3Rpby5pby9jYW5vbmljYWwtcmV2aXNpb24SCBoGbGF0ZXN0CiIKF3NpZGVjYXIuaXN0aW8uaW8vaW5qZWN0EgcaBWZhbHNlChoKB01FU0hfSUQSDxoNY2x1c3Rlci5sb2NhbAovCgROQU1FEicaJWlzdGlvLWluZ3Jlc3NnYXRld2F5LTViOTZjNWI5NWYtNXZ4ZGoKGwoJTkFNRVNQQUNFEg4aDGlzdGlvLXN5c3RlbQpdCgVPV05FUhJUGlJrdWJlcm5ldGVzOi8vYXBpcy9hcHBzL3YxL25hbWVzcGFjZXMvaXN0aW8tc3lzdGVtL2RlcGxveW1lbnRzL2lzdGlvLWluZ3Jlc3NnYXRld2F5CqQFChFQTEFURk9STV9NRVRBREFUQRKOBSqLBQomCgphenVyZV9OYW1lEhgaFnNob290LS1reW1hLS1jLTM1OTY0YzMKOQoyYXp1cmVfa3ViZXJuZXRlcy5pby1jbHVzdGVyLXNob290LS1reW1hLS1jLTM1OTY0YzMSAxoBMQokCh1henVyZV9rdWJlcm5ldGVzLmlvLXJvbGUtbm9kZRIDGgExCiMKGGF6dXJlX2t1YmVybmV0ZXMuaW9fYXJjaBIHGgVhbWQ2NAoaCg5henVyZV9sb2NhdGlvbhIIGgZlYXN0dXMKQgoKYXp1cmVfbmFtZRI0GjJzaG9vdC0ta3ltYS0tYy0zNTk2NGMzLWNwdS13b3JrZXItMC16My01YzRkZC1nZzc0cwpACjZhenVyZV9uZXR3b3JraW5nLmdhcmRlbmVyLmNsb3VkX25vZGUtbG9jYWwtZG5zLWVuYWJsZWQSBhoEdHJ1ZQonCh1henVyZV9ub2RlLmt1YmVybmV0ZXMuaW9fcm9sZRIGGgRub2RlCjQKCmF6dXJlX3ZtSWQSJhokZWZkZWVhN2UtODhhOC00OTA5LTlkYjItYjM5MzE5OWI1OWZmCjcKJWF6dXJlX3dvcmtlci5nYXJkZW4uc2FwY2xvdWQuaW9fZ3JvdXASDhoMY3B1LXdvcmtlci0wCjQKJGF6dXJlX3dvcmtlci5nYXJkZW5lci5jbG91ZF9jcmktbmFtZRIMGgpjb250YWluZXJkCjIKIGF6dXJlX3dvcmtlci5nYXJkZW5lci5jbG91ZF9wb29sEg4aDGNwdS13b3JrZXItMAo3Ci1henVyZV93b3JrZXIuZ2FyZGVuZXIuY2xvdWRfc3lzdGVtLWNvbXBvbmVudHMSBhoEdHJ1ZQonCg1XT1JLTE9BRF9OQU1FEhYaFGlzdGlvLWluZ3Jlc3NnYXRld2F5'
'x-envoy-expected-rq-timeout-ms', '180000'
'x-envoy-attempt-count', '1'
'x-forwarded-host', 'cip.REDACTED.kyma.ondemand.com'
thread=23
2023-11-29T18:01:12.447195Z debug envoy http external/envoy/source/common/http/conn_manager_impl.cc:1148 [Tags: "ConnectionId":"1733026","StreamId":"16013734393669961989"] request end stream thread=23
2023-11-29T18:01:12.451942Z debug envoy router external/envoy/source/common/router/upstream_request.cc:562 [Tags: "ConnectionId":"1733026","StreamId":"16013734393669961989"] pool ready thread=23
2023-11-29T18:01:19.821992Z debug envoy router external/envoy/source/common/router/router.cc:1437 [Tags: "ConnectionId":"1733026","StreamId":"16013734393669961989"] upstream headers complete: end_stream=false thread=23
2023-11-29T18:01:19.822329Z debug envoy http external/envoy/source/common/http/conn_manager_impl.cc:1819 [Tags: "ConnectionId":"1733026","StreamId":"16013734393669961989"] encoding headers via codec (end_stream=false):
':status', '200'
'content-type', 'application/xml'
'date', 'Wed, 29 Nov 2023 18:01:18 GMT'
'server', 'istio-envoy'
'x-envoy-upstream-service-time', '7375'
thread=23
2023-11-29T18:01:19.823102Z debug envoy http external/envoy/source/common/http/conn_manager_impl.cc:1924 [Tags: "ConnectionId":"1733026","StreamId":"16013734393669961989"] Codec completed encoding stream. thread=23
2023-11-29T18:01:19.823154Z debug envoy http2 external/envoy/source/common/http/http2/codec_impl.cc:1350 [Tags: "ConnectionId":"1733026"] stream 1 closed: 0 thread=23
2023-11-29T18:01:19.823191Z debug envoy http2 external/envoy/source/common/http/http2/codec_impl.cc:1414 [Tags: "ConnectionId":"1733026"] Recouping 0 bytes of flow control window for stream 1. thread=23
As far as I can tell, the difference seems to be that when these failing requests are made, and the authority header is formatted in that way, the alpn_filter in istio can’t find the routes, and therefore there’s a 404. I’m not sure if that’s because
- The header itself is badly formed and shouldn’t be in that format
- The header is fine but there is some kind of matching on host that is too strict and needs to be relaxed
- Something else is going on that I’m missing.
Troubleshooting So far
- Many many successful and failed requests to try to reproduce the pattern
- I’ve enabled more verbose logs (let me know if others would be helpful!)
--level "http:debug,http2:debug,admin:debug,client:debug,connection:debug,envoy_bug:debug,filter:debug,main:debug,multi_connection:debug,quic_stream:debug,router:debug,upstream:debug" - Installed Kiali to check things out visually, look at some config validation, etc. – no issues found.
Version
istioctl:
client version: 1.20.0
control plane version: 1.19.3
data plane version: 1.19.3 (20 proxies)
kubectl:
Client Version: v1.28.2
Server Version: v1.26.9
Additional Information
GitHub tells me my entry is too long, so I’ll paste it in a separate comment.
About this issue
- Original URL
- State: closed
- Created 7 months ago
- Comments: 17 (7 by maintainers)
@SeanKilleen thanks!