AWS 区域流量:追踪其来源

AWS 区域流量:追踪其来源

我开始在 AWS EC2 上使用集群中的多台机器。自从我开始这个项目以来,我看到了区域交通在我的账单信息中:

区域数据传输 - 进入/离开/在 EC2 AZ 之间或使用弹性 IP 或 ELB

根据名称,有三种可能性:

  • 不同的可用区域
  • 使用弹性 IP 进行通信
  • 使用弹性响度平衡器

我的机器有不同的可用区,这是一个问题。所以我解决了这个问题,现在所有机器都在同一个可用区,但成本已经上涨了 24 小时(在此期间有 3 次更新)。所以看来,将所有机器设置为同一个可用区并没有解决问题。

但是,我既不使用 Elastic IP,也不使用 ELB。当我在我的 Web 门户上访问这些页面时,它只显示一个空列表,并显示一条消息,提示我目前没有任何组件。

在另一个serverfault 问题我们还读到,当使用公共 IP 地址进行通信时,也会发生这种情况,但一些 Github 讨论我们可以看到,即使公共 DNS 名称也会在内部解析为内部 IP(但是,公共 IP 始终会通过外部网络,因此实际上会产生成本)。

如果我使用以下方式跟踪集群中主服务器和某个从服务器之间的网络通信

sudo tcpdump -i eth0 | grep -v $MY_HOSTNAME

我只能看到这样的内部流量:

IP ip-172-31-48-176.ec2.internal.56372 > ip-172-31-51-15.ec2.internal.54768

所以我的问题是:我如何找出哪个组件导致了这种区域流量?

答案1

总结

区域流量巨大,是由于apt-get update机器突然启动造成的。

起初我怀疑我在集群上运行的软件,因为它会发送大量 DNS 请求 - 可能它不使用任何 DNS 缓存。而且 DNS 服务器位于另一个可用区。

调试此类内容的完整方法

我和朋友一起调试了这个问题,下面是我们得出解决方案的方法,以便遇到此问题的每个人都可以遵循:

首先,从账单管理中,您可以看到费用为每 GB 0.01 美元。因此,它反映了定价网页上的以下几点(其中更详细):

  • 同一可用区中的 Amazon EC2、Amazon RDS、Amazon Redshift 和 Amazon ElastiCache 实例或弹性网络接口
    • 使用公有或弹性 IP 地址
  • 同一 AWS 区域内其他可用区或对等 VPC 中的 Amazon EC2、Amazon RDS、Amazon Redshift 和 Amazon ElastiCache 实例或弹性网络接口

接下来我查看了 AWS 上的关于可用区域和地区我必须支付的费用肯定是来自同一区域的流量(us-east-1就我而言)。它可以是从一个可用区到另一个可用区的流量(我们之前就知道了),也可以是使用同一可用区内的公共 IP 地址或弹性 IP 地址的流量(我们也知道来自另一个 serverfault 问题)不过,现在看来,这份名单确实是详尽无遗的。

我知道我有:

  • 集群中的 6 台 EC2 机器
  • 无 RDS
  • 无红移
  • 没有 ElastiCache
  • 没有弹性 IP 地址

对等 VPC

VPC 是自有产品,因此请访问私有云平台。从那里,您可以看到您有多少个 VPC。在我的情况下,只有一个,因此根本无法进行对等连接。但您仍然可以访问对等连接并查看那里是否设置了任何东西。

子网

来自子网在 VPC 部分中,我们还发现了一些对进一步调试很重要的线索。不同可用区的 IP 范围us-east-1

  • 172.31.0.0/20为了us-east-1a
  • 172.31.16.0/20为了us-east-1b
  • 172.31.32.0/20为了us-east-1e
  • 172.31.48.0/20为了us-east-1d

由于我的所有机器都应该位于 中us-east-1d,因此我验证了这一点。确实,它们的 IP 都以172.31.48172.31.51和开头172.31.54。到目前为止一切顺利。

tcpdump

这最终帮助我们为 tcpdump 设置了正确的过滤器。现在知道我应该与哪些 IP 进行通信以避免成本(172.31.48.0/20仅限网络),我们为 设置了一个过滤器tcpdump。这有助于消除所有让我看不到外部通信的噪音。此外,之前我甚至不知道与 的通信[something].ec2.internal可能是问题所在,因为我对区域、AZ 及其各自的 IP 范围了解不够。

首先我们想出了这个 tcpdump 过滤器:

tcpdump "not src net 172.31.48.0 mask 255.255.240.0" -i eth0

这应该显示来自除 之外的所有地方的所有流量us-east-1d。它显示来自我的 SSH 连接的大量流量,但我看到一个奇怪的东西飞过 - 一个ec2.internal地址。难道它们不应该全部被过滤掉吗,因为我们不再显示 AZ 内部流量了?

IP ip-172-31-0-2.ec2.internal.domain > ip-172-31-51-15.ec2.internal.60851

但这不是内部的!它来自另一个 AZ,即us-east-1a。这是来自 DNS 系统。

我扩展了过滤器来检查有多少条这样的消息出现:

sudo tcpdump "not src net 172.31.48.0 mask 255.255.240.0 and not src host $MY_HOSTNAME" -i eth0

我等了 10 秒,停止了记录,发现有 16 个来自 DNS 的响应!

接下来的几天,仍然是同样的问题

但是安装 dnsmasq 后什么都没有改变。当我使用集群时,仍然有几 GB 的流量。

我每天从集群中删除越来越多的任务,最终有一天尝试不使用任何启动脚本(很好!),有一天只使用启动脚本+立即关机(流量!)。

对启动脚本的分析显示,apt-get updateapt-get install ...是唯一一个拉取大文件的组件。通过 Google 研究,我了解到 Ubuntu 确实在 AWS 内部有一个软件包存储库。这也可以从以下位置看到sources.list

http://us-east-1.ec2.archive.ubuntu.com/ubuntu/

解析主机名将得到以下 IP 地址:

us-east-1.ec2.archive.ubuntu.com.   30  IN  A   54.87.136.115
us-east-1.ec2.archive.ubuntu.com.   30  IN  A   54.205.195.154
us-east-1.ec2.archive.ubuntu.com.   30  IN  A   54.198.110.211
us-east-1.ec2.archive.ubuntu.com.   30  IN  A   54.144.108.75

因此,我设置了一个 Log Flow 服务并在启动时记录集群。然后,我下载了日志文件并通过 Python 脚本运行它们,以汇总传输到这 4 个 IP 地址中的任何一个的所有字节。结果与我的流量相匹配。在上次测试中,我有 1.5 GB 的流量,有 3 个集群,每个集群有 5 台机器,根据我的 Log Flow 日志,每台机器从 Ubuntu 存储库查询大约 100 MB。

相关内容