Logstash无法连接远程ElasticSearch,请求排查连接拒绝问题
排查Logstash无法连接远程ElasticSearch的常见原因
你碰到的Connection refused错误其实很常见——虽然在ElasticSearch主机上用curl -I http://localhost:9200能正常拿到响应,但Logstash连不上,基本都是网络层面的访问限制或者ES自身绑定配置的问题,下面是几个最值得优先排查的方向:
1. ElasticSearch仅绑定了localhost地址
默认情况下,很多ES安装会把监听地址设为127.0.0.1(也就是只允许本机访问),这种情况下远程的Logstash自然连不上。
- 排查操作:在ES主机上执行以下命令,查看9200端口的监听地址:
如果输出里的地址是netstat -tulpn | grep 9200 # 或者用更现代的ss命令 ss -tulpn | grep 9200127.0.0.1:9200,说明确实只绑定了localhost;如果是0.0.0.0:9200,则表示允许所有IP访问。 - 解决办法:修改ES的配置文件
elasticsearch.yml,找到network.host参数,将其设置为0.0.0.0(允许所有IP)或者ES主机的实际对外IP,之后重启ES服务。
2. ES主机的防火墙/安全组挡住了9200端口
即使ES已经允许远程访问,主机的防火墙或者云服务器的安全组也可能拦截了Logstash的请求。
- 排查操作:在Logstash所在的机器上,直接尝试访问ES的端口:
如果同样返回curl -I http://<another_host_ip>:9200 # 或者用telnet测试连通性 telnet <another_host_ip> 9200Connection refused或者超时,说明网络通路被阻断了。 - 解决办法:
- 针对Linux防火墙:如果是
ufw,执行sudo ufw allow 9200/tcp;如果是firewalld,执行sudo firewall-cmd --add-port=9200/tcp --permanent && sudo firewall-cmd --reload。 - 针对云服务器:登录云平台控制台,在安全组规则中添加允许Logstash所在IP访问9200端口的入站规则。
- 针对Linux防火墙:如果是
3. Logstash配置中的IP地址有误
仔细核对Logstash输出配置里的<another_host_ip>是不是ES主机的正确地址——比如误填了内网IP但Logstash在另一个网络,或者IP拼写错误。
- 验证操作:在Logstash机器上执行
ping <another_host_ip>,看看能不能正常ping通;如果是云环境,确认用的是公网IP还是内网IP,确保两者在同一网络(或者公网IP能被访问)。
4. ElasticSearch的HTTP端口被修改(可能性较低)
虽然ES默认用9200端口,但如果修改过http.port配置,Logstash里的端口也要对应调整。
- 排查操作:在ES主机上执行以下命令,查看实际的HTTP端口:
输出里会显示当前ES使用的HTTP端口,如果不是9200,就需要在Logstash的curl -I http://localhost:9200/_nodes/httpelasticsearch输出配置里加上port => "xxx"参数。
内容的提问来源于stack exchange,提问作者Panda1667075




