--- title: Envoy Filter description: Customizing Envoy configuration generated by Istio. location: https://istio.io/docs/reference/config/networking/envoy-filter.html layout: protoc-gen-docs generator: protoc-gen-docs schema: istio.networking.v1alpha3.EnvoyFilter aliases: [/docs/reference/config/networking/v1alpha3/envoy-filter] number_of_entries: 18 ---

## EnvoyFilter

EnvoyFilter provides a mechanism to customize the Envoy configuration generated by Istio Pilot.

Field | Type | Description | Required
--- | --- | --- | ---
`workloadSelector` | `WorkloadSelector` | Criteria used to select the specific set of pods/VMs on which this patch configuration should be applied. If omitted, the set of patches in this configuration will be applied to all workload instances in the same namespace. If omitted, the `EnvoyFilter` patches will be applied to all workloads in the same namespace. If the `EnvoyFilter` is present in the config root namespace, it will be applied to all applicable workloads in any namespace. | No
`configPatches` | `EnvoyConfigObjectPatch[]` | One or more patches with match conditions. | Yes

## EnvoyFilter.ProxyMatch

One or more properties of the proxy to match on.

Field | Type | Description | Required
--- | --- | --- | ---
`proxyVersion` | `string` | A regular expression in golang regex format (RE2) that can be used to select proxies using a specific version of istio proxy. The Istio version for a given proxy is obtained from the node metadata field `ISTIO_VERSION` supplied by the proxy when connecting to Pilot. This value is embedded as an environment variable (`ISTIO_META_ISTIO_VERSION`) in the Istio proxy docker image. Custom proxy implementations should provide this metadata variable to take advantage of the Istio version check option. | No
`metadata` | `map<string, string>` | Match on the node metadata supplied by a proxy when connecting to Istio Pilot. Note that while Envoy’s node metadata is of type Struct, only string key-value pairs are processed by Pilot. All keys specified in the metadata must match with exact values. The match will fail if any of the specified keys are absent or the values fail to match. | No

## EnvoyFilter.ClusterMatch

Conditions specified in `ClusterMatch` must be met for the patch to be applied to a cluster.

Field | Type | Description | Required
--- | --- | --- | ---
`portNumber` | `uint32` | The service port for which this cluster was generated. If omitted, applies to clusters for any port. | No
`service` | `string` | The fully qualified service name for this cluster. If omitted, applies to clusters for any service. For services defined through service entries, the service name is same as the hosts defined in the service entry. | No
`subset` | `string` | The subset associated with the service. If omitted, applies to clusters for any subset of a service. | No
`name` | `string` | The exact name of the cluster to match. To match a specific cluster by name, such as the internally generated `Passthrough` cluster, leave all fields in clusterMatch empty, except the name. | No

## EnvoyFilter.RouteConfigurationMatch

Conditions specified in RouteConfigurationMatch must be met for the patch to be applied to a route configuration object or a specific virtual host within the route configuration.

Field | Type | Description | Required
--- | --- | --- | ---
`portNumber` | `uint32` | The service port number or gateway server port number for which this route configuration was generated. If omitted, applies to route configurations for all ports. | No
`portName` | `string` | Applicable only for GATEWAY context. The gateway server port name for which this route configuration was generated. | No
`gateway` | `string` | The Istio gateway config’s namespace/name for which this route configuration was generated. Applies only if the context is GATEWAY. Should be in the namespace/name format. Use this field in conjunction with the `portNumber` and `portName` to accurately select the Envoy route configuration for a specific HTTPS server within a gateway config object. | No
`vhost` | `VirtualHostMatch` | Match a specific virtual host in a route configuration and apply the patch to the virtual host. | No
`name` | `string` | Route configuration name to match on. Can be used to match a specific route configuration by name, such as the internally generated `http_proxy` route configuration for all sidecars. | No

## EnvoyFilter.ListenerMatch

Conditions specified in a listener match must be met for the patch to be applied to a specific listener across all filter chains, or a specific filter chain inside the listener.

Field | Type | Description | Required
--- | --- | --- | ---
`portNumber` | `uint32` | The service port/gateway port to which traffic is being sent/received. If not specified, matches all listeners. Even though inbound listeners are generated for the instance/pod ports, only service ports should be used to match listeners. | No
`filterChain` | `FilterChainMatch` | Match a specific filter chain in a listener. If specified, the patch will be applied to the filter chain (and a specific filter if specified) and not to other filter chains in the listener. | No
`name` | `string` | Match a specific listener by its name. The listeners generated by Pilot are typically named as IP:Port. | No

## EnvoyFilter.Patch

Patch specifies how the selected object should be modified.

Field | Type | Description | Required
--- | --- | --- | ---
`operation` | `Operation` | Determines how the patch should be applied. | No
`value` | `Struct` | The JSON config of the object being patched. This will be merged using proto merge semantics with the existing proto in the path. | No
`filterClass` | `FilterClass` | Determines the filter insertion order. | No

## EnvoyFilter.EnvoyConfigObjectMatch

One or more match conditions to be met before a patch is applied to the generated configuration for a given proxy.

Field | Type | Description | Required
--- | --- | --- | ---
`context` | `PatchContext` | The specific config generation context to match on. Istio Pilot generates envoy configuration in the context of a gateway, inbound traffic to sidecar and outbound traffic from sidecar. | No
`proxy` | `ProxyMatch` | Match on properties associated with a proxy. | No
`listener` | `ListenerMatch (oneof)` | Match on envoy listener attributes. | No
`routeConfiguration` | `RouteConfigurationMatch (oneof)` | Match on envoy HTTP route configuration attributes. | No
`cluster` | `ClusterMatch (oneof)` | Match on envoy cluster attributes. | No

## EnvoyFilter.EnvoyConfigObjectPatch

Changes to be made to various envoy config objects.

Field | Type | Description | Required
--- | --- | --- | ---
`applyTo` | `ApplyTo` | Specifies where in the Envoy configuration, the patch should be applied. The match is expected to select the appropriate object based on applyTo. For example, an applyTo with `HTTP_FILTER` is expected to have a match condition on the listeners, with a network filter selection on `envoy.filters.network.http_connection_manager` and a sub filter selection on the HTTP filter relative to which the insertion should be performed. Similarly, an applyTo on `CLUSTER` should have a match (if provided) on the cluster and not on a listener. | No
`match` | `EnvoyConfigObjectMatch` | Match on listener/route configuration/cluster. | No
`patch` | `Patch` | The patch to apply along with the operation. | No

## EnvoyFilter.RouteConfigurationMatch.RouteMatch

Match a specific route inside a virtual host in a route configuration.

Field | Type | Description | Required
--- | --- | --- | ---
`name` | `string` | The Route objects generated by default are named as default. Route objects generated using a virtual service will carry the name used in the virtual service’s HTTP routes. | No
`action` | `Action` | Match a route with specific action type. | No

## EnvoyFilter.RouteConfigurationMatch.VirtualHostMatch

Match a specific virtual host inside a route configuration.

Field | Type | Description | Required
--- | --- | --- | ---
`name` | `string` | The VirtualHosts objects generated by Istio are named as host:port, where the host typically corresponds to the VirtualService’s host field or the hostname of a service in the registry. | No
`route` | `RouteMatch` | Match a specific route within the virtual host. | No

## EnvoyFilter.ListenerMatch.FilterChainMatch

For listeners with multiple filter chains (e.g., inbound listeners on sidecars with permissive mTLS, gateway listeners with multiple SNI matches), the filter chain match can be used to select a specific filter chain to patch.

Field | Type | Description | Required
--- | --- | --- | ---
`name` | `string` | The name assigned to the filter chain. | No
`sni` | `string` | The SNI value used by a filter chain’s match condition. This condition will evaluate to false if the filter chain has no sni match. | No
`transportProtocol` | `string` | Applies only to `SIDECAR_INBOUND` context. If non-empty, a transport protocol to consider when determining a filter chain match. This value will be compared against the transport protocol of a new connection, when it’s detected by the `tls_inspector` listener filter. Accepted values include: `raw_buffer` - default, used when no transport protocol is detected. `tls` - set when TLS protocol is detected by the TLS inspector. | No
`applicationProtocols` | `string` | Applies only to sidecars. If non-empty, a comma separated set of application protocols to consider when determining a filter chain match. This value will be compared against the application protocols of a new connection, when it’s detected by one of the listener filters such as the `http_inspector`. Accepted values include: h2, http/1.1, http/1.0 | No
`filter` | `FilterMatch` | The name of a specific filter to apply the patch to. Set this to `envoy.filters.network.http_connection_manager` to add a filter or apply a patch to the HTTP connection manager. | No

## EnvoyFilter.ListenerMatch.FilterMatch

Conditions to match a specific filter within a filter chain.

Field | Type | Description | Required
--- | --- | --- | ---
`name` | `string` | The filter name to match on. For standard Envoy filters, canonical filter names should be used. | No
`subFilter` | `SubFilterMatch` | The next level filter within this filter to match upon. Typically used for HTTP Connection Manager filters and Thrift filters. | No

## EnvoyFilter.ListenerMatch.SubFilterMatch

Conditions to match a specific filter within another filter. This field is typically useful to match a HTTP filter inside the `envoy.filters.network.http_connection_manager` network filter. This could also be applicable for thrift filters.

Field | Type | Description | Required
--- | --- | --- | ---
`name` | `string` | The filter name to match on. | No

## EnvoyFilter.RouteConfigurationMatch.RouteMatch.Action

Action refers to the route action taken by Envoy when a http route matches.

Name | Description
--- | ---
`ANY` | All three route actions
`ROUTE` | Route traffic to a cluster / weighted clusters.
`REDIRECT` | Redirect request.
`DIRECT_RESPONSE` | directly respond to a request with specific payload.

## EnvoyFilter.Patch.Operation

Operation denotes how the patch should be applied to the selected configuration.

Name | Description
--- | ---
`INVALID` |
`MERGE` | Merge the provided config with the generated config using proto merge semantics. If you are specifying config in its entirity, use `REPLACE` instead.
`ADD` | Add the provided config to an existing list (of listeners, clusters, virtual hosts, network filters, or http filters). This operation will be ignored when `applyTo` is set to `ROUTE_CONFIGURATION`, or `HTTP_ROUTE`.
`REMOVE` | Remove the selected object from the list (of listeners, clusters, virtual hosts, network filters, routes, or http filters). Does not require a value to be specified. This operation will be ignored when `applyTo` is set to `ROUTE_CONFIGURATION`, or `HTTP_ROUTE`.
`INSERT_BEFORE` | Insert operation on an array of named objects. This operation is typically useful only in the context of filters or routes, where the order of elements matter. Routes should be ordered based on most to least specific matching criteria since the first matching element is selected. For clusters and virtual hosts, order of the element in the array does not matter. Insert before the selected filter or sub filter. If no filter is selected, the specified filter will be inserted at the front of the list.
`INSERT_AFTER` | Insert operation on an array of named objects. This operation is typically useful only in the context of filters or routes, where the order of elements matter. Routes should be ordered based on most to least specific matching criteria since the first matching element is selected. For clusters and virtual hosts, order of the element in the array does not matter. Insert after the selected filter or sub filter. If no filter is selected, the specified filter will be inserted at the end of the list.
`INSERT_FIRST` | Insert operation on an array of named objects. This operation is typically useful only in the context of filters or routes, where the order of elements matter. Routes should be ordered based on most to least specific matching criteria since the first matching element is selected. For clusters and virtual hosts, order of the element in the array does not matter. Insert first in the list based on the presence of selected filter or not. This is specifically useful when you want your filter first in the list based on a match condition specified in Match clause.
`REPLACE` | Replace contents of a named filter with new contents. `REPLACE` operation is only valid for `HTTP_FILTER` and `NETWORK_FILTER`. If the named filter is not found, this operation has no effect.

## EnvoyFilter.Patch.FilterClass

FilterClass determines the filter insertion point in the filter chain relative to the filters implicitly inserted by the control plane. It is used in conjuction with the `ADD` operation. This is the preferred insertion mechanism for adding filters over the `INSERT_*` operations since those operations rely on potentially unstable filter names. Filter ordering is important if your filter depends on or affects the functioning of a another filter in the filter chain. Within a filter class, filters are inserted in the order of processing.

Name | Description
--- | ---
`UNSPECIFIED` | Control plane decides where to insert the filter. Do not specify `FilterClass` if the filter is independent of others.
`AUTHN` | Insert filter after Istio authentication filters.
`AUTHZ` | Insert filter after Istio authorization filters.
`STATS` | Insert filter before Istio stats filters.

## EnvoyFilter.ApplyTo

`ApplyTo` specifies where in the Envoy configuration, the given patch should be applied.

Name | Description
--- | ---
`INVALID` |
`LISTENER` | Applies the patch to the listener.
`FILTER_CHAIN` | Applies the patch to the filter chain.
`NETWORK_FILTER` | Applies the patch to the network filter chain, to modify an existing filter or add a new filter.
`HTTP_FILTER` | Applies the patch to the HTTP filter chain in the http connection manager, to modify an existing filter or add a new filter.
`ROUTE_CONFIGURATION` | Applies the patch to the Route configuration (rds output) inside a HTTP connection manager. This does not apply to the virtual host. Currently, only `MERGE` operation is allowed on the route configuration objects.
`VIRTUAL_HOST` | Applies the patch to a virtual host inside a route configuration.
`HTTP_ROUTE` | Applies the patch to a route object inside the matched virtual host in a route configuration.
`CLUSTER` | Applies the patch to a cluster in a CDS output. Also used to add new clusters.
`EXTENSION_CONFIG` | Applies the patch to or adds an extension config in ECDS output. Note that ECDS is only supported by HTTP filters.

## EnvoyFilter.PatchContext

PatchContext selects a class of configurations based on the traffic flow direction and workload type.

Name | Description
--- | ---
`ANY` | All listeners/routes/clusters in both sidecars and gateways.
`SIDECAR_INBOUND` | Inbound listener/route/cluster in sidecar.
`SIDECAR_OUTBOUND` | Outbound listener/route/cluster in sidecar.
`GATEWAY` | Gateway listener/route/cluster.