Kafka 允许外网访问

摘要

  • 本文介绍 Kafka 的 通信协议,以及如何开启外网访问。

  • Kafka官网

  • 本文使用的 Kafka 版本为 3.9.1。Kafka 团队宣布 3.9 会是 最后一个还带有被弃用的 ZooKeeper 模式 的主要版本。以后版本(如 4.0)将完全弃用 ZooKeeper。

Kafka 的 通信协议

  • Kafka 主要支持四种安全协议

协议名称 加密 认证 说明 推荐场景 理由
PLAINTEXT ❌ 否 ❌ 否 无加密、无认证(默认最简单) 开发 / 测试环境、内网集群通信 简单、易调试;网络可信,性能优先
SSL ✅ 是 ✅ 可选 使用 TLS/SSL 加密通信,可配置客户端证书认证 外网客户端访问 支持数据加密,可选认证,保证安全
SASL_PLAINTEXT ❌ 否 ✅ 是 使用 SASL(用户名密码)认证,但不加密数据 需要用户认证但局域网环境 有认证,但不加密,性能开销低
SASL_SSL ✅ 是 ✅ 是 同时支持 SASL 认证和 SSL 加密(最安全) 外网客户端访问 既有认证又加密,安全性最高
  • config/server.properties 文件中 可以看到如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 套接字服务器监听的地址。
# 如果未配置,则主机名默认等于 `java.net.InetAddress.getCanonicalHostName()` 的返回值,
# 使用监听器名称 `PLAINTEXT`,端口号为 9092。
# 格式:
# listeners = listener_name://host_name:port
# 示例:
# listeners = PLAINTEXT://your.host.name:9092
#listeners=PLAINTEXT://:9092

# Broker 向客户端“通告”的监听器名称、主机名和端口。
# 客户端实际会连接这个地址,而不是直接使用 listeners 的地址。
# 如果未设置,则默认使用 `listeners` 的值。
#advertised.listeners=PLAINTEXT://your.host.name:9092

# 将监听器名称映射到安全协议类型。
# 默认情况下,监听器名称与安全协议同名。
# 例如:PLAINTEXT→PLAINTEXT、SSL→SSL、SASL_PLAINTEXT→SASL_PLAINTEXT、SASL_SSL→SASL_SSL。
# 更多细节可参考 Kafka 官方配置文档。
#listener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
配置项 作用 说明值
listeners Kafka 实际监听的地址(Broker 对外开放的端口) PLAINTEXT://:9092这里 PLAINTEXT 是监听器名称,并不是协议名称,实际上可以配置为任何值,具体协议是通过 listener.security.protocol.map 配置的映射关系来确定。
advertised.listeners Kafka 告诉客户端应该用哪个地址连接(客户端最终连的) 默认使用 listeners 的值
listener.security.protocol.map 映射监听器名称到通信安全协议(如明文、SSL、SASL 等) PLAINTEXT:PLAINTEXT,前面是监听器名称,后面是协议名称

仅需内网访问

1
2
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://192.168.1.10:9092 # 这里是内网ip

允许外网访问

1
2
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://123.45.67.89:9092 # 这里是外网ip

内外网都要访问(推荐双通道方式)

1
2
3
4
5
6
7
8
# 这里 INTERNAL 和 EXTERNAL 分别是自定义的监听器名称,此时内网端口为 9092,外网端口为 9093
listeners=INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:9093
# 告诉客户端应该用哪个地址连接
advertised.listeners=INTERNAL://192.168.1.10:9092,EXTERNAL://123.45.67.89:9093
# 映射监听器名称到通信安全协议的映射关系
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
# 集群间通信仍使用内网
inter.broker.listener.name=INTERNAL