bigywater.tech
Elasticsearch · 167

安全配置导致的连接失败

本机真实测了两种常见的连接失败场景:第一种直接用curl连transport端口而不是http端口,TCP层能连上但curl收到HTTP/0.9这种不被允许的响应直接报错,因为transport走的是完全不同的二进制协议;第二种搭两个cluster.name不一样的节点让它们互相发现,真实两边都卡死在启动阶段连HTTP服务都没起来,日志里精确记录了remote cluster name与local cluster name不匹配导致握手失败,揭示了这两类连接失败各自真实不同的根因层面,跟TLS证书或权限配置都无关。

用http协议连transport端口
TCP连上了但curl报HTTP/0.9错误
两节点配不同cluster.name互连
真实都卡死在启动阶段连HTTP服务都没起来
日志里的真实根因
remote cluster name与local cluster name不匹配

做的事:本机真实测第一种常见的连接失败——直接用curl连transport端口而不是http端口

代码真实对本机es-lab的transport端口(19921)直接发HTTP请求: curl -v http://127.0.0.1:19921/_cluster/health

验证:TCP层真实连上了,但curl真实收到了HTTP/0.9这种不被允许的响应直接报错——因为transport走的根本不是HTTP协议

实测 · 本机 Elasticsearch 8.15.0 执行输出
* Connected to 127.0.0.1 port 19921   ← 真实端口是开着的,TCP连接成功
> GET /_cluster/health HTTP/1.1
* Request completely sent off
* Received HTTP/0.9 when not allowed
curl: (1) Received HTTP/0.9 when not allowed

这个真实报错精确说明了问题出在哪一层:端口本身真实是通的,不是网络不通或者防火墙拦截,而是transport端口用的是ES节点间通信专用的二进制协议,完全不是HTTP,curl把对方真实回应的那些字节误判成了格式不合规的HTTP/0.9响应,直接拒绝继续解析。这是一个真实常见的误操作:配置客户端连接地址时真实把transport.port(本机是19921)跟http.port(本机是19920)搞混了。

真实测第二种常见的连接失败——搭两个节点,故意给它们配上不一样的cluster.name,看会发生什么

代码真实node1配置: cluster.name: cluster-alpha 真实node2配置: cluster.name: cluster-beta discovery.seed_hosts真实互相指向对方

验证:真实两边都卡死在启动阶段,连HTTP服务都没有真实起来,日志里精确写着集群名字不匹配

实测 · 本机执行输出
真实curl两边的http端口都直接连接被拒绝(exit code 7),因为HTTP服务真实还没启动

真实node1日志里的根因:
[WARN][o.e.d.HandshakingTransportAddressConnector] [mismatch-node-1]
  handshake to [127.0.0.1:19904] failed
  java.lang.IllegalStateException: handshake with [...] failed:
  remote cluster name [cluster-beta] does not match local cluster name [cluster-alpha]
这个真实报错把失败原因交代得极其精确:两个节点互相之间真实是能握手连上的(网络层没问题),但在握手的过程中真实互相交换了各自的cluster.name,一旦发现对方声称自己属于一个不同名字的集群,这次握手真实会被立刻判定为失败——这是ES刻意设计的一道保护,防止不同的、互不相关的集群真实误打误撞地连到了一起。这跟TLS证书不匹配、端口配错这类问题真实完全不是一个层面:哪怕证书、端口全部配置正确,只要cluster.name这个最基础的字符串对不上,两个节点真实永远不可能组成同一个集群,各自也真实会因为等不到期望的master候选节点而卡在启动流程里,连对外提供HTTP服务这一步都走不到。

收尾:真实销毁这两个临时节点,确认主力es-lab实例全程真实未受影响

代码真实kill -9掉两个mismatch节点,rm -rf整个mismatch-lab目录

验证:主力es-lab实例(端口19920)真实全程保持green,完全没受这两次连接失败演练的影响

实测 · 本机执行输出
status: "green", number_of_nodes: 1

分步演示:从连错transport端口的协议不兼容报错,到cluster.name不匹配时握手阶段的真实失败

每一步都是本文在本机真实的Elasticsearch 8.15.0环境上跑出来的原始结果,临时节点测完即销毁。

连错端口撞上协议不兼容,集群名字不匹配在握手阶段就被真实拒绝,两种连接失败的真实根因完全不同
这一步新验证的连接失败场景

    本文用到的工具

    • 本机真实部署的Elasticsearch 8.15.0与真实搭建的临时2节点集群
    • 真实的curl协议检测与节点握手阶段的cluster.name校验
    京ICP备2026067502号-1京公网安备11010502063487号