【问题标题】:ssh tunnel for elasticsearch用于弹性搜索的 ssh 隧道
【发布时间】:2016-09-22 09:16:29
【问题描述】:

我在一个不允许直接访问 elasticsearch 的 vpn 上,所以我试图通过 ssh 隧道连接到可以访问的外部盒子。

我正在使用以下隧道:

ssh -L 12345:<elastic_ip>-east-1.aws.found.io:9200

但是如果我卷曲:

curl http://user:pass@localhost:12345

我明白了:

{"ok":false,"message":"Unknown cluster."}

但是,如果我直接从包装盒中尝试:

curl http://user:pass@<elastic_ip>-east-1.aws.found.io:9200

我明白了:

{
  "status" : 200,
  "name" : "instance",
  "cluster_name" : “<cluster>”,
  "version" : {
    "number" : "1.7.2",
    "build_hash" : “<build>“,
    "build_timestamp" : "2015-09-14T09:49:53Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

我做错了什么?

【问题讨论】:

  • 我可能是错的,但它可能使用端口号作为一种标识形式 - 仅用于测试目的,您可以尝试使用ssh -L 9200:&lt;ip&gt;:9200 然后curl localhost:9200 吗?

标签: elasticsearch ssh ssh-tunnel


【解决方案1】:

以下是使用#Putty 使用#SSH 隧道的方法。

以下是使用 Putty 配置 SSH 隧道所需的步骤:

  • here 下载 Putty 并安装它。
  • 为 Elasticsearch 9300 和 9200 端口配置 Putty 隧道,如下面的屏幕截图所示:
  • 配置完成后,您需要打开 SSH 连接并确保它已连接。
  • 您可以查看 SSH 事件日志以验证您的隧道。 Here 是一个关于如何操作的链接。

下面是用#Java 编写的#Elasticsearch 代码,展示了如何使用通过 Putty SSH 客户端转发的本地(9090 和 9093)端口连接到远程 Elasticsearch 集群。

public class App 
{
    public static void main( String[] args ) throws Exception
    {
        Settings settings = ImmutableSettings.settingsBuilder().
             put("cluster.name", "my-cluster").build();

        TransportClient client = new TransportClient(settings)
                                 .addTransportAddress(
                                  new netSocketTransportAddress(
                                  "localhost", 9093));

        CreateIndexResponse rs = client.admin().indices().create(
                      new CreateIndexRequest("tunnelingindex"))
                     .actionGet();

        System.out.println(rs.isAcknowledged());
        client.close();
    }
}

代码在 Elasticsearch 上创建了一个名为 tunnelingindex 的索引。

希望对你有帮助。

【讨论】:

  • 与 Kaizen(ES GUI 客户端)一起工作得很好。但是,如果您的 ES 服务器只能从目标 SSH 服务器访问,那么您必须提供 127.0.0.1:9200 作为 Destination
【解决方案2】:

这是HTTP协议的问题。它还包含主机名,而不仅仅是 IP 地址,如果您在 localhost 上发出请求,此主机名将传递给集群。

基本上有两种解决方案,都非常hacky:

  1. 将您的 elasticsearch 主机名设置为 localhost,以便它能够识别您的查询。
  2. 设置您的/etc/hosts&lt;elastic_ip&gt;-east-1.aws.found.io 定向到您的127.0.0.1,使用直接IP 连接到您的ssh,然后将curl 连接到真实地址。

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2022-01-22
    • 2018-07-20
    • 2017-02-01
    • 2017-12-18
    • 1970-01-01
    • 2011-06-30
    • 2011-12-14
    相关资源
    最近更新 更多