在处理EC2时无法进行ping测试的故事

首先 ,

本文是 Elastic Stack 圣诞月历的第20天的文章。
虽然我是 Elasticsearch 的初学者,但由于空余时间,我决定投稿。

首先,我先道个歉。
起初,我原计划撰写一篇关于Elasticsearch的故障排除文章,
但在修改过程中,发现与Elasticsearch的关系不够密切,变成了一篇无关的文章。
真的对那些期待有关Elasticsearch的内容的读者们,非常抱歉。
(文章的后半部分还是包括与Elasticsearch相关的内容。)
考虑到在最后时刻放弃发文也可能造成困扰,所以我还是决定发表出来。

本文概述:如何在EC2中进行ping测试。

image.png

发生的问题

以下是具有以下两个要点的 EC2 实例。(AMI 使用 Amazon Linux 2)

image.png
undefined

另外,如果您在实例上运行以下命令来安装 Apache,您还可以在浏览器中访问 Apache 的初始页面。

$ sudo yum -y install httpd
$ sudo systemctl start httpd.service
undefined
image.png
image.png

原因和解决方案

ping使用的不是TCP/IP协议,而是ICMP协议。
因此,要进行ping通信,需要在EC2安全组设置中允许ICMP协议。
请注意,HTTP、SSH、POP3、FTP等常见协议都是基于TCP/IP协议,所以曾以为只要打开TCP端口就可以了。

image.png
image.png

補充:有关Elasticsearch故障排除的讨论

「虽然这是 Elastic Stack 的 Advent Calendar,但却不是关于 Elasticsearch 的主题!」可能会被人生气,所以在这篇文章中也会提及导致我撰写这篇文章的 Elasticsearch 故障。这是一个相当初学者级的设置错误。

发生的问题的内容

我个人进行学习,搭建了一个EC2实例,并在上面安装了Apache和Elasticseach。
在安全组中,我已经打开了HTTP(80)和Elasticsearch(9200、9300)的端口,
但从本地PC上只能通过HTTP请求,无法使用Elasticsearch的API(无法访问Elasticsearch的API)。

我所期望的事情

从本地电脑使用Elasticsearch的REST API发送搜索查询,并能接收到搜索结果。

$ curl -XGET 'http://<パブリックIPアドレス>:9200/my_index/my_index/1'
{"_index":"my_index","_type":"my_index","_id":"1","_version":2,"_seq_no":1,"_primary_term":1,"found":true,"_source":
{
user_name : "John Smith",
date : "2017-10-15T15:09:45",
message : "Hello Elasticsearch world."
}

实际情况

调用 API 时会出现 Connection refused。

$ curl -XGET 'http://<パブリックIPアドレス>:9200/my_index/my_index/1'
curl: (7) Failed to connect to <パブリックIPアドレス> port 9200: Connection refused

确认一件事情

HTTP访问没有问题的样子(Apache正在运行)→ 安全组设置看起来没有错误。

$ curl <パブリックIPアドレス>:80
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd%22%3E
...(以下略)

※ブラウザからもapacheの画面は表示される。
http://<パブリックIPアドレス>/

确认的事情2

哇!为什么无法 Ping 通?那为什么 HTTP 可以通呢?


$ ping <パブリックIPアドレス>
Request timeout for icmp_seq 0
...(以下略)

确认事项3

本地电脑的防火墙设置已更改为开放状态,但没有变化。

确认了四件事

从实例的shell上已经确认Elasticsearch服务已启动。

$ sudo lsof -i -n -P
java     3203 elasticsearch  189u  IPv6  21148      0t0  TCP [::1]:9300 (LISTEN)
java     3203 elasticsearch  190u  IPv6  21155      0t0  TCP 127.0.0.1:9300 (LISTEN)
java     3203 elasticsearch  191u  IPv6  21196      0t0  TCP 127.0.0.1:9200 (LISTEN)
java     3203 elasticsearch  198u  IPv6  21195      0t0  TCP [::1]:9200 (LISTEN)

确认了五件事。 le wǔ shì)

在实例上调用 Elasticsearch 的 API时,期望的响应能够正常显示。
→仅限于本地PC无法调用API。

原因和解决方法

我最初认为上述问题是由于 EC2 配置错误导致的。
但是经过一段时间的调查,我发现这个问题是由两个问题的结合导致的。

ICMP 不通的点

正如本文所述,就像 ICMP 协议一样,它已经被安全组配置屏蔽了。

无法从本地机器调用Elasticsearch API

根据上述文档,Elasticsearch默认关闭了来自互联网的API访问。通过修改network.host参数,可以实现通过互联网进行访问。

通过以下命令操作和编辑yml文件,使得可以在本地电脑上从API中操作实例。

$ sudo systemctl stop elasticsearch.service
$ sudo vim /etc/elasticsearch/elasticsearch.yml
 ここで、network.host: 0.0.0.0 に変更
$ sudo systemctl start elasticsearch.service

以下是对以上文本的中文翻译:

对于 Elasticsearch 专家来说,这可能是再基础不过的设置,但对于初学者的我来说,这是一个相当困扰的问题。(整个星期天都花在解决这个问题上了)
希望对其他学习者有所帮助,我将把解决方法留在这里作为备忘录。
我深刻意识到自己需要更加熟练地进行故障排除…我会努力的。

注意事项

    本記事では、EC2のセキュリティーグループやnetwork.hostのソースを0.0.0.0/0で設定していますが、 実際には適切な IP 制限をかけてセキュリティーを担保しましょう。
广告
将在 10 秒后关闭
bannerAds