Envoy Proxy Knowledge Patch
Use this skill when writing, reviewing, upgrading, or debugging Envoy bootstrap,
xDS resources, listeners, clusters, routes, filters, protocol proxies, or native
extensions. Start with the project manifest, image tag, build configuration, and
runtime values; then apply only guidance relevant to the deployed version.
Reference index
| Reference |
Topics |
| Upgrade and compatibility |
Removed guards and extensions, changed defaults, source builds, validation and SDK migrations |
| HTTP, routing, and filters |
HTTP behavior, ext-proc, route matching and mutation, rate limits, compression and responses |
| Security, authentication, and TLS |
TLS and certificates, OAuth2, ext-authz, RBAC, JWT, API keys and cloud credentials |
| Discovery, DNS, and load balancing |
xDS, DNS, dynamic forward proxy, clusters, endpoints, load balancing and retries |
| Networking and protocol proxies |
Listeners, sockets, TCP, UDP, QUIC, PROXY protocol, Redis, PostgreSQL, MySQL and tunnels |
| Observability and operations |
Access logs, tracing, metrics, tap, overload management and admin diagnostics |
| Extensions and programmability |
Dynamic modules, Wasm, Lua, CEL, filter state, composite filters and extension APIs |
| Data and protocol-aware filters |
MCP, gRPC/JSON, Proto Scrubber, Thrift, GeoIP, metadata, SSE and file serving |
Upgrade triage
Before changing configuration, identify the exact Envoy binary and whether it is
a standard, contrib, mobile, FIPS, OpenSSL, or custom extension build. Runtime
guards are temporary migration tools: verify that a named guard still exists in
the target binary before relying on it.
Check these high-impact behaviors first:
- Configure
internal_address_config; RFC1918 space is not implicitly internal,
and the old rollback guard has been removed.
- Treat RSA certificate
keyUsage enforcement as mandatory. The
enforce_rsa_key_usage setting is deprecated and ignored.
- Expect TLS Inspector to accept only ClientHello versions from TLS 1.0 through
TLS 1.3 unless its temporary rollback guard is deliberately disabled.
- Expect HTTP Inspector to use Balsa, and expect
HeaderMatcher to evaluate
separately encoded header values individually.
- Budget for the safer HTTP/2 defaults: 1,024 concurrent streams, a 16 MiB
initial stream window, and a 24 MiB initial connection window.
- Account for reassembled HTTP/2 cookies in request-header limits and configure
the optional cookie-size and reset-rate controls where needed.
- Expect JSON nesting to stop at 1,000 levels and overlong combined
PROXY-protocol TLVs to be removed.
- Expect upstream transport failure details to remain available to logging but
not to be disclosed in HTTP response bodies.
- Expect
tap_enabled runtime fractions to be enforced by HTTP and transport
tap before their match predicates.
- Review the upgrade reference for removed runtime guards before carrying an
old emergency rollback into a new deployment.
TLS and authentication quick reference
For certificate and identity changes:
- Upstream and downstream TLS can fetch certificates on demand through SDS.
Active health checks wait for required upstream TLS secrets while warming.
- Empty trusted-CA sources are rejected. SPIFFE trust bundles take precedence
over
trust_domains, and watched directories support atomic replacement.
- Brotli certificate compression is disabled by default: QUIC uses zlib only,
while TCP TLS uses no certificate compression unless the guard is enabled.
- Use
connection.peer_certificate_valid to distinguish a validated peer from
an untrusted certificate accepted by optional mTLS.
- Use
%UPSTREAM_SERVER_NAME%, %DOWNSTREAM_TLS_GROUP%, and
%UPSTREAM_TLS_GROUP% when SNI and negotiated-group diagnostics are needed.
suppress_client_ca_list hides trusted CA names in CertificateRequest
without changing certificate validation.
For OAuth2 deployments, treat cookie changes as migrations:
- Token cookies are encrypted unless
disable_token_encryption is explicitly
set for a trusted environment.
- Migrate the CVE-2026-47775 cookie format by enabling AES-256-GCM everywhere,
waiting until all instances read
gcm. cookies and
oauth_legacy_cbc_decrypt reaches zero, then disabling CBC compatibility.
- Do not reverse those two steps: older instances cannot read newly issued GCM
cookies, while indefinite CBC fallback preserves the vulnerable path.
TLS_CLIENT_AUTH requires mTLS on the token-endpoint cluster and does not use
token_secret; PRIVATE_KEY_JWT uses the PEM key in token_secret.
- Constrain formatter-derived redirects with
allowed_redirect_domains.
forward_id_token strips the chosen incoming custom header before inserting
the validated token, preventing client spoofing.
For policy composition:
- Basic Auth with
allow_missing: true passes requests lacking credentials for
OR-composition, but still rejects invalid credentials.
emit_dynamic_metadata: true publishes the authenticated Basic username at
envoy.filters.http.basic_auth for RBAC and later filters.
- Upstream RBAC runs after host selection but before connection, enabling
default-deny policy over
upstream_ip_port for SSRF defense.
- Dynamic forward proxy can filter resolved addresses by CIDR with
resolved_address_filter before connecting.
- Extract-only JWT mode can set
verification_status_header to false only
when an extracted token fails signature verification; valid and absent tokens
leave the header unset.
HTTP and routing quick reference
- Route and redirect host/path rewrites accept substitution formatting; mixed
literal and variable URI-template segments are supported.
HeaderMatcher consumers see repeated encoded values individually, while CEL
and generic matcher header inputs still see comma-joined values.
- Route-level request-body buffer limits take effect as soon as the route
matches. Async retries are skipped when their retry buffer limit is exceeded.
refresh_cluster_on_retry can refresh a dynamically selected route cluster
for each attempt, including weighted-cluster routes.
- A local-rate-limit bucket with
max_tokens: 0 rejects every matching request
without requiring a fill interval.
- Retry-budget
budget_interval counts recent new requests in the budget; its
0ms default retains the old calculation.
- The bandwidth-share filter divides request and response bandwidth among
weighted tenants and supports filter-chain and per-route limits.
- The HTTP filter-chain filter hosts named subchains in one main-chain slot and
permits per-route selection.
- Custom-response matching can inspect request properties as well as response
status and headers, and redirect paths can use formatter or CEL output.
For external processing:
- If ext-proc cannot create its gRPC client, it reports
INTERNAL and follows
failure_mode_allow; the same policy governs spurious responses.
- Multiple ext-proc filters can coexist when state-update data injection is
enabled, and
allow_content_length_header controls preservation or mutation
of the original length.
- Network external processing can close its side stream early with
close_stream_to_ext_proc_server, letting later traffic bypass the filter.
- Use the HTTP reference for processing-mode overrides, streamed body modes,
local replies, error statuses, request modifiers, metadata and logging effects.
Discovery and traffic selection quick reference
- The merged strict/logical DNS-cluster implementation is enabled by default;
use its rollback guard only as a temporary migration aid.
- Identical c-ares configurations share a resolver.
qcache_max_ttl caps cached
entries, while 0 keeps qcache disabled.
DnsCluster.dns_min_refresh_rate floors refresh intervals derived from short
TTLs, and dynamic-forward-proxy subclusters can use explicit DNS-cluster
settings through sub_clusters_config.dns_cluster_config.
- EDS hostname-only changes recreate the host and drain its connection pools so
settings such as
auto_host_sni observe the new value.
- Static-route VHDS now sends subscriptions and supports on-demand operation.
- Removing an RTDS override restores a process-wide guard to its underlying
value rather than leaving the override behind.
- Client-side weighted round robin can consume out-of-band ORCA
StreamCoreMetrics, including through a sidecar selected by transport-socket
match criteria.
Endpoint.observability_name disambiguates endpoint statistics when multiple
endpoints share an address.
Extension quick reference
Dynamic modules now cover HTTP, network, listener, UDP listener, bootstrap,
access logging, load balancing, clusters, transport sockets, certificate
validation, health checking, tracing, matching, formatters and stats sinks.
- Local modules can load from an absolute
.so path; remote modules require a
SHA-256 digest and cache by digest.
- A remote module fetch normally fails open by omitting the filter;
nack_on_cache_miss rejects an uncached configuration while fetching in the
background.
- The extended ABI supports an SDK-built module across the next Envoy release,
but extension callback signatures still require source-level migration when
noted in the extension reference.
metrics_namespace controls the Prometheus prefix. Configuration-load failure
counters remain available even when a listener update is rejected.
- Worker slots and events let a module publish opaque main-thread state to every
worker, and registered factories allow typed filter-state exchange.
- The Rust SDK
CatchUnwind wrapper can convert callback panics into fail-closed
request, stream, or connection errors instead of aborting the process.
For Wasm, do not depend on listener metadata to isolate otherwise identical
downstream plugin configurations. Use distinct plugin names, root IDs, or VM IDs.
Upstream HTTP Wasm metrics use server-wide root scope by default, and changing
only VM environment variables now recreates the VM.
Operations quick reference
/peak_heap_dump exposes the TCMalloc peak profile, while /memory/tcmalloc
exposes allocator diagnostics.
--log-stacktrace-single-entry preserves a stack trace as one event, and %N
inserts the Envoy version into spdlog patterns.
- The fixed-heap monitor can take its maximum from
max_heap_size_bytes_runtime, so RTDS or /runtime_modify can adjust it.
enable_worker_cpu_affinity pins Linux workers; with reuse-port,
cpu_locality_balance can steer accepts to the worker on the receiving CPU.
- io_uring writes now apply backpressure at 128 KiB and resume at 16 KiB by
default; explicit high and low watermarks can override those values.
WatchedDirectory.watch_modify: true also reacts to in-place IN_MODIFY
writes, including direct certificate-file rotation; rename-only watching
remains the default.
Review checklist
When producing or reviewing a change:
- Confirm the deployed binary variant and exact version.
- Search the upgrade reference for every runtime guard, deprecated field, and
removed extension used by the existing configuration.
- Inspect defaults that affect protocol limits, security checks, sampling,
retries, timeouts, buffers, cookies and connection draining.
- Validate bootstrap and dynamic resources with the target binary; validation
mode now instantiates bootstrap extensions needed by dependent configuration.
- Confirm that formatter names, filter-state keys, metadata namespaces, and
per-route overrides match their current consumers.
- Exercise failure paths: xDS removal, DNS failure, certificate absence,
ext-proc startup failure, auth denial, overload pressure and retry exhaustion.
- Verify observability after rollout, especially counters whose attribution or
scope changed and sampling controls that are now enforced.
1---2name: envoy-knowledge-patch3description: Envoy Proxy4license: MIT5---678# Envoy Proxy Knowledge Patch910Use this skill when writing, reviewing, upgrading, or debugging Envoy bootstrap,11xDS resources, listeners, clusters, routes, filters, protocol proxies, or native12extensions. Start with the project manifest, image tag, build configuration, and13runtime values; then apply only guidance relevant to the deployed version.1415## Reference index1617| Reference | Topics |18| --- | --- |19| [Upgrade and compatibility](references/upgrade-and-compatibility.md) | Removed guards and extensions, changed defaults, source builds, validation and SDK migrations |20| [HTTP, routing, and filters](references/http-routing-and-filters.md) | HTTP behavior, ext-proc, route matching and mutation, rate limits, compression and responses |21| [Security, authentication, and TLS](references/security-auth-and-tls.md) | TLS and certificates, OAuth2, ext-authz, RBAC, JWT, API keys and cloud credentials |22| [Discovery, DNS, and load balancing](references/discovery-dns-and-load-balancing.md) | xDS, DNS, dynamic forward proxy, clusters, endpoints, load balancing and retries |23| [Networking and protocol proxies](references/networking-and-proxies.md) | Listeners, sockets, TCP, UDP, QUIC, PROXY protocol, Redis, PostgreSQL, MySQL and tunnels |24| [Observability and operations](references/observability-and-operations.md) | Access logs, tracing, metrics, tap, overload management and admin diagnostics |25| [Extensions and programmability](references/extensions-and-programmability.md) | Dynamic modules, Wasm, Lua, CEL, filter state, composite filters and extension APIs |26| [Data and protocol-aware filters](references/data-and-protocol-filters.md) | MCP, gRPC/JSON, Proto Scrubber, Thrift, GeoIP, metadata, SSE and file serving |2728## Upgrade triage2930Before changing configuration, identify the exact Envoy binary and whether it is31a standard, contrib, mobile, FIPS, OpenSSL, or custom extension build. Runtime32guards are temporary migration tools: verify that a named guard still exists in33the target binary before relying on it.3435Check these high-impact behaviors first:3637- Configure `internal_address_config`; RFC1918 space is not implicitly internal,38 and the old rollback guard has been removed.39- Treat RSA certificate `keyUsage` enforcement as mandatory. The40 `enforce_rsa_key_usage` setting is deprecated and ignored.41- Expect TLS Inspector to accept only ClientHello versions from TLS 1.0 through42 TLS 1.3 unless its temporary rollback guard is deliberately disabled.43- Expect HTTP Inspector to use Balsa, and expect `HeaderMatcher` to evaluate44 separately encoded header values individually.45- Budget for the safer HTTP/2 defaults: 1,024 concurrent streams, a 16 MiB46 initial stream window, and a 24 MiB initial connection window.47- Account for reassembled HTTP/2 cookies in request-header limits and configure48 the optional cookie-size and reset-rate controls where needed.49- Expect JSON nesting to stop at 1,000 levels and overlong combined50 PROXY-protocol TLVs to be removed.51- Expect upstream transport failure details to remain available to logging but52 not to be disclosed in HTTP response bodies.53- Expect `tap_enabled` runtime fractions to be enforced by HTTP and transport54 tap before their match predicates.55- Review the upgrade reference for removed runtime guards before carrying an56 old emergency rollback into a new deployment.5758## TLS and authentication quick reference5960For certificate and identity changes:6162- Upstream and downstream TLS can fetch certificates on demand through SDS.63 Active health checks wait for required upstream TLS secrets while warming.64- Empty trusted-CA sources are rejected. SPIFFE trust bundles take precedence65 over `trust_domains`, and watched directories support atomic replacement.66- Brotli certificate compression is disabled by default: QUIC uses zlib only,67 while TCP TLS uses no certificate compression unless the guard is enabled.68- Use `connection.peer_certificate_valid` to distinguish a validated peer from69 an untrusted certificate accepted by optional mTLS.70- Use `%UPSTREAM_SERVER_NAME%`, `%DOWNSTREAM_TLS_GROUP%`, and71 `%UPSTREAM_TLS_GROUP%` when SNI and negotiated-group diagnostics are needed.72- `suppress_client_ca_list` hides trusted CA names in `CertificateRequest`73 without changing certificate validation.7475For OAuth2 deployments, treat cookie changes as migrations:7677- Token cookies are encrypted unless `disable_token_encryption` is explicitly78 set for a trusted environment.79- Migrate the CVE-2026-47775 cookie format by enabling AES-256-GCM everywhere,80 waiting until all instances read `gcm.` cookies and81 `oauth_legacy_cbc_decrypt` reaches zero, then disabling CBC compatibility.82- Do not reverse those two steps: older instances cannot read newly issued GCM83 cookies, while indefinite CBC fallback preserves the vulnerable path.84- `TLS_CLIENT_AUTH` requires mTLS on the token-endpoint cluster and does not use85 `token_secret`; `PRIVATE_KEY_JWT` uses the PEM key in `token_secret`.86- Constrain formatter-derived redirects with `allowed_redirect_domains`.87- `forward_id_token` strips the chosen incoming custom header before inserting88 the validated token, preventing client spoofing.8990For policy composition:9192- Basic Auth with `allow_missing: true` passes requests lacking credentials for93 OR-composition, but still rejects invalid credentials.94- `emit_dynamic_metadata: true` publishes the authenticated Basic username at95 `envoy.filters.http.basic_auth` for RBAC and later filters.96- Upstream RBAC runs after host selection but before connection, enabling97 default-deny policy over `upstream_ip_port` for SSRF defense.98- Dynamic forward proxy can filter resolved addresses by CIDR with99 `resolved_address_filter` before connecting.100- Extract-only JWT mode can set `verification_status_header` to `false` only101 when an extracted token fails signature verification; valid and absent tokens102 leave the header unset.103104## HTTP and routing quick reference105106- Route and redirect host/path rewrites accept substitution formatting; mixed107 literal and variable URI-template segments are supported.108- `HeaderMatcher` consumers see repeated encoded values individually, while CEL109 and generic matcher header inputs still see comma-joined values.110- Route-level request-body buffer limits take effect as soon as the route111 matches. Async retries are skipped when their retry buffer limit is exceeded.112- `refresh_cluster_on_retry` can refresh a dynamically selected route cluster113 for each attempt, including weighted-cluster routes.114- A local-rate-limit bucket with `max_tokens: 0` rejects every matching request115 without requiring a fill interval.116- Retry-budget `budget_interval` counts recent new requests in the budget; its117 `0ms` default retains the old calculation.118- The bandwidth-share filter divides request and response bandwidth among119 weighted tenants and supports filter-chain and per-route limits.120- The HTTP filter-chain filter hosts named subchains in one main-chain slot and121 permits per-route selection.122- Custom-response matching can inspect request properties as well as response123 status and headers, and redirect paths can use formatter or CEL output.124125For external processing:126127- If ext-proc cannot create its gRPC client, it reports `INTERNAL` and follows128 `failure_mode_allow`; the same policy governs spurious responses.129- Multiple ext-proc filters can coexist when state-update data injection is130 enabled, and `allow_content_length_header` controls preservation or mutation131 of the original length.132- Network external processing can close its side stream early with133 `close_stream_to_ext_proc_server`, letting later traffic bypass the filter.134- Use the HTTP reference for processing-mode overrides, streamed body modes,135 local replies, error statuses, request modifiers, metadata and logging effects.136137## Discovery and traffic selection quick reference138139- The merged strict/logical DNS-cluster implementation is enabled by default;140 use its rollback guard only as a temporary migration aid.141- Identical c-ares configurations share a resolver. `qcache_max_ttl` caps cached142 entries, while `0` keeps qcache disabled.143- `DnsCluster.dns_min_refresh_rate` floors refresh intervals derived from short144 TTLs, and dynamic-forward-proxy subclusters can use explicit DNS-cluster145 settings through `sub_clusters_config.dns_cluster_config`.146- EDS hostname-only changes recreate the host and drain its connection pools so147 settings such as `auto_host_sni` observe the new value.148- Static-route VHDS now sends subscriptions and supports on-demand operation.149- Removing an RTDS override restores a process-wide guard to its underlying150 value rather than leaving the override behind.151- Client-side weighted round robin can consume out-of-band ORCA152 `StreamCoreMetrics`, including through a sidecar selected by transport-socket153 match criteria.154- `Endpoint.observability_name` disambiguates endpoint statistics when multiple155 endpoints share an address.156157## Extension quick reference158159Dynamic modules now cover HTTP, network, listener, UDP listener, bootstrap,160access logging, load balancing, clusters, transport sockets, certificate161validation, health checking, tracing, matching, formatters and stats sinks.162163- Local modules can load from an absolute `.so` path; remote modules require a164 SHA-256 digest and cache by digest.165- A remote module fetch normally fails open by omitting the filter;166 `nack_on_cache_miss` rejects an uncached configuration while fetching in the167 background.168- The extended ABI supports an SDK-built module across the next Envoy release,169 but extension callback signatures still require source-level migration when170 noted in the extension reference.171- `metrics_namespace` controls the Prometheus prefix. Configuration-load failure172 counters remain available even when a listener update is rejected.173- Worker slots and events let a module publish opaque main-thread state to every174 worker, and registered factories allow typed filter-state exchange.175- The Rust SDK `CatchUnwind` wrapper can convert callback panics into fail-closed176 request, stream, or connection errors instead of aborting the process.177178For Wasm, do not depend on listener metadata to isolate otherwise identical179downstream plugin configurations. Use distinct plugin names, root IDs, or VM IDs.180Upstream HTTP Wasm metrics use server-wide root scope by default, and changing181only VM environment variables now recreates the VM.182183## Operations quick reference184185- `/peak_heap_dump` exposes the TCMalloc peak profile, while `/memory/tcmalloc`186 exposes allocator diagnostics.187- `--log-stacktrace-single-entry` preserves a stack trace as one event, and `%N`188 inserts the Envoy version into spdlog patterns.189- The fixed-heap monitor can take its maximum from190 `max_heap_size_bytes_runtime`, so RTDS or `/runtime_modify` can adjust it.191- `enable_worker_cpu_affinity` pins Linux workers; with reuse-port,192 `cpu_locality_balance` can steer accepts to the worker on the receiving CPU.193- io_uring writes now apply backpressure at 128 KiB and resume at 16 KiB by194 default; explicit high and low watermarks can override those values.195- `WatchedDirectory.watch_modify: true` also reacts to in-place `IN_MODIFY`196 writes, including direct certificate-file rotation; rename-only watching197 remains the default.198199## Review checklist200201When producing or reviewing a change:2022031. Confirm the deployed binary variant and exact version.2042. Search the upgrade reference for every runtime guard, deprecated field, and205 removed extension used by the existing configuration.2063. Inspect defaults that affect protocol limits, security checks, sampling,207 retries, timeouts, buffers, cookies and connection draining.2084. Validate bootstrap and dynamic resources with the target binary; validation209 mode now instantiates bootstrap extensions needed by dependent configuration.2105. Confirm that formatter names, filter-state keys, metadata namespaces, and211 per-route overrides match their current consumers.2126. Exercise failure paths: xDS removal, DNS failure, certificate absence,213 ext-proc startup failure, auth denial, overload pressure and retry exhaustion.2147. Verify observability after rollout, especially counters whose attribution or215 scope changed and sampling controls that are now enforced.