network.hostでの特定IPアドレスの指定

いつもお世話になっております。

これまで同一ネットワーク内でelasticsearchへデータを投入し、kibanaを外部に公開する形で運用してきました。
それが、一部データの投入を外部からも行える様にしたいとの要望があり、elasticsearch.ymlに該当IPv4アドレスを追加したのですが、エラーが発生してしまいます。
色々試したのですが、同一ネットワーク内のIPアドレスを指定しても、同様のエラーとなることが分かりました。
ポートが設定できない、というエラーの様なので、ポートの使用状況を確認いたしましたが、9000番台は特に使用しておりませんでした。
どのような設定を行えば、特定IPアドレスからの接続を受けられるようになるのでしょうか。
お手数をおかけして申し訳ありませんが、ご指導ご鞭撻のほどよろしくお願いいたします。

■elasticsearchバージョン: 5.2.2

■これまでのelasticsearch.yml

network.host: ["_site_", "_local_"]

■新しく設定したelasticsearch.yml

network.host: ["_site_", "_local_", "1.2.3.4"]

■新しく設定したelasticsearch.yml(同一ネットワーク内)

network.host: ["_site_", "_local_", "192.168.1.2"]

■エラーログ

[2017-06-11T20:11:23,321][INFO ][o.e.n.Node               ] [TsLQexF] starting ...
[2017-06-11T20:11:23,925][ERROR][o.e.b.Bootstrap          ] [TsLQexF] Exception
org.elasticsearch.transport.BindTransportException: Failed to bind to [9300-9400]
        at org.elasticsearch.transport.TcpTransport.bindToPort(TcpTransport.java:729) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.transport.TcpTransport.bindServer(TcpTransport.java:694) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.transport.netty4.Netty4Transport.doStart(Netty4Transport.java:183) ~[?:?]
        at org.elasticsearch.common.component.AbstractLifecycleComponent.start(AbstractLifecycleComponent.java:69) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.transport.TransportService.doStart(TransportService.java:202) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.common.component.AbstractLifecycleComponent.start(AbstractLifecycleComponent.java:69) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.node.Node.start(Node.java:589) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Bootstrap.start(Bootstrap.java:261) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:335) [elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121) [elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) [elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.cli.SettingCommand.execute(SettingCommand.java:54) [elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:122) [elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.cli.Command.main(Command.java:88) [elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:89) [elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:82) [elasticsearch-5.2.2.jar:5.2.2]
Caused by: java.net.BindException: 要求アドレスに割り当てられません
        at sun.nio.ch.Net.bind0(Native Method) ~[?:?]
        at sun.nio.ch.Net.bind(Net.java:433) ~[?:?]
        at sun.nio.ch.Net.bind(Net.java:425) ~[?:?]
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) ~[?:?]
        at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:127) ~[?:?]
        at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:554) ~[?:?]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1258) ~[?:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:502) ~[?:?]
        at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:487) ~[?:?]
        at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:980) ~[?:?]
        at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:250) ~[?:?]
        at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:363) ~[?:?]
        at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[?:?]
        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403) ~[?:?]
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:445) ~[?:?]
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) ~[?:?]
        at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_131]
[2017-06-11T20:11:23,947][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: BindTransportException[Failed to bind to [9300-9400]]; nested: BindException[要求アドレスに割り当てられません];
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:125) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.cli.SettingCommand.execute(SettingCommand.java:54) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:122) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.cli.Command.main(Command.java:88) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:89) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:82) ~[elasticsearch-5.2.2.jar:5.2.2]
Caused by: org.elasticsearch.transport.BindTransportException: Failed to bind to [9300-9400]
        at org.elasticsearch.transport.TcpTransport.bindToPort(TcpTransport.java:729) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.transport.TcpTransport.bindServer(TcpTransport.java:694) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.transport.netty4.Netty4Transport.doStart(Netty4Transport.java:183) ~[?:?]
        at org.elasticsearch.common.component.AbstractLifecycleComponent.start(AbstractLifecycleComponent.java:69) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.transport.TransportService.doStart(TransportService.java:202) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.common.component.AbstractLifecycleComponent.start(AbstractLifecycleComponent.java:69) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.node.Node.start(Node.java:589) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Bootstrap.start(Bootstrap.java:261) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:335) ~[elasticsearch-5.2.2.jar:5.2.2]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121) ~[elasticsearch-5.2.2.jar:5.2.2]
        ... 6 more
Caused by: java.net.BindException: 要求アドレスに割り当てられません
        at sun.nio.ch.Net.bind0(Native Method) ~[?:?]
        at sun.nio.ch.Net.bind(Net.java:433) ~[?:?]
        at sun.nio.ch.Net.bind(Net.java:425) ~[?:?]

network.host に記載するのは、ネットワークインターフェースで、IPアドレスでは無かったと思います。

なので、下記コマンドで実行した結果で、miz21358 さんのネットワークインターフェース名を記載すれば良いと思います。

ip addr | grep inet

この結果で、ens33 が表示されて、このネットワークインターフェース名で接続を受け付けたい場合、

network.host: local, ens33

と記載して、systemctl restart elasticsearch.service を実行してみては、いかがでしょうか。

的外れな回答でしたら、すいません。

基本的には設定内容でエラーは起きない認識です。
いくつか確認させてください。

  • 外部というのはインターネットからデータを投入したいということでしょうか
    あるいは、LAN内の別NWセグメントからデータを投入したいということでしょうか
  • 「■新しく設定したelasticsearch.yml」の1.2.3.4というのはグローバルIPでしょうか
  • [site]を使っていれば192.168.1.2を設定する必要はない認識なのですが、何か理由はありますか
  • 環境はAWSやGCPのような、いわゆるIaaSを使っていますか
  • 「■新しく設定したelasticsearch.yml」と「■新しく設定したelasticsearch.yml(同一ネットワーク内)」というのはいくつかElasticsearchサーバが存在していて、問い合わせ元によって設定を変えているという認識で良いでしょうか

kudo様

ご返答いただき、ありがとうございます。

elasticsearchのリファレンスには以下の様に記されています。

network.host
The node will bind to this hostname or IP address and publish (advertise) this host to other nodes in the cluster. Accepts an IP address, hostname, a special value, or an array of any combination of these.

ですので、IPアドレスの指定ができると思っているのですが、間違っていますでしょうか。
LAN外部からでもネットワークインターフェース名での指定が有効なのでしょうか。
試してみます。

st1t様

ご返答いただき、ありがとうございます。

外部というのはインターネットからデータを投入したいということでしょうか
あるいは、LAN内の別NWセグメントからデータを投入したいということでしょうか

説明が不足しており、申し訳ありません。
少し状況は違うのですが、2つの会社にそれぞれのLANがあると思って下さい。
相手の会社のLANに入る事がセキュリティ上できないので、緩衝地帯として、別LAN上に共有サーバを借りました。

LANα                            LANγ      LANβ
├―――――――――――――――――┐                │
↓               ↓                ↓
PC_A            PC_B             PC_C
192.168.11.2   192.168.11.7       1.2.3.4
             ↑
            ELS、Kibanaが入っている

この際にPC_CからPC_Bにcurlなどでアクセスできるようにしたい、というのが本来の要望です。
network.hostにPC_CのIPアドレスを指定すれば可能かと思っていたのですが、もともとこれが無理だったのでしょうか。

「■新しく設定したelasticsearch.yml」の1.2.3.4というのはグローバルIPでしょうか

はい。グローバルIPアドレスです。

[site]を使っていれば192.168.1.2を設定する必要はない認識なのですが、何か理由はありますか

同一ネットワークから特定IPアドレスを指定した場合にもエラーになったため、そのエラーになった設定を記載いたしました。
PC_AからPC_Bには、siteの指定があるため、curlでの操作が可能なのですが、PC_AのIPアドレスを直接指定すると、エラーになってしまいます。

環境はAWSやGCPのような、いわゆるIaaSを使っていますか

正しい返答かどうかは分かりませんが、PC_Cは仮想デスクトップ環境を借りています。
LANα、LANβは、各々の環境があります。

「■新しく設定したelasticsearch.yml」と「■新しく設定したelasticsearch.yml(同一ネットワーク内)」というのはいくつかElasticsearchサーバが存在していて、問い合わせ元によって設定を変えているという認識で良いでしょうか

あ、いえいえ。書き方が紛らわしくてすみません。
両方とも同じelasticsearchサーバの設定ファイルです。
PC_Aからの接続時と、PC_Cからの接続時で何か設定方法が違うのかと思い、両者を列挙したまでです。

なるほどです。

PC_C → PC_B(Elasticsearchサーバ)へアクセスさせるのであれば、
PC_Cから接続できるIPアドレスをPC_Bに設定してあげる必要があります。
恐らく社外の方とやりとりされるということであれば、専用線を引いてない限りはインターネット越しのアクセスとなるため、PC_BにグローバルIPを持たせて、それをnetwork.hostに設定してあげればつながるかと思います。

イメージ的には以下のようになるかと思います。

前提条件

  • PC_CからPC_Bへ接続可能なIPがPC_Bに設定されていること

PC_Bのelasticsearch.yml 設定

network.host: ["_local_","_site_","PC_Bで設定されているグローバルIP"]

その他

グローバルIPでPC_Bを接続可能な環境にするのであれば、
FWやiptablesを設定してアクセス元を制御+リバースプロキシを置くなどして通信経路を暗号化しないと不正アクセスされると思ったほうが良いかと思います。
今年の1月くらいにランサムウェアがかなり流行ってました。

自己責任の範囲で上記方法で不正アクセスの対策はある程度出来ますが、
Elastic以外の脆弱性対応や、設定のサポートは出来ないので過去に経験がなければ一度Elasticの営業さんへご相談されることをお勧めします。

1ヶ月程度の期間限定でアクセス許可をするならElastic Cloudを使うか、
アクセス元のIP制御 + X-Packの試用ライセンスを使ってみるのが良いかと思います。

ライセンスに応じた機能一覧は以下を参考ください。
Elastic Subscriptions

st1t様

ご回答ありがとうございます。
外からアクセスする場合、PC_BのグローバルIPアドレスの指定が必要なんですね。
セキュリティ上のアドバイスもありがとうございます。
とても不安に感じていたところでしたので、大変勉強になりました。

結局、紆余曲折の末、FWとリバースプロキシを通して、
PC_CからPC_Bへのcurl接続ができるようになりました。
この結果、elasticsearch.ymlの設定そのものにIPアドレスの指定は不要になりました。

とりあえず試用段階ですので、今後試用ライセンスの適用も視野に入れたいと思います。
いったんこの議題は解決済みとさせていただきます。

この度は本当にありがとうございました。
今後ともどうぞよろしくお願いいたします。
失礼いたします。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.