AWS的EC2之间ping不通,服务之间不通,怎么办

2023-12-26 17:27:18

问题背景描述

我的nginx部署在一台EC2上,我重新申请了一台EC2的实例来部署应用(假定Nginx所在的服务器的内网IP为172.16.100.1,新申请的应用服务器的内网IP为172.16.100.2),当我在新申请的实例机器上部署好我的应用后,然后也在nginx里面配置好了nginx的接口的转发,当我重启nginx后,发现接口请求不通

问题解决过程

遇到这种很难的问题一般我都会先问我的助理,我们之间的聊天记录大概是这样的:

问:AWS 上面有两个EC2的实例,这两台实例在同一个区域.但是这两个实例之间互相ping不通,为什么?

答:在 AWS 上,如果两个 EC2 实例在同一个区域,但是它们之间互相 ping 不通,可能有多种原因。以下是一些可能导致这种情况的常见原因:

  1. 安全组配置问题: 每个 EC2 实例都关联一个或多个安全组,安全组是一种虚拟防火墙,控制流入和流出实例的流量。确保你的安全组规则允许 ICMP(ping)流量。你需要在安全组配置中添加允许 ICMP 流量的入站规则。
  2. 网络访问控制列表(Network ACLs)配置问题: 网络 ACLs 是一个在子网级别操作的防火墙,它可以控制进出子网的流量。确保你的网络 ACLs 允许 ICMP 流量通过。需要检查与你的子网相关联的网络 ACLs。
  3. 路由表配置问题:确保两个 EC2 实例所在的子网具有正确的路由配置,以确保它们可以相互访问。特别是,如果你的 EC2 实例要访问 Internet,确保有一个正确配置的 Internet 网关或 NAT 网关。
  4. 操作系统防火墙设置: 在 EC2 实例上运行的操作系统可能有自己的防火墙设置。确保操作系统的防火墙允许 ICMP 流量。例如,在 Linux 上,你需要检查 iptables 或 firewalld 的设置。
  5. 实例状态检查: 确保两个实例都处于运行状态。如果其中一个实例处于停止状态,它可能无法响应 ping 请求。
  6. 私有 IP 地址冲突: 如果两个实例具有相同的私有 IP 地址,它们之间的通信可能会受到影响。确保每个实例都有唯一的私有 IP 地址。

根据以上可能的原因,猜测大概率是因为第一个原因,于是接着顺藤摸瓜去排查:

问:对于第一个原因安全组配置问题,我该如何在安全组配置中添加允许 ICMP 流量的入站规则?

答:在 AWS 安全组中添加允许 ICMP 流量的入站规则可以通过以下步骤完成:

  1. 登录 AWS 控制台: 打开浏览器,访问 AWS 控制台(https://aws.amazon.com/console/),并使用你的 AWS 账户登录。
  2. 导航至 EC2 控制台: 在 AWS 控制台中,找到 “服务” 菜单,选择 “计算” 下的 “EC2”。
  3. 选择安全组: 在 EC2 控制台左侧导航栏中选择 “安全组”。
  4. 选择要修改的安全组: 在安全组页面,选择你想要修改的安全组。
  5. 编辑入站规则: 在安全组详细信息页面中,选择 “入站” 选项卡。这里列出了当前安全组的入站规则。
  6. 添加 ICMP 规则: 点击 “编辑入站规则” 按钮,然后点击 “添加规则”。
  7. 配置 ICMP 规则: 在规则配置中,选择 “协议” 为 “ICMP”,选择 “来源” 为 “自定义”,然后在 “来源 IP” 中输入要允许的来源 IP 地址范围,或者选择 “0.0.0.0/0” 允许所有来源 IP。确定设置后,点击 “保存规则”。
  8. 确认规则设置: 返回到入站规则页面,确认刚刚添加的 ICMP 规则已经生效。确保规则的状态是 “允许”。
  9. 保存修改: 一切设置完成后,点击 “保存规则” 以保存对安全组的修改。
    他还提示我:这样,你已经成功在安全组中添加了允许 ICMP 流量的入站规则。请注意,对于生产环境,应谨慎添加规则,确保只允许必要的流量进入。

我想对于他的回答,我是比较认可的,我猜测,通过它的提示,可以解决我的问题(未验证)。但是我的应用场景是什么样的,我想我应该详细的告诉他,这样,他也能更好的回答我 。于是我又继续问他:

问:我想在服务器上的nginx中配置可以访问另外一台服务器的8081端口,我还需要添加什么规则吗?

答:如果你想在 Nginx 服务器上配置以访问另一台服务器的 8081 端口,你需要确保以下几个方面:

  1. 安全组规则: 在 AWS 或其他云服务提供商的安全组中,确保允许从 Nginx 服务器发起的流量访问另一台服务器的 8081 端口。在安全组中添加出站规则,允许流量到达目标服务器的 8081 端口。
  2. 防火墙规则: 如果在服务器上启用了防火墙,确保在 Nginx 服务器上允许流量访问目标服务器的 8081 端口。你可能需要调整防火墙规则,以确保允许所需的出站流量。
  3. Nginx 配置: 在 Nginx 的配置文件中,确保你有一个正确的代理配置,将请求转发到目标服务器的 8081 端口。以下是一个简单的 Nginx 配置示例:
server {
    listen 80;

    location / {
        proxy_pass http://目标服务器的IP地址:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

  1. 替换 目标服务器的IP地址 为你要访问的服务器的实际 IP 地址。这个配置将会接收到来自客户端的 HTTP 请求,并将其代理到目标服务器的 8081 端口上。

确保以上几点都正确配置,这样就能够在 Nginx 服务器上成功访问另一台服务器的 8081 端口了。如果你使用的是云服务提供商,也要记得检查云服务提供商的网络配置,确保允许这些流量通过。
他太贴心了,还把nginx的配置实例都发给我了。

根据他告诉我的这几条,我依然是选择了第一条,于是我又继续问他:

问:出站规则怎么配置?

答:在 AWS 的安全组中配置出站规则的步骤如下:

  1. 登录 AWS 控制台: 打开浏览器,访问 AWS 控制台,并使用你的 AWS 账户登录。
  2. 导航至 EC2 控制台: 在 AWS 控制台中,选择 “服务” 菜单,然后选择 “计算” 下的 “EC2”。
  3. 选择安全组: 在 EC2 控制台左侧导航栏中选择 “安全组”。
  4. 选择要修改的安全组: 在安全组页面,选择你想要修改的安全组。
  5. 编辑出站规则: 在安全组详细信息页面中,选择 “出站” 选项卡。这里列出了当前安全组的出站规则。
  6. 添加规则: 点击 “添加规则”。
  7. 配置规则: 在规则配置中,选择允许的流量类型(协议),输入目标 IP 地址和端口范围。例如,如果你要允许 HTTP 流量,选择协议为 HTTP(TCP 80),目标 IP 地址可以是目标服务器的 IP 地址,端口可以是 8081。
  8. 确认规则设置: 确认规则设置无误后,点击 “保存规则”。
  9. 保存修改: 一切设置完成后,点击 “保存规则” 以保存对安全组的修改。
    请注意,配置出站规则时,你要确保只开放必要的流量,以降低系统面临的风险。例如,如果你只需要通过 HTTP 访问另一台服务器的 8081 端口,那么只需要配置允许 HTTP 流量(TCP 80)到目标服务器即可。
    在这个过程中,确保了安全组的配置,从而允许了 Nginx 服务器发起的流量访问另一台服务器的 8081 端口。

那么配置了出站规则还需要配置入站规则吗?于是我问他:

问:我在另外一台服务器中还需要添加8081端口的入站规则吗?

答:是的,如果你希望另一台服务器能够接收来自 Nginx 服务器的流量,你需要在目标服务器的安全组中添加入站规则,以允许 Nginx 服务器发起的流量进入目标服务器的 8081 端口。

在目标服务器上,按照以下步骤添加入站规则(跟出站规则类似):

  1. 登录 AWS 控制台: 打开浏览器,访问 AWS 控制台,并使用目标服务器所在的 AWS 账户登录。
  2. 导航至 EC2 控制台: 在 AWS 控制台中,选择 “服务” 菜单,然后选择 “计算” 下的 “EC2”。
  3. 选择安全组: 在 EC2 控制台左侧导航栏中选择 “安全组”。
  4. 选择目标服务器的安全组: 在安全组页面,找到目标服务器所使用的安全组,并选择它。
  5. 编辑入站规则: 在目标服务器的安全组详细信息页面中,选择 “入站” 选项卡。这里列出了当前安全组的入站规则。
  6. 添加规则: 点击 “添加规则”。
  7. 配置规则: 在规则配置中,选择允许的流量类型(协议),输入源 IP 地址范围(可以是 Nginx 服务器的 IP 地址),并设置目标端口为 8081。
  8. 确认规则设置: 确认规则设置无误后,点击 “保存规则”。
  9. 保存修改: 一切设置完成后,点击 “保存规则” 以保存对安全组的修改。
    通过这个步骤,你允许了来自 Nginx 服务器的流量访问目标服务器的 8081 端口。这样,Nginx 服务器就能够成功连接到目标服务器的 8081 端口了。

于是我去查看了我服务器所用的安全组,我发现两台服务器用的是同一个安全组,我想,**同一个安全组也需要入站规则和出站规则都去配置吗?**于是我又继续问他 :

问:如果我的Nignx服务器和应用服务器用的是同一个安全组,我需要在该安全组下都去配置入站和出站规则吗?

答:如果你的 Nginx 服务器和应用服务器使用同一个安全组,你只需要在该安全组中配置一次规则。安全组的规则是双向的,因此在同一个安全组内设置的规则同时适用于入站和出站流量

在这种情况下,只需确保在该安全组中设置允许 Nginx 服务器发起的流量访问应用服务器的 8081 端口的规则。这样,Nginx 服务器就可以成功连接到应用服务器的 8081 端口。
步骤如下:

  1. 登录 AWS 控制台。
  2. 导航至 EC2 控制台。
  3. 选择 “安全组”,找到你的安全组。
  4. 在该安全组的详细信息页面中,选择 “入站” 选项卡。
  5. 添加一条规则,选择允许的流量类型(协议),输入源 IP 地址范围(可以是 Nginx 服务器的 IP 地址),并设置目标端口为 8081。
  6. 保存规则。
    这样配置后,安全组的规则会同时应用于 Nginx 服务器发起的流量和应用服务器响应的流量,无需在应用服务器的安全组中再次配置规则。

看见他告诉我的答案,我比较兴奋,因为只用配置一个规则就可以了,他只告诉我选择允许的流量类型(协议),并没有说选择哪个,于是我又问他:

问:选择允许的流量类型(协议),这个协议我需要选择哪一个?

答:如果你的目标是通过 Nginx 服务器与应用服务器之间建立 HTTP 连接,你需要选择 “HTTP(80)” 或 “HTTPS(443)” 作为协议,具体选择哪一个取决于你的应用服务器上监听的端口。通常来说,HTTP 使用端口 80,而 HTTPS 使用端口 443。

在 AWS 安全组规则中,你可以选择协议的方式是选择 “HTTP(80)” 或 “HTTPS(443)”,而不是直接选择协议的通用名称(如 TCP 或 UDP)。

如果你的应用服务器监听的端口是 8081,并且你希望通过 Nginx 服务器访问该端口,你应该选择 “自定义 TCP 规则”,并将端口设置为 8081。如果你的应用服务器运行的是 HTTP 服务,端口为 80,那么你可以选择 “HTTP(80)”。

总之,选择合适的协议和端口,以确保你的流量能够在 Nginx 和应用服务器之间正确传递。

于是我就开始配置起来,在配置过程中,为了安全起见,我只想配置来源IP为我的Nginx的IP:172.16.100.1。但是在我输入完这个IP后,它提示我:必须指定 CIDR 数据块、安全组 ID 或前缀列表。于是,我又问他:

问:我输入固定IP地址后,提示我必须指定 CIDR 数据块、安全组 ID 或前缀列表。

答:
如果 AWS 安全组中要指定特定的单个 IP 地址,你可以使用 CIDR(Classless Inter-Domain Routing)表示法,并将子网掩码设置为 32。CIDR 表示法中的 /32 表示单个 IP 地址。

在 AWS 安全组规则中,你可以按照以下方式输入特定的单个 IP 地址:

在来源 IP 中输入: 172.16.100.1/32
这表示允许来自单个 IP 地址 172.16.100.1 的流量通过。CIDR 表示法的 /32 意味着只有这个特定的 IP 地址是允许的。

确保在安全组规则中按照正确的格式输入特定 IP 地址,并保存规则。如果还有其他规则,确保它们的设置也是正确的。、

通过以上配置,我再次在Nginx服务器上执行telnet 172.16.100.2 8081发现已经ok,通了,问题解决了。
最后总结一下,就是配置入站规则。感谢我的助理,他帮了我的大忙~

文章来源:https://blog.csdn.net/iamlihongwei/article/details/135202806
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。