Я хочу, чтобы Envoy завершил TLS и обратил прокси к нескольким кластерам на основе имени SNI, используемого в соединении TLS от клиента к Envoy. Соединения - это TCP (не HTTP).
Из документации сетевой фильтр sni_cluster
использует значение SNI в соединении TLS в качестве имени восходящего кластера. Я думаю, это означает, что я должен быть в состоянии создать (например) 2 кластера, sni_1
и sni_2
, и Envoy будет прокси-сервер к этим 2 кластерам, если SNI в соединении TLS совпадает с любым из этих двух значений.
В документации также говорится, что сетевой фильтр tcp_proxy
должен быть настроен и настроен после sni_cluster
.
Я использую следующую конфигурацию (у меня есть фиктивные значения в узлах кластера, поэтому игнорируйте их):
static_resources:
listeners:
- name: tcp_front_end
address:
socket_address: { address: 0.0.0.0, port_value: 5000 }
filter_chains:
- filters:
- name: envoy.filters.network.sni_cluster
- name: envoy.tcp_proxy
config:
stat_prefix: tcp
max_connect_attempts: 3
tls_context:
common_tls_context:
tls_certificates:
- certificate_chain:
filename: "/etc/envoy/cert.pem"
private_key:
filename: "/etc/envoy/key.pem"
clusters:
- name: sni_1
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hosts: [{ socket_address: { address: google.com, port_value: 443 }}]
- name: sni_2
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hosts: [{ socket_address: { address: news.bbc.co.uk, port_value: 443 }}]
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 0.0.0.0, port_value: 9091 }
Документация tcp_proxy
также гласит:
Точно один из кластеров, weighted_clusters должен быть установлен.
Я не поместил секцию cluster
в мою секцию фильтра tcp_proxy
, так как не вижу, как определить кластер, к которому tcp_proxy
должен подключиться, учитывая, что документация кажется сделать вывод, что фильтр sni_cluster
должен указать это для меня.
Как мне добиться обратного прокси SNI с использованием TCP (не HTTP)?