LDS API中的Filter Chain配置
LDS API中的Filter Chain配置
Filter Chain
过滤器链包裹着一组匹配判据,一个选项TLS上下文,一组过滤器,以及其他各种参数。
Listener Filter Chain的配置详细定义在 xDS API 中 Linsenter Components 的 proto 定义文件中,地址如下:
Json格式
Listerner Filter Chain配置的JSON格式如下所示:
{
"filter_chain_match": "{...}",
"filters": [],
"use_proxy_proto": "{...}",
"transport_socket": "{...}",
"transport_socket_connect_timeout": "{...}"
}
proto格式
proto 文件定义如下:
message FilterChain {
option (udpa.annotations.versioning).previous_message_type = "envoy.api.v2.listener.FilterChain";
FilterChainMatch filter_chain_match = 1;
repeated Filter filters = 3;
google.protobuf.BoolValue use_proxy_proto = 4
[deprecated = true, (envoy.annotations.deprecated_at_minor_version) = "3.0"];
core.v3.Metadata metadata = 5;
core.v3.TransportSocket transport_socket = 6;
google.protobuf.Duration transport_socket_connect_timeout = 9;
string name = 7;
OnDemandConfiguration on_demand_configuration = 8;
}
字段说明
具体字段的说明:
字段 | 格式 | 说明 |
---|---|---|
filter_chain_match | FilterChainMatch | 匹配连接到该过滤链时使用的判据。 |
filters | Filter | 一个单独的网络过滤器的列表,它构成了与监听器建立的连接的过滤器链。顺序很重要,因为过滤器会随着连接事件的发生按顺序处理。注意:如果过滤器列表为空,连接将默认关闭。 |
use_proxy_proto | google.protobuf.BoolValue | 监听器是否应该在新连接上期待一个PROXY协议V1头。如果该选项被启用,监听器将假定连接的远程地址是头中指定的地址。包括AWS ELB在内的一些负载均衡器支持这个选项。如果该选项不存在或设置为false,Envoy将使用连接的物理对等地址作为远程地址。 这个字段已经废弃了。可以明确地添加PROXY协议监听器过滤器来代替。 |
metadata | core.v3.Metadata | 过滤链元数据 |
transport_socket | core.v3.TransportSocket | 可选的自定义传输套接字实现,用于下游连接。要设置TLS,在typed_config中设置一个名称为envoy.transport_sockets.tls的传输套接字和DownstreamTlsContext。如果没有指定传输套接字的配置,新的连接将用纯文本建立。 |
transport_socket_connect_timeout | google.protobuf.Duration | 如果存在并且不为零,允许传入的连接完成任何传输套接字协商的时间量。如果这个时间在传输报告连接建立之前过期,连接将被立即关闭。 |
FilterChainMatch
指定为 Listener 选择特定过滤链的匹配判据。
为了选择一个过滤链,它的所有判据必须被传入的连接满足,其属性由网络堆栈和/或监听器过滤器设置。
以下顺序适用:
- 目的地端口。
- 目的地IP地址。
- 服务器名称(例如:TLS协议的SNI)。
- 传输协议。
- 应用协议(例如:TLS协议的ALPN)。
- 直接连接的源IP地址(这只有在使用覆盖源地址的监听器过滤器时才会与源IP地址不同,如代理协议监听器过滤器)。
- 源类型(例如,任何,本地或外部网络)。
- 源IP地址。
- 源端口
对于允许范围或通配符的标准,将使用任何配置的过滤链中与传入连接相匹配的最具体的值(例如,对于SNI www.example.com,最具体的匹配将是www.example.com,然后是*.example.com,然后是*.com,然后是任何没有server_names要求的过滤链)。
用另一种方式来推理过滤链的匹配。假设存在N个过滤链。使用上述8个步骤对过滤链集进行修剪。在每个步骤中,与属性最具体匹配的过滤链继续进入下一个步骤。监听器保证在所有的步骤之后最多剩下1个过滤链。
例如:
对于目的端口,指定传入流量的目的端口的过滤链是最具体的匹配。如果没有一个过滤链指定确切的目的端口,那么不指定端口的过滤链是最具体的匹配。指定错误端口的过滤链永远不可能成为最具体的匹配。
Listener Filter Chain Match的配置详细定义在 xDS API 中 Linsenter Components 的 proto 定义文件中,地址如下:
Json格式
Listerner Filter Chain Match配置的JSON格式如下所示:
{
"destination_port": "{...}",
"prefix_ranges": [],
"direct_source_prefix_ranges": [],
"source_type": "...",
"source_prefix_ranges": [],
"source_ports": [],
"server_names": [],
"transport_protocol": "...",
"application_protocols": []
}
proto格式
proto 文件定义如下:
message FilterChainMatch {
option (udpa.annotations.versioning).previous_message_type =
"envoy.api.v2.listener.FilterChainMatch";
google.protobuf.UInt32Value destination_port = 8 [(validate.rules).uint32 = {lte: 65535 gte: 1}];
repeated core.v3.CidrRange prefix_ranges = 3;
string address_suffix = 4;
google.protobuf.UInt32Value suffix_len = 5;
repeated core.v3.CidrRange direct_source_prefix_ranges = 13;
ConnectionSourceType source_type = 12 [(validate.rules).enum = {defined_only: true}];
repeated core.v3.CidrRange source_prefix_ranges = 6;
repeated uint32 source_ports = 7
[(validate.rules).repeated = {items {uint32 {lte: 65535 gte: 1}}}];
repeated string server_names = 11;
string transport_protocol = 9;
repeated string application_protocols = 10;
}
字段说明
具体字段的说明:
字段 | 格式 | 说明 |
---|---|---|
destination_port | google.protobuf.UInt32Value | 当监听器上设置use_original_dst时,在确定过滤链匹配时要考虑的可选目标端口。 |
prefix_ranges | core.v3.CidrRange[] | 如果非空,则是一个IP地址和前缀长度,以便在监听器被绑定到0.0.0.0/::或指定use_original_dst时匹配地址。 |
direct_source_prefix_ranges | core.v3.CidrRange[] | 如果下游连接的直接连接源IP地址包含在至少一个指定的子网中,则满足该条件。如果没有指定参数或者列表为空,直接连接的源IP地址将被忽略。 |
source_type | ConnectionSourceType | 指定连接源IP匹配类型。可以是任何,本地或外部网络。 |
source_prefix_ranges | core.v3.CidrRange[] | 如果下游连接的源IP地址包含在至少一个指定的子网中,则满足该条件。如果没有指定参数或列表为空,则源IP地址被忽略。 |
source_ports | uint32[] | 如果下游连接的源端口包含在至少一个指定的端口中,则满足该条件。如果没有指定该参数,源端口将被忽略。 |
server_names | string[] | 如果非空,则是一个服务器名称的列表(例如TLS协议的SNI),在确定过滤器链匹配时要考虑。这些值将与新连接的服务器名称进行比较,当被一个监听器过滤器检测到时。 服务器名称将与所有通配符域名进行匹配,即www.example.com,然后是*.example.com,然后是*.com。 注意,不支持部分通配符,像*w.example.com这样的值是无效的。 |
transport_protocol | string | 如果非空,在确定过滤器链匹配时要考虑的传输协议。这个值将与新连接的传输协议进行比较,当它被一个监听器过滤器检测到时。 建议的值包括: - raw_buffer - 默认值,在没有检测到传输协议时使用。 - tls - 当检测到TLS协议时由envoy.filters.listener.tls_inspector设置。 |
application_protocols | string[] | 如果非空,则是一个应用协议的列表(例如,TLS协议的ALPN),在确定过滤器链的匹配时要考虑。这些值将与新连接的应用协议进行比较,当被一个监听器过滤器检测到时。 建议的值包括。 - http/1.1 - 由 envoy. filters.listener.tls_inspector 设置。 - h2 - 由 envoy.filters.listener.tls_inspector 设置。 |