首页 > 解决方案 > 从我的局域网外部访问 Kafka 代理

问题描述

我使用下面的默认命令启动了一个普通的 Zookeeper/Kafka 代理,因为这些在一台机器上的Kafka 文档中有所描述(我们称之为Machine A

bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties

这些在机器 A 的 localhost:9092 处启动一个代理。

然后我转到同一网络上的另一台计算机(我们将其命名为Machine B),并通过调用它来创建 Kafka 提供的默认使用者

bin/kafka-console-consumer.sh --bootstrap-server IP_ADDRESS_HERE:9092 --topic test --from-beginning

其中 IP_ADDRESS_HERE 是托管代理的机器 A 的本地网络中的 IP 地址(例如,192.168.1.10)

一切正常。然后我尝试从本地网络之外的机器(我们称之为Machine C)访问代理。我转到我的路由器配置,并为托管代理的机器(机器 A)进行端口转发。例如,我执行以下操作

192.168.1.10:9092 --> 9094

这意味着我将 192.168.1.10 设备(机器 A)的内部 9092 端口转发到路由器的端口 9094。然后,我访问YouGetSignal之类的服务并检查我的公共IP 地址(例如,97.190.92.128)的端口 9094 是否打开。我收到一条消息,表明端口确实是打开的。

当我尝试使用以下命令从机器 C 消耗机器 A 中的 borker 时

bin/kafka-console-consumer.sh --bootstrap-server PUBLIC_IP_ADDRESS_HERE:9094 --topic test --from-beginning

其中 PUBLIC_IP_ADDRESS_HERE 是机器 A 所在网络的公共 IP 地址(例如,97.190.92.128)。但是,我收到无法连接到 192.168.1.10:9092 的错误 - 代理可能不可用(请注意,错误中返回了内部 IP:端口,这意味着我的路由器正确提供了信息)

我究竟做错了什么?

标签: networkingapache-kafkaportforwarding

解决方案


您需要更新advertised.listenersserver.properties的主机/IP 和端口组合,您的客户端可以解析和连接到该组合。

正如您所观察到的,代理192.168.1.10:9092在响应连接到它的客户端时发出响应,这对于同一网络上的任何机器(包括机器 B)都可以正常工作。

对于机器 C,代理需要告诉它如何连接到代理,如果我正确地遵循了它是PUBLIC_IP_ADDRESS_HERE:9094.

如果您需要从 LAN 和 WAN 进行连接,则需要两个侦听器;一个用于 LAN,一个用于 WAN。投入server.properties

listeners=LISTENER_LAN://0.0.0.0:9092,LISTENER_WAN://0.0.0.0:9094
advertised.listeners=LISTENER_LAN://192.168.1.10:9092,LISTENER_WAN://PUBLIC_IP_ADDRESS_HERE:9094
listener.security.protocol.map: LISTENER_LAN:PLAINTEXT,LISTENER_WAN:PLAINTEXT
inter.broker.listener.name=LISTENER_LAN

请注意,您需要更改端口转发,以便代理上的端点是为LISTENER_WAN(9094) 定义的端口。如果 WAN 连接尝试连接到 9092 上的代理,则会向其提供LISTEN_LAN详细信息(这是目前正在发生的事情,并且不起作用)。

参考:https ://rmoff.net/2018/08/02/kafka-listeners-explained/


推荐阅读