如何确定 public 和私有子网以及 VPC 的 CIDR 块?

How do I decide the CIDR blocks for public and private subnets and VPC?

我想在 AWS 中创建一个具有私有子网和 public 子网的 VPC。我正在使用 Terraform。

这是我目前的情况:

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16" # <---

  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "Main"
  }
}

resource "aws_subnet" "public" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.0.0/20" # <---

  tags = {
    Name = "Public"
  }
}

resource "aws_subnet" "private" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.16.0/20" # <---

  tags = {
    Name = "Private"
  }
}

我遇到的问题是我不知道如何选择合适的 CIDR 块(3 个来决定)。

如何确定要使用的 CIDR 块?


有效组合可能是:

首先,您所做的没有任何问题,每个 /20 子网都拥有 /16 VPC 中可用 IP 的一半(每个 4096 减去 5 个 AWS 保留 IP)。

就你如何决定而言,这是一个经典的网络设计问题,已经存在了几十年。在 Internet 上搜索“IP 地址范围设计最佳实践”将搜索到几篇可能有帮助的文章。

然后专门针对 AWS 云提出几点建议:

  • /16 和 /20 是相当大的子网,除非您真的希望使用那么多 IP,否则我很想将它们变小;如有必要,您可以稍后将第二个 CIDR 添加到 VPC:link.
  • 当涉及到多个 VPC 环境时,如果您想对等 VPC,以便它们可以将流量路由到彼此,那么它们不能有重叠的 CIDR;因此,这是不使 VPC CIDR 大于所需大小的另一个原因,这样您就不会 运行 通过具有大量未使用的 CIDR 的 VPC 来使用 IP。
  • 如果您的本地资源和 AWS 资源属于同一网络的混合云环境,则不重叠 IP 地址点也适用。
  • 我的一个小技巧是使用 10.0.0.0/8 用于生产 VPC,172.16.0.0/12 用于测试,192.168.0.0/16 用于开发。这有助于我记住我正在处理的环境。