Elastic Search 仅在 IPv6 上监听

Elastic Search 仅在 IPv6 上监听

我已经在 CentOS 7.2 上安装了 Elastic Search 1.7.4,方法如下:

wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.4.noarch.rpm
sudo rpm -ivh elasticsearch-1.7.4.noarch.rpm

服务已启动并且 ES 可以运行(已通过 curl 验证),但是,它仅使用默认配置监听 IPv6。netstat -na 显示以下内容:

tcp6       0      0 :::9200                 :::*                    LISTEN     
tcp6       0      0 :::9300                 :::*                    LISTEN 

从其他服务器使用 nmap 我发现端口 9200 和 9300 已被过滤,防火墙已被禁用。

编辑 /etc/elasticsearch/elasticsearch.yml 并设置:

network.bind_host: 0.0.0.0

不会改变任何东西。将其设置为服务器的外部 IPv4 地址确实会在 netstat -na 输出中添加额外的两个条目,但我需要 ES 可供我的本地网络访问,因此这毫无用处,并且 netstat 仍将其注册为 tcp6。

tcp6       0      0 192.168.0.54:9200       :::*                    LISTEN     
tcp6       0      0 192.168.0.54:9300       :::*                    LISTEN

环境:

network.bind_host: _eth0:ipv4_

导致 ES 绑定到本地 IPv4,然后当然只能从本地服务器使用。省略“ipv4”部分会导致 ES 绑定到 NIC 的 IPv6 地址。

如何使 ES 绑定到 IPv4?我没有其他选择,我的网络只有 IPv4,而且我必须使用这个旧版本的 ES,因为我正在运行一些需要此版本的应用程序。

答案1

unix 交換。

发生这种情况的原因是,默认情况下,AF_INET6 套接字实际上适用于 IPv4 和 IPv6。请参阅 RFC 3493 - IPv6 基本套接字接口扩展中的第 3.7 节 - 与 IPv4 节点的兼容性

但正如您所知,firewalld 是开箱即用的。

创建此文件到您的/etc/firewalld/services/elasticsearch.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Elasticsearch</short>
  <description>Elasticsearch is a distributed, open source search and analytics engine, designed for horizontal scalability, reliability, and easy management.</description>
  <port protocol="tcp" port="9300"/>
  <port protocol="tcp" port="9200"/>
</service>

更新权限

chmod 0400 /etc/firewalld/services/elasticsearch.xml
chown root: /etc/firewalld/services/elasticsearch.xml

运行这些命令

firewall-cmd --zone=public --add-service=elasticsearch --permanent
firewall-cmd --reload

答案2

这是 ES 的一个常见陷阱,因为需要设置的网络设置:network.bind_hostAND network.publish_host。因此,ES 开发人员添加了此快捷方式:

network.host: 0.0.0.0

当启用但未配置 IPv6 时,我在 ES 中遇到了一些其他问题,因此您可能需要编辑 sysctl.conf:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

然后去做sysctl -p

答案3

尝试禁用 centos 自带的防火墙

systemctl disable firewalld
systemctl stop firewalld

https://bytefreaks.net/gnulinux/how-to-startstop-or-enabled-firewalld-on-centos-7

我建议在机器前安装专用的硬件防火墙,我不会依赖你正在使用的机器上的软件防火墙。如果攻击者正在攻击机器,那就太晚了。

相关内容