Proxy support with SNI routing

Pulsar Proxy 支持 SNI 路由

代理服务器是一个中转服务,它通过网络转发多个客户端的请求到不同的后端服务器上。 代理服务器在正向代理和反向代理的场景中起到了类似“流量检查”的作用。它能给你的系统带来如下好处,如负载均衡,性能,安全,自动扩缩容等等。

代理服务起到了反向代理的作用,它在所有的 broker 前面创建了一个网关。 Pulsar 不支持Apache Traffic Server (ATS), HAProxy, Nginx和Envoy 等开源代理组件。 代理服务器支持SNI 路由, SNI 路由用于在不断开 SSL 连接的情况下将流量转发到目标地址。 四层路由转发提供了更大的透明度,因为转发的出口连接是根据TCP包里面携带的目标地址信息来确定的。

Pulsar 客户端也支持SNI 路由协议,所以可以通过代理服务连接到实际的 broker。 本篇文档会教你通过设置 ATS 代理,启用 SNI 路由,使 Pulsar 客户端可以通过 ATS 代理连接到 broker。

Pulsar ATS-SNI 路由

如果要支持 四层 SNI 路由 ATS,进站连接必须是 TLS 连接。 Pulsar 客户端在 TLS 连接内支持 SNI 路由协议,所以当 Pulsar 客户端通过 ATS 代理连接到 broker时,Pulsar 实际是使用 ATS 作为一个反向代理。

Pulsar 的跨域复制也支持 SNI 路由,所以不同集群的 Brokers 之间能够通过 ATS 代理进行通信。

本节说明了如何设置和使用 ATS 作为反向代理, 使 Pulsar 客户端能够通过在 TLS 连接上使用 SNI 路由,连接到实际的 broker。

四层 SNI 路由 启用 ATS 代理

如果需要支持四层 SNI 路由, 你必须修改records.confssl_server_name.conf这两个配置文件。

Pulsar 客户端 SNI

默认情况下,records.config文件在本地的/usr/local/etc/trafficserver/目录下。 该文件包含了 ATS 相关的可配置参数。

要修改配置文件records.config,有如下步骤。

  1. 通过参数http.server_ports配置 TLS 监听的端口,通过修改参数: ssl.client.cert.pathssl.client.cert.filename,修改所使用的代理证书,以建立安全的 TLS 隧道。
  2. 通过参数http.connect_port配置 Broker 的服务端口,用来建立隧道。 假设 Pulsar broker 监听的是4436651端口,那么就需要修改配置http.connect_ports为对应的值。

The following is an example.

  1. # 代理的 TLS 端口
  2. CONFIG proxy.config.http.server_ports STRING 4443:ssl 4080
  3. # 代理的证书文件路径
  4. CONFIG proxy.config.ssl.client.cert.path STRING /proxy-cert.pem
  5. # 代理的公钥文件路径
  6. CONFIG proxy.config.ssl.client.cert.filename STRING /proxy-key.pem # 转发服务器只允许在指定的端口建立隧道。 支持通配符形式(*) 和 范围(如0-1023)两种形式。
  7. CONFIG proxy.config.http.connect_ports STRING 4443 6651

ssl_server_name 文件用来配置 TLS 连接的入站和出站规则。 配置需要依赖于入站连接的 SNI 的值。 这个文件由一系列配置项组成,每项都是由 SNI 的值(fqdn)决定。 入站连接建立时,会判断 TLS 携带的 SNI 的值和配置文件的选项是否匹配。 如果值是匹配的,那么配置文件对应的选项的值就会覆盖默认的值。

下面是一个客户端的入站 SNI 主机名的映射关系,以及应该重定向请求的实际 Broker 服务URL的示例。 示例中,如果客户端发送的 SNI 头部携带pulsar-broker1,那么代理服务器会建立一条到pulsar-broker1:665 的TLS连接,然后将该请求重定向到该连接。

  1. server_config = {
  2. {
  3. fqdn = 'pulsar-broker-vip',
  4. # Forward to Pulsar broker which is listening on 6651
  5. tunnel_route = 'pulsar-broker-vip:6651'
  6. },
  7. {
  8. fqdn = 'pulsar-broker1',
  9. # Forward to Pulsar broker-1 which is listening on 6651
  10. tunnel_route = 'pulsar-broker1:6651'
  11. },
  12. {
  13. fqdn = 'pulsar-broker2',
  14. # Forward to Pulsar broker-2 which is listening on 6651
  15. tunnel_route = 'pulsar-broker2:6651'
  16. },
  17. }

当配置完ssl_server_name.configrecords.config两个文件后,ATS 代理服务器就会在客户端和 broker 之间创建一条 TCP 隧道。

Pulsar 客户端的 SNI 路由配置

ATS SNI 路由只能在 TLS 连接上工作。 你首先需要启用 ATS 代理和 Broker 的TLS功能,并且配置 SNI 路由协议,然后Pulsar 客户端和 broker 会通过 ATS 代理建立连接。 Pulsar 客户端支持通过 SNI 路由连接到代理服务器,并在 SNI 头信息里面携带目标的 Broker 地址信息 整个过程是透明的。 你只需要在创建客户端的时候使用 SNI 路由协议,并按照示例示例配置代理信息。

  1. String brokerServiceUrl = pulsar+ssl://pulsar-broker-vip:6651/”;
  2. String proxyUrl = pulsar+ssl://ats-proxy:443”;
  3. ClientBuilder clientBuilder = PulsarClient.builder()
  4. .serviceUrl(brokerServiceUrl)
  5. .tlsTrustCertsFilePath(TLS_TRUST_CERT_FILE_PATH)
  6. .enableTls(true)
  7. .allowTlsInsecureConnection(false)
  8. .proxyServiceUrl(proxyUrl, ProxyProtocol.SNI)
  9. .operationTimeout(1000, TimeUnit.MILLISECONDS);
  10. Map<String, String> authParams = new HashMap<>();
  11. authParams.put("tlsCertFile", TLS_CLIENT_CERT_FILE_PATH);
  12. authParams.put("tlsKeyFile", TLS_CLIENT_KEY_FILE_PATH);
  13. clientBuilder.authentication(AuthenticationTls.class.getName(), authParams);
  14. PulsarClient pulsarClient = clientBuilder.build();

Pulsar 跨域复制使用 SNI 路由

你可以在跨域复制上使用 ATS 代理。 跨域复制当中,Pulsar 的 broker 之间可以使用 SNI 路由进行连接。 如果要允许跨集群的 broker 之间使用 SNI 路由进行通信,你必须把 SNI 代理 URL 配置到集群的元数据信息里面。 如果你在集群元数据里面配置了 SNI 代理 URL,你就能通过代理服务器使用 SNI 路由进行跨集群间的broker通信。

Pulsar 客户端 SNI

在这个例子中,在两个不同的地域部署 Pulsar 集群:us-westus-east 在两个地域部署配置 ATS 代理,每个地域的所有的 Broker 都运行在 ATS 代理的后面。 我们需要在两个集群配置集群元数据信息,然后 broker 在自己的集群能够使用 SNI 路由 通过 ATS 代理和其他集群的 Broker 进行通信。

修改集群us-east的元数据信息,配置 Broker 的URL、ATS 代理URL、SNI 代理协议。

  1. ./pulsar-admin clusters update \
  2. --broker-url-secure pulsar+ssl://east-broker-vip:6651 \
  3. --url http://east-broker-vip:8080 \
  4. --proxy-protocol SNI \
  5. --proxy-url pulsar+ssl://east-ats-proxy:443

修改集群us-west的元数据信息,配置 Broker 的URL、ATS 代理URL、SNI 代理协议。

  1. ./pulsar-admin clusters update \
  2. --broker-url-secure pulsar+ssl://west-broker-vip:6651 \
  3. --url http://west-broker-vip:8080 \
  4. --proxy-protocol SNI \
  5. --proxy-url pulsar+ssl://west-ats-proxy:443