无法通过SSH隧道访问AWS私有子网内的ElasticSearch服务器求助
排查AWS私有子网Elasticsearch Kibana通过堡垒机SSH隧道访问问题
我来帮你一步步排查这个问题,之前在AWS环境里我也遇到过类似的SSH隧道访问障碍,咱们从基础配置到命令细节逐一确认:
1. 先确认堡垒机与ES实例的网络连通性
首先得确保堡垒机能正常访问ES实例,这是隧道能通的前提:
- 登录堡垒机,执行
ping <ES私有IP>,看能不能连通;如果ping不通,先检查VPC路由表(私有子网路由表要指向VPC内部,堡垒机所在公有子网要有指向Internet Gateway的路由)。 - 再在堡垒机上测试Kibana端口:
curl http://<ES私有IP>:5601,如果能返回Kibana的HTML内容,说明网络层面是通的;如果不行,重点检查下面的安全组和NACL配置。
2. 核对安全组(Security Group)规则
这是最容易出问题的环节,别漏了:
- 堡垒机安全组:入站规则必须允许你本地IP的SSH(22端口)访问;出站规则要允许到ES私有子网IP段的5601(Kibana)和9200(ES)端口,或者临时允许所有出站流量来快速测试。
- ES实例安全组:入站规则必须允许堡垒机所在私有IP的5601和9200端口访问;出站规则允许所有必要的流量(比如到ES集群其他节点,或者临时放开所有)。
3. 检查网络访问控制列表(NACL)
NACL是VPC的第二层防火墙,很多人会忽略它:
- 公有子网NACL:
- 入站:允许来自你本地IP的22端口(SSH)
- 出站:允许到ES私有子网IP段的5601、9200端口
- 私有子网NACL:
- 入站:允许来自堡垒机IP的5601、9200端口
- 出站:允许所有返回流量(比如HTTP响应)
4. 确认SSH隧道命令是否正确
本地建立端口转发的命令要注意参数细节,给你个标准示例:
ssh -i "/path/to/your-bastion-key.pem" -L 5601:<ES私有IP>:5601 ec2-user@<堡垒机公有IP>
-L:代表本地端口转发,格式是本地端口:目标IP:目标端口- 如果你需要后台运行隧道,可以加
-fN参数:ssh -i "key.pem" -fN -L 5601:es-ip:5601 user@bastion-ip - 注意:本地的5601端口不能被其他程序占用,可以用
lsof -i :5601(Mac/Linux)或者netstat -ano | findstr :5601(Windows)检查端口占用情况。
5. 检查Elasticsearch和Kibana的配置
如果网络都通了但还是访问不了Kibana,要确认服务端的绑定设置:
- Kibana配置文件(kibana.yml):确保
server.host设置为0.0.0.0或者ES实例的私有IP,不能只绑定127.0.0.1(否则只有ES本地能访问);另外elasticsearch.hosts要指向ES的私有IP(比如http://<ES私有IP>:9200)。 - Elasticsearch配置文件(elasticsearch.yml):
network.host设置为私有IP或者0.0.0.0,确保允许堡垒机的IP访问;如果开启了X-Pack安全,要确保你有Kibana的访问权限,并且在本地访问时能正确输入账号密码。
6. 本地测试与排错
隧道建立后,在本地浏览器访问http://localhost:5601,如果还是不行:
- 在本地执行
curl http://localhost:5601,看返回的错误信息(比如连接拒绝、超时),对应排查:- 连接拒绝:可能是本地端口没转发成功,或者ES/Kibana没监听对应端口
- 超时:可能是堡垒机到ES的网络不通,或者安全组/NACL拦截
内容的提问来源于stack exchange,提问作者Nitin Ware
相关产品推荐
相关产品推荐

