文章目录
创建定制VPC
AWS里一般默认有一个VPC,如果直接使用的话,可以省去很多麻烦。如果创建定制VPC,所有的组件需要各个创建,可以了解各个组件的细节。如果创建定制的VPC,会新创建一个默认的Route Table,Network ACL,和Security Group。不会创建Subnet和Internet Gateway。
创建一个定制的VPC并取名为XiongTestVPC
, IPv4 CIDR block为10.0.0.0/16,如下图所示:
这里默认创建了Network ACL是允许所有的流量进出, 也就是所有的Source和Destination都是0.0.0.0/0允许。
以下未知,是否要设置DNS resolution和DNS hostnames为Enabled?
在VPC里创建两个Subnet
首先创建公用Subnet,名字为XiongPublicSubnet
,VPC选择新定制的VPC–>XiongTestVPC,IPv4 CIDR block为10.0.1.0/24,这里Availability Zone
选择ap-southeast-1a
。
注意: 这里选择了ap-southeast-1a
,如果在另一个帐户里也选择了ap-southeast-1a
,这两个Availability Zone
并不一定是同一个,因为AWS会随机分配,这样可以保证不会有大多数用户选择同一个Availability Zone
。创建公用Subnet如下图所示:
对于公有的Subnet,改变设置公有的Subnet的自动分配公有地址,在Action --> Modify auto-assign IP settings
里,如下图所示:
同理,创建另一个私有的Subnet,名字为XiongPrivateSubnet
,VPC选择新定制的VPC–>XiongTestVPC,IPv4 CIDR block为10.0.2.0/24,这里Availability Zone
选择ap-southeast-1b
。
这里创建的两个Subnet, 默认Route Table里只能访问本地,需要在后面关联能够访问外网的Route Table,Network ACL默认为前面新创建的VPC所默认生成的Network ACL。
创建Internet Gateway
创建一个名为XiongTestInternetGateway
的Internet Gateway,并把它附加到新创建的定制VPC上。如下图所示:
注意:一个VPC只能附加一个Internet gateway。
创建额外的Route table访问外部
创建额外的Route table
在创建定制VPC的时候,会默认创建一个Route table为主Route Table,这个默认创建的Route Table只能访问本地,是私有的(private),不能访问外部,这个Route Table专门用于内部私有的Subnet。那么这里我们创建一个额外的Route table可以访问外部,取名为XiongRouteTablePublic
,用于外部的公有的Subnet。如下图所示:
添加路由到Internet Gateway
在XiongRouteTablePublic
这个公有的Route Table里添加两个(分别是IPV4和IPV6)指向前面新创建的可以访问外部的Internet Gateway, 也就是XiongTestInternetGateway
,0.0.0.0/0
为IPV4, ::/0
为IPV6,如下图所示:
关联公有Subnet到额外的公有的Route table
关联公有Subnet也就是XiongPublicSubnet
到额外的Route table也就是XiongRouteTablePublic
,在Subnets > Edit route table association
界面中,这样公有Subnet就可以访问外部公网我了。添加的地方如下图所示:
在定制VPC里创建一个新的Security Group (安全组)
在定制VPC XiongTestVPC
里创建一个新的Security Group (安全组),取名为XiongInternalSecurityGroup
,用途为内部的EC2使用,默认的Inbound Rules为空,Outbound Rules为所有。
所以在Inbound Rules中添加内网的Subnet地址可以访问以下端口。
- ICMP --> 0~65536
- HTTP --> 80
- HTTPS --> 443
- MYSQL/Aurora --> 3306
- SSH --> 22
如下图所示:
注意:Security Groups不能跨VPC。一个VPC里只能有一个Internet Gateway。
注意:Security Groups是stateful,也就是说添加到Inbound的规则,也自动添加到Outbound上去。
在定制VPC里创建两个EC2 (公有和私有)
在定制VPC里创建两个EC2 (公有和私有),公有EC2可以访问外网,也可以被外网访问,例如Web Server,私有EC2只能内部才能访问,例如数据库服务器。
创建公有EC2
使用以下启动脚本:
这里要选择, XiongTestVPC
和XiongPublicSubnet
,前面已经设置过XiongPublicSubnet
会自动分配公网地址, 如下图所示:
创建私有EC2
再创建一个私有EC2,假如用作内部数据服务器,这里要选择, XiongTestVPC
和XiongPrivateSubnet
,前面已经设置过XiongPrivateSubnet
不会自动分配公网地址, 如下图所示:
这里在创建私有EC2,在选择Security Group的时候,选择新创建的XiongInternalSecurityGroup
,如下所示,这样就限制了只能从XiongPublicSubnet
进行访问:
测试能从外网访问公用EC2.
使用SSH进行访问:
在这里的私有地址是10.0.1.130
那么通过公有的EC2访问私有的EC2,上传所创建的私钥,名为XiongEC2KeyPair.pem
,私有EC2的地址为:10.0.2.43
,使用Bastion进行访问,通过SSH进行访问如下:
私有EC2通过NAT访问外网
前面创建的私有的EC2是不能访问外网的,这样是安全的,但是如果需要进行软件更新怎么办呢?
这里需要用到NAT才能访问到外网。
NAT Gateway和NAT Instance的比较
NAT Instance是在Security Group后面的,本质上是一个虚拟机Instance,会有性能限制,可能成为瓶颈。 NAT Gateway是在Security Group前面的,但是是在ACL后面的,是可扩展的,性能优于NAT Instance,除了性能高以外,还不需要维护,不需要与安全组Security Group关联,不需要做Disabling Source/Destination Checks操作。
使用NAT Instance
创建一个NAT Instance,在EC2创建界面中的Community AMI
中,搜索NAT,找到以下NAT AMI,
amzn-ami-vpc-nat-2018.03.0.20190826-x86_64-ebs - ami-0012a981fe3b8891f
Amazon Linux AMI 2018.03.0.20190826 x86_64 VPC HVM ebs
这里要选择, XiongTestVPC
和XiongPublicSubnet
。
参考这个链接 , 需要关闭Source/Destination检查。
Disabling Source/Destination Checks
Each EC2 instance performs source/destination checks by default. This means that the instance must be the source or destination of any traffic it sends or receives. However, a NAT instance must be able to send and receive traffic when the source or destination is not itself. Therefore, you must disable source/destination checks on the NAT instance.
如下图所示,进行更改,
更改后如下:
下面从私有的EC2中创建一个路由到这个NAT Instance,在私有的Subnet中的路由表中添加。
以上再测试yum update -y
可以成功了!
只要在Default VPC Security Group里放行ICMP,也是可以Ping通外网的。
那么现在删除这个NAT Instance,下面来创建NAT Gateway可以达到同样的效果。
以上删除NAT Instance后,在路由表中会显示一个黑洞‘Blackhole’,如下图所示:
结果是ping 8.8.8.8
和yum update -y
都无法使用。
使用NAT Gateway
在VPC中直接创建一个NAT Gateway,在public Subnet中,如下图所示,这里要创建一个EIP,Elastic IP
直接从私有的EC2中创建一个路由到这个新创建的NAT GATEWAY,在私有的Subnet中的路由表中添加。如下图所示:
测试的结果是ping 8.8.8.8
和yum update -y
都又可以正常使用了。
添加定制ACL并设置ACL
前面创建VPC XiongTestVPC
的时候,会默认创建一个ACL, 这个ACL是默认允许所有的流量通过的。然而如果添加定制的ACL的时候,默认是禁止所有的流量通过的,需要手动添加规则。
创建一个定制的ACL, 在Network ACL
里,点Create Network ACL
,取名XiongCustomizedACL
,选择在VPC XiongTestVPC
里创建。可以看到新创建的XiongCustomizedACL
Network ACL禁止所有进入和出去的流量。
如果把新创建的XiongCustomizedACL
Network ACL与公有的Subnet XiongPublicSubnet
进行关联,那么由于新创建的XiongCustomizedACL
Network ACL禁止所有进入和出去的流量,立马的效果就是公用的EC2的HTTP服务器无法访问。SSH也断开了。
添加Inbound和outbound的规则,如下图所示,立马公用的EC2的HTTP服务器马上可以访问了:
下图关联ACL到公用的Subnet,并设置inbound和outbound的规则 。
注意
我在Inbound的规则中添加了以下规则,SSH才可以使用,难道使用了Ephemeral port?
600 Custom TCP Rule TCP (6) 1024 - 65535 0.0.0.0/0 ALLOW
使用Bastion进行访问。
注意
一个Subnet只能在一个ACL里面,然而,一个Network ACL可以与多个Subnets相关联。
至少需要两个Subnets才能创建Loader Balancer
Endpoints测试
将私有的EC2移回到默认的VPC XiongTestVPC
默认的ACL,这样测试会更容易些。
添加一个有S3访问权限的角色,
检查下权限:
为了测试需要,删除NAT Gateway以测试私有的EC2不能访问S3。记得删除NAT Gateway的时候删除EIP。
再测试,已经不能访问S3了,因为NAT Gateway删除后,私有的EC2已经不能访问外网了。
创建一个S3 Gateway的Endpoint,com.amazonaws.ap-southeast-1.s3 amazon Gateway
,
可以查看到在私有的Subnet的Route Table里添加了一条路由到这个新创建的可以访问S3 的 Endpoint,测试结果如下,这里需要加上Region,否则不成功。
术语
NAT: Network Address Translation (NAT)
Bastions: Jumbox,
Endpoints 通过VPC可以直接访问AWS的一些服务,不需要通过外网。
EIPElastic IP
本次实验的拓扑图。
Reference
AWS Network ACLsAWS NAT InstancesSecurely Connect to Linux Instances Running in a Private Amazon VPCEphemeral port Wkipedia