背景
Elasticsearch本身没有认证,有技术支持说用户不想开启认证,认证比较麻烦或者还要花钱,但是又想有一定的保护,所以就问能不能限制IP登录,来保护自己的Elasticsearch。
调研
network.host
network.bind_host: [“localhostIP1”,“localhostIP2”]
network.publish_host: 0.0.0.0
想使用该参数去控制,结果失望了,网上一堆说可以控制的不是说的不对就是忽悠人的。
下面对着三个参数做一个简单的介绍
network.bind_host: 192.168.0.1
# 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,绑定这台机器的任何一个ip。
network.publish_host: 192.168.0.1
# 设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
network.host: 192.168.0.1
# 这个参数是用来同时设置bind_host和publish_host上面两个参数。
network.host
同时设置 network.bind_host network.publish_host参数的,如
network.host: 192.168.0.1
等同于
network.bind_host: 192.168.0.1
network.publish_host: 192.168.0.1
network.publish_host这个地址是发布地址,是各个ES结点数据交互的结点,这个结点在ES集群的时候需要好好设置。
network.bind_host
这个是服务的绑定IP,里面的IP必须是当前设备上的IP否则不能正常启动ES,该参数用在多网卡的设备,比如设备有两个网卡一个内网ip,一个外网ip,需要内外网IP都能访问到服务就需要在这里配置多个IP
做了相关的测试如下
network.bind_host: ["172.22.57.in1","172.22.57.out1"]
network.publish_host: 0.0.0.0
#network.host: 0.0.0.0
开启es远程访问 network.host: 0.0.0.0 即可
开启内外网访问 network.bind_host: [“172.22.57.in1”,“172.22.57.out1”] ,可以在内网用172.22.57.in1,外网用172.22.57.out1。
结论
依靠network.host,network.bind_host,network.publish_host这三个参数不能进行限制ES的访问IP
解决办法
方法一 xpack(收费)
可以通过xpack控制黑白名单,但是开启xpack 限制ip访问的需求就不强了,没必要限制IP
主要参数
#http
xpack.security.http.filter.allow: "192.168.0.4"
xpack.security.http.filter.deny: "192.168.0.0/24"
#transport
xpack.security.transport.filter.allow: "192.168.0.1"
xpack.security.transport.filter.deny: "192.168.0.0/24"
方法二 iptable
如果熟悉iptable可以自己随意控制。
First, you need to set which IP’s that can reach the computer
iptables -I INPUT 1 -p tcp --dport 9200:9400 -s IP_ADRRESS_1,IP_ADRRESS_2,IP_ADRRESS_3 -j ACCEPT
Then, you need to restrict any ip except specified ones can reach your ports.
iptables -I INPUT 4 -p tcp --dport 9200:9400 -j REJECT
Finally save your settings to a file.
sudo sh -c "iptables-save > /etc/iptables.rules"
参考文档详情
https://stackoverflow.com/questions/21696667/elasticsearch-restrict-access-using-ip-tables