[Terraform] 03 - VPC + NAT
结构目标
网络搭建设计图如下。
Ref: [AWS] 扫盲,AWS的网络组件介绍 [基本概念介绍,赞比较多]
一、CIDR
CIDR 参考:CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)
-
子网划分
IP地址 ::= {<网络号>, <子网号>, <主机号>}
-
CIDR概述及其地址块计算
IP地址 ::= {<网络前缀>, <主机号>} / 网络前缀所占位数
128.14.35.7/20 = 10000000 00001110 00100011 00000111
我们通过令主机号分别为全0和全1就可以得到一个CIDR地址块的最小地址和最大地址。
最小地址是:128.14.32.0 = 10000000 00001110 00100000 00000000 最大地址是:128.14.47.255 = 10000000 00001110 00101111 11111111 子网掩码是:255.255.240.0 = 11111111 11111111 11110000 00000000
二、NAT (Network Address Translation)
利用 Address:port 来定位一台主机。
-
NAT 网关(NAT Gateway)
一种支持 IP 地址转换服务,提供 SNAT 和 DNAT 能力,可为私有网络(VPC)内的资源提供安全、高性能的 Internet 访问服务。
我需要一个具备双向通信的能力,也就是同时具备:SNAT and DNAT。
Goto: [AWS] NAT Gateway & Security Group
代码分析
一、公网 VPC
资源: https://www.terraform.io/docs/configuration/resources.html
Ref: 经典网络还是VPC,开发者作何选择?
-
VPC 特点
经典网络:公有云上所有用户共享公共网络资源池,用户之间未做逻辑隔离。用户的内网IP由系统统一分配,相同的内网IP无法分配给不同用户。
VPC:是在公有云上为用户建立一块逻辑隔离的虚拟网络空间。在VPC内,用户可以自由定义网段划分、IP地址和路由策略,安全可提供网络ACL及安全组的访问控制,因此,VPC有更高的灵活性和安全性。
# Internet VPC resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" instance_tenancy = "default" enable_dns_support = "true" enable_dns_hostnames = "true" enable_classiclink = "false" tags = { Name = "main" } }
-
创建子网
map_public_ip_on_launch
- true: 这是我在可用区
ap-south-1a
创建的公共子网。 我已将map_public_ip_on_launch
的值设置为true
以便在该子网中启动实例时,map_public_ip_on_launch
一个Public IP与之关联 。 使用此IP,客户端将能够访问实例以查看网页。 - false: 在此子网中,我将启动MySQL数据库,并且我不希望任何人都可以进入我的数据库并破坏数据。 这样做是为了将MySQL数据库保留在私有世界中。
Ref: 带有公有和私有子网的 VPC (NAT) 【官方参考】
Ref: AWS-创建具有公有子网和私有子网的VPC 【配置过程】
# Subnets resource "aws_subnet" "main-public-1" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" map_public_ip_on_launch = "true" availability_zone = "eu-west-1a" tags = { Name = "main-public-1" } } resource "aws_subnet" "main-public-2" { vpc_id = aws_vpc.main.id cidr_block = "10.0.2.0/24" map_public_ip_on_launch = "true" availability_zone = "eu-west-1b" tags = { Name = "main-public-2" } } resource "aws_subnet" "main-private-1" { vpc_id = aws_vpc.main.id cidr_block = "10.0.4.0/24" map_public_ip_on_launch = "false" availability_zone = "eu-west-1a" tags = { Name = "main-private-1" } } resource "aws_subnet" "main-private-2" { vpc_id = aws_vpc.main.id cidr_block = "10.0.5.0/24" map_public_ip_on_launch = "false" availability_zone = "eu-west-1b" tags = { Name = "main-private-2" } }
-
创建 Internet Gateway
Public subnet 访问 Internet.
# Internet GW resource "aws_internet_gateway" "main-gw" { vpc_id = aws_vpc.main.id # 这里需要关联到一个 VPC tags = { Name = "main" } }
[路由表] 跟公网网关相关的“路由表”设置。
# route tables resource "aws_route_table" "main-public" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.main-gw.id } tags = { Name = "main-public-1" } }
-
关联 “子网” 与 “路由表”
将子网和路由表绑定起来。
# route associations public resource "aws_route_table_association" "main-public-1-a" { subnet_id = aws_subnet.main-public-1.id route_table_id = aws_route_table.main-public.id } resource "aws_route_table_association" "main-public-2-a" { subnet_id = aws_subnet.main-public-2.id route_table_id = aws_route_table.main-public.id }
二、单独配置 NAT以及 Gateway
-
弹性 IP 地址
先配置一个“静态IP”。专为动态云计算设计的静态 IPv4 地址。弹性 IP 地址与 AWS 账户关联。
借助弹性 IP 地址,您可以快速将地址重新映射到您的账户中的另一个实例,从而屏蔽实例故障。
# nat gw resource "aws_eip" "nat" { vpc = true } resource "aws_nat_gateway" "nat-gw" { allocation_id = aws_eip.nat.id subnet_id = aws_subnet.main-public-1.id # 该网关在子网中 <-- depends_on = [aws_internet_gateway.main-gw] # 该网关 与 internet网关 关联起来 <-- }
[路由表] 跟内网网关相关的 “路由表” 设置。
# VPC setup for NAT resource "aws_route_table" "main-private" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" nat_gateway_id = aws_nat_gateway.nat-gw.id } tags = { Name = "main-private-1" } }
将子网和路由表绑定起来。
# route associations private resource "aws_route_table_association" "main-private-1-a" { subnet_id = aws_subnet.main-private-1.id route_table_id = aws_route_table.main-private.id } resource "aws_route_table_association" "main-private-2-a" { subnet_id = aws_subnet.main-private-2.id route_table_id = aws_route_table.main-private.id }
三、查看配置结果
多出了一个main的vpc。
四个 subnet。
两个路由表。
Internet Gateway。
NAT Gateway
End.