ssh tunneling/port 无法通过 EC2 实例转发到 VPC 中的 Elasticsearch 集群

ssh tunneling/port forwarding not working through EC2 instance to an Elasticsearch cluster in a VPC

我在 VPC 中有我的 Elasticsearch 集群,我想从我的本地 Macbook 访问这个 EC 集群。 我已经设置了一个使用相同 VPC 和相同安全组的堡垒主机,并且我能够从我的 Macbook ssh 进入这个堡垒主机。

但是不知何故,我的代码无法通过这个堡垒主机连接到我的 ES 集群,这是我对 运行 端口转发的命令:

ssh -i ~/Downloads/keypairs/20210402-02.pem ubuntu@ec2-123-456.us-west-2.compute.amazonaws.com -N -L 9200:vpc-es-domain-20210331-abc123def.us-west-2.es.amazonaws.com:443

下面是我访问VPC中的ES集群超时异常:

java.net.ConnectException: Timeout connecting to [vpc-es-domain-20210331-abc123def.us-west-2.es.amazonaws.com/10.0.47.182:443]
    at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:823) ~[elasticsearch-rest-client-7.6.1.jar:7.6.1]
    at org.elasticsearch.client.RestClient.performRequest(RestClient.java:248) ~[elasticsearch-rest-client-7.6.1.jar:7.6.1]
    at org.elasticsearch.client.RestClient.performRequest(RestClient.java:235) ~[elasticsearch-rest-client-7.6.1.jar:7.6.1]
    at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1514) ~[elasticsearch-rest-high-level-client-7.6.1.jar:7.6.1]
    at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1484) ~[elasticsearch-rest-high-level-client-7.6.1.jar:7.6.1]
    at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1454) ~[elasticsearch-rest-high-level-client-7.6.1.jar:7.6.1]
    at org.elasticsearch.client.RestHighLevelClient.bulk(RestHighLevelClient.java:497) ~[elasticsearch-rest-high-level-client-7.6.1.jar:7.6.1]

这是我的 SG 规则:

入站:

All TCP TCP 0 - 65535   0.0.0.0/0
All traffic All All sg-abc123 / default
SSH TCP 22  0.0.0.0/0

出境:

All traffic All All 0.0.0.0/0

当我通过 ssh 连接到我的堡垒主机并 运行 curl vpc-es-domain-20210331-abc123def.us-west-2.es.amazonaws.com 时,我收到了这样的回复:

{
  "name" : "abc123",
  "cluster_name" : "abc123097:es-domain-beta-20210331",
  "cluster_uuid" : "abc123def",
  "version" : {
    "number" : "7.8.0",
    "build_flavor" : "oss",
    "build_type" : "tar",
    "build_hash" : "unknown",
    "build_date" : "2021-01-15T06:15:47.944536Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

我怀疑我执行端口转发的命令不正确?但经过研究,这对我来说看起来是最合法的选择。 任何见解将不胜感激!

您本地计算机上的代码 运行 正在尝试不通过 SSH 隧道直接连接到 Elasticsearch 服务器。 SSH 命令正在打开从本地端口 9200 到远程服务器的隧道。尝试连接到 Elasticsearch 的本地软件应该连接到 localhost:9200 而不是 vpc-es-domain-20210331-abc123def.us-west-2.es.amazonaws.com/10.0.47.182:443.


端点 vpc-es-domain-20210331-abc123def.us-west-2.es.amazonaws.com/10.0.47.182:443 无论如何看起来都无效。它有一个主机名和一个 IP 地址。


您在评论中提到:

"I actually launched my bastion host using the same SG as my ES"

但是,除非该安全组也有专门允许其中资源之间的流量的规则,否则仅将两个资源放在同一个安全组中是无效的。默认情况下,安全组没有此规则,但在您首次创建 AWS 账户时自动创建的默认 VPC 中的默认安全组除外。

所以请确保安全组有一个规则,允许堡垒主机通过端口 443 连接到 Elasticsearch 服务器。