记一次kafka外网无法访问(结合frp内外网穿透) - Go语言中文社区

记一次kafka外网无法访问(结合frp内外网穿透)


一.起因

          有个需求,需要将阿里云的kafka数据发送到某个内网环境,但是内网环境又没有一个对外的公网IP,怎么办呢?后来采用了frp内网穿透技术,使得阿里云服务器可以访问kafka,但是却发现发送了数据,内网接收不到......

 

二.解决方案

1)外网服务器配置

       1)hosts配置映射

#  配置映射
#  ip为阿里云服务器的内网ip
#  kafka.com 为内网环境 kafka——>advertised.listeners  配置的内网域名
10.10.10.10  kafka.com

       2)frps.ini配置

[common]
bind_port = 7000
auth_token = 123456

 

2)内网环境配置

      1)host配置映射

#  配置映射
#  ip为内网环境kafka的ip
#  kafka.com 为内网环境 kafka——>advertised.listeners  配置的内网域名
192.168.2.105  kafka.com

      2)frpc.ini配置

[common]
server_addr = 120.120.120.XXX
server_port = 7000
token = 123456

[kafka]
type = tcp
local_ip = 192.168.2.105
local_port = 1111
remote_port = 1111

     3)kafka中server.properties配置

listeners=PLAINTEXT://192.168.2.105:1111
advertised.listeners=PLAINTEXT://kafka.com:1111

 

三.启动服务测试

1)内网环境启动:  kafka /  zookeeper / frpc  

2)外网服务器启动: frps

3)测试:

              外网服务器:$KAFKA_HOME/bin/kafka-console-producer.sh --broker-list kafka.com:1111  --topic  my_topic

 

四.原理

       advertised.listeners=PLAINTEXT://kafka.com:1111 配置的地址必须要能连通,一般配置为外网地址,因为kafka会将这个ip和port记录在zookeeper上,当外网访问时直接通过这个地址连接(如果未配置这个参数,则外网会拿到内网的IP,从而无法访问)

       但是由于frp的特殊性,frp映射之后,只能外网的服务器本身能访问,因为防火墙只开放了22远程端口 ,1111并未开放 ,因此内网的kafka无法访问。所以需要配置一个内网域名 kafka.com,在内网服务器中配置映射(192.168.2.105  kafka.com), 在kafka启动的时候,会去连接 kafka.com:1111 ,正常访问。而外网服务器在zookeeper中找到 kafka.com:1111的连接地址,也需要映射 (10.10.10.10  kafka.com) , 使得外网服务器也能通过 1111端口正常访问,问题解决。

        kafka端口1111必须与 frp 映射的一致。

   advertised.listeners在kafka启动时,必须要能连接,所以一定要配置成域名,然后在host配置映射。当在外网访问时,拿到这个域名,并且在外网本机配置host映射,从而正确访问。

 

 

参考连接:

  kafka:   https://blog.csdn.net/lsr40/article/details/84135959

  frp:    https://blog.csdn.net/qq_23160237/article/details/90052966

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_23160237/article/details/90055574
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-06 09:36:22
  • 阅读 ( 1354 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢