Kafka 跨跳板机 SSH 隧道 socat 端口转发部署
发布时间:2026/10/20 19:58:38 锦皓数字建站

一、问题背景使用 Kafka 客户端连接远端 Kafka 集群程序启动后持续报错Disconnected while requesting ApiVersion: might be caused by incorrect security.protocolbroker 返回主机名为kafka1:9092程序反复断开重连无法正常消费生产消息。现象网络端口能通但是客户端拿到 broker 返回的主机名kafka1本机无法解析该域名导致连接失败。 根本原因Kafka 的advertised.listeners返回的是主机名而非 IP本地机器 DNS /hosts 无法解析kafka1客户端拿到域名后无法建立真实 TCP 连接。二、现场拓扑简述业务自研 Kafka 程序部署在自有服务器无法直连内网 Kafka 集群链路经过跳板机做 SSH 隧道转发。约束跳板机 9092 端口被其他业务占用跳板机 SSH 隧道使用9093映射内网 Kafka 的 9092 端口。自有服务器无法访问外网socat 需要在外网电脑下载源码编译打包后上传至现场服务器离线部署。完整链路 自有服务器自研 Kafka 转发程序 → socat 监听127.0.0.1:9092→ 转发至跳板机x.x.x.x:9093→ 跳板机 SSH 隧道 → 内网 Kafka 集群 9092三、两种解决思路方案 1hosts 域名解析 socat 端口转发适用场景无法修改远端 Kafka 服务端server.properties配置不能改动线上 Kafka 集群只能在业务应用侧做适配。1配置 /etc/hosts 域名映射把 Kafka 广播返回的主机名映射到本机回环地址让客户端解析kafka1指向本机。echo 127.0.0.1 kafka1 /etc/hosts2socat 端口转发代理利用 socat 做 TCP 端口转发本地监听 端口将流量转发到远端真实 Kafka 地址x.x.x.x:9093。 命令释义TCP-LISTEN:9092,bind127.0.0.1仅在本机 127.0.0.1 监听 9092 端口fork支持多客户端并发连接reuseaddr端口可快速复用避免服务重启端口占用报错TCP:x.x.x.x:9093后端真实 Kafka 服务地址# 临时前台后台运行 /opt/socat/bin/socat TCP-LISTEN:9092,bind127.0.0.1,fork,reuseaddr TCP:x.x.x.x:9093 socat 编译部署步骤下载socat源码包上传至业务服务器/opt目录编译安装cd /opt tar -zxvf socat-1.8.0.0.tar.gz cd socat-1.8.0.0 ./configure --prefix/opt/socat make -j4 make install # 验证版本 /opt/socat/bin/socat -V打包部署包方便多台机器分发tar -czzf socat-deploy.tar.gz socat/目标机器解压cd /opt tar -xzvf socat-deploy.tar.gz设置 systemd 开机自启常驻服务编写socat-forward.service单元文件实现开机自动端口转发进程异常自动重启。[Unit] DescriptionSocat Kafka TCP Forward Afternetwork.target [Service] ExecStart/opt/socat/bin/socat TCP-LISTEN:9092,bind127.0.0.1,fork,reuseaddr TCP:x.x.x.x:9093 Restartalways [Install] WantedBymulti-user.target生效命令systemctl daemon-reload systemctl enable socat-forward.service systemctl start socat-forward.service配置完成后启动业务 Kafka 程序连接本地kafka1:9092即可正常工作。方案 2治本方案修改 Kafka 服务端 server.properties如果有权限修改 Kafka 服务端优先改服务端不需要 socat 转发。 修改server.properties中advertised.listeners写业务服务器可以直接访问的真实 IP 地址。关键点advertised.listeners是 broker 返回给客户端的连接地址客户端会拿这个地址去连接 broker。填域名客户端必须能解析域名填 IP客户端直接使用 IP 连接。四、问题根因总结Kafka 客户端连接流程客户端连接 bootstrap 地址broker 返回advertised.listeners配置的地址列表客户端丢弃 bootstrap 地址使用返回的地址列表真正建立连接。当advertised.listeners配置为主机名kafka1应用服务器无法解析该主机名就会出现ApiVersion请求断开、报 brokers are down。socat 方案属于应用侧兼容妥协适合不能修改 Kafka 集群配置的生产现场修改advertised.listeners是最优根治方案。五、socat 简单科普socat 全称 SOcket CAT就是一个 Linux 命令行工具作用很简单把两个数据流打通双向转发数据。它常被叫做 netcat 的增强版。作用端口转发把本机某个端口收到的数据转发到另一个 IP 和端口。协议桥接比如 TCP ↔ UDP、TCP ↔ Unix Socket、TCP ↔ 串口。网络调试模拟服务端、客户端看数据能不能通。文件/管道/设备转发不只是网络还能转发文件、管道、串口设备。SSL 隧道给普通 TCP 连接加一层加密。远程 Shell也能用来建立正向或反向 Shell但运维现场一般只用它做转发。注意socat 端口转发会增加一层网络开销生产环境评估性能bind127.0.0.1 限制只能本机访问转发端口提升安全性。# 本地端口转发同主机端口映射 socat TCP-LISTEN:端口,bind127.0.0.1,fork,reuseaddr TCP:目标IP:目标端口 # 双向管道简易测试本地回环测试 socat - TCP:127.0.0.1:28080六、踩坑清单不要把报错might be caused by incorrect security.protocol当成一定是 SSL/SASL 配置错误很多时候只是域名解析失败。advertised.listeners 和 listeners 区分listenersbroker 本机监听哪个网卡端口advertised.listeners返回给外部客户端的访问地址。hosts 配置后确认是否生效ping kafka1验证解析结果。socat 一定要配置fork否则只能处理单个客户端连接。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。