如何从外部访问专用网络上的 Cloudera Kafka Broker?

How to reach Cloudera Kafka Broker on private network from outside?

我在 VPN 中有一个集群,其中包含一个具有私有 IP 的服务器。我正在尝试在外部服务器与我的私人服务器之间建立 Kafka 通信。我的方法是设置一个 IP table,其中 public IP 指向我的私有 IP。另外,我打开了端口 9092 和 9093 以使其可以从外部访问。现在我可以使用来自外部服务器的 public IP 成功连接到我的服务器。

telnet <public_ip> 9092
Connected to <public_ip>

我的kafka代理在cloudera集群下,我用Cloudera Manager创建的。配置如下:

kafka.properties:

listeners=PLAINTEXT://<private_ip>:9092,SSL://<private_ip>:9093
advertised.listeners=PLAINTEXT://<private_ip>:9092,SSL://<private_ip>:9093

advertised.host.name:

<public_ip>

使用此代理配置,使用卡夫卡代理主机的 public_ip 或 private_ip,通信在集群内完美运行。

我现在看到的是,我有一个可以与 public_ip 一起使用的工作代理和一个能够访问 public_ip 的外部服务器,它是必需的端口。但是当我尝试从外部服务器连接到代理时,出现以下错误:

NO BROKERS AVAILABLE

没有更多的错误信息。在我的外部服务器上,我有 kafka python 包,我将生产者配置为:

"bootstrap_servers": ["<publi_ip>:9092"]

关于我的 kafka 代理的现有主题。

E规格:

私人主机

cloudera: CDH 5.12.0

kafka: kafka 2.2.0-1.2.2.0

zookeeper: Zookeeper 3.4.5

外部主机

kafka Python package: kafka-python==1.4.2

问题与非常相似。但在这种情况下,他使用了一个带有 public ip 的转发端口。有没有可能用 ip tables 来做?有人设法在 cloudera 集群上做到了吗?

提前谢谢你。

该问题并非特定于 Cloudera 或 Python。而且我认为 Cloudera Manager 没有可以为您设置的设置。

advertised.listeners 必须是 publicly 可解析的地址,可用于由客户端单独访问每个代理(例如,两个代理不能具有相同的侦听器设置并从端口使用从 public 地址转发到内部地址)

您的设置与 Docker 中的 Kafka 运行 或 AWS 等云提供商非常相似,因为您通过两个网络进行交互,因此请参阅 this blog for more information

此外,除非您设置了一些其他防火墙设置来防止随机访问,否则不要在明文协议中公开代理