Network config for cluster behind proxy - clarifying documentation

I just spent an hour going down the wrong rabbit hole because of some misleading documentation, so I thought I'd post this here in hopes of helping others.

If you have multiple nodes, and you're trying to put your cluster behind a proxy, these are probably the network settings you want:

network.host: _local_
transport.host: _eth0_   #or wherever all the nodes can see each other

This will give you the desired effect of having 9200/9300 only accessible from localhost while still allowing nodes to find and talk to each other.

The docs led me to believe that network.bind_host and network.publish_host were the way to accomplish this. The docs state: "The network.host setting explained in Commonly used network settings is a shortcut which sets the bind host and the publish host at the same time. In advanced used cases, such as when running behind a proxy server, you may need to set these settings to different values"

The reality is that Elasticsearch will only bind to the interfaces set in network.bind_host no matter what you set network.publish_host to. I was trying a bind_host of local and publish_host of eth0, but I could see that ES was still only listening on the local interface.

I hope this saves someone some time someday. In my Googling, I found others confused about the same issue but no great explanation of the right way. Maybe the docs could clarify this. I haven't figured out the use case where splitting bind_host and publish_host is useful, but apparently not for a typical proxy setup. :slight_smile: (I could be missing something, if so, someone please set me straight!)

That shouldn't happen. What version are you on?

Version 2.3.2.

But I'm pretty sure that is what should happen, now that I understand the settings better. Clinton Gormley explains it here: https://github.com/elastic/elasticsearch/issues/10015

Ahh ok, that makes sense :slight_smile: