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

问题背景描述

我的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 配置示例:
shell 复制代码
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,通了,问题解决了。

最后总结一下,就是配置入站规则。感谢我的助理,他帮了我的大忙~

相关推荐
fanxiaohui1213813 分钟前
元脑服务器的创新应用:浪潮信息引领AI计算新时代
运维·服务器·人工智能
Elastic 中国社区官方博客1 小时前
使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack
大数据·linux·服务器·elasticsearch·搜索引擎·信息可视化·debian
pyliumy5 小时前
在基于Arm架构的华为鲲鹏服务器上,针对openEuler 20.03 LTS操作系统, 安装Ansible 和MySQL
服务器·架构·ansible
努力学习的小廉5 小时前
深入了解Linux —— 调试程序
linux·运维·服务器
只做开心事6 小时前
Linux网络之数据链路层协议
linux·服务器·网络
AI学IT6 小时前
(安全防御)旁挂组网双机热备负载分担实验
运维·服务器·网络
已是上好佳7 小时前
介绍一下Qt中的事件过滤
java·服务器·数据库
code monkey.7 小时前
【寻找Linux的奥秘】第一章:基础指令
linux·运维·服务器
罗技1238 小时前
Easysearch 使用 AWS S3 进行快照备份与还原:完整指南及常见错误排查
linux·云计算·aws·es·easysearch
AWS官方合作商8 小时前
AWS AppStream 2.0:开启云端应用交付新范式(实战解决方案剖析)
系统架构·云计算·aws