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?
DNS resolution Enabled
DNS hostnames Enabled
首先创建公用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。
创建一个名为XiongTestInternetGateway
的Internet Gateway,并把它附加到新创建的定制VPC上。如下图所示:
注意:一个VPC只能附加一个Internet gateway。
在创建定制VPC的时候,会默认创建一个Route table为主Route Table,这个默认创建的Route Table只能访问本地,是私有的(private),不能访问外部,这个Route Table专门用于内部私有的Subnet。那么这里我们创建一个额外的Route table可以访问外部,取名为XiongRouteTablePublic
,用于外部的公有的Subnet。如下图所示:
在XiongRouteTablePublic
这个公有的Route Table里添加两个(分别是IPV4和IPV6)指向前面新创建的可以访问外部的Internet Gateway, 也就是XiongTestInternetGateway
,0.0.0.0/0
为IPV4, ::/0
为IPV6,如下图所示:
关联公有Subnet也就是XiongPublicSubnet
到额外的Route table也就是XiongRouteTablePublic
,在Subnets > Edit route table association
界面中,这样公有Subnet就可以访问外部公网我了。添加的地方如下图所示:
在定制VPC XiongTestVPC
里创建一个新的Security Group (安全组),取名为XiongInternalSecurityGroup
,用途为内部的EC2使用,默认的Inbound Rules为空,Outbound Rules为所有。
所以在Inbound Rules中添加内网的Subnet地址可以访问以下端口。
如下图所示:
注意:Security Groups不能跨VPC。一个VPC里只能有一个Internet Gateway。
注意:Security Groups是stateful,也就是说添加到Inbound的规则,也自动添加到Outbound上去。
在定制VPC里创建两个EC2 (公有和私有),公有EC2可以访问外网,也可以被外网访问,例如Web Server,私有EC2只能内部才能访问,例如数据库服务器。
使用以下启动脚本:
#!/bin/bash
yum install httpd -y
yum update -y
service httpd start
chkconfig httpd on
echo "Hello Xiong, this is public EC2 Instance!
" > /var/www/html/index.html
这里要选择, XiongTestVPC
和XiongPublicSubnet
,前面已经设置过XiongPublicSubnet
会自动分配公网地址, 如下图所示:
再创建一个私有EC2,假如用作内部数据服务器,这里要选择, XiongTestVPC
和XiongPrivateSubnet
,前面已经设置过XiongPrivateSubnet
不会自动分配公网地址, 如下图所示:
这里在创建私有EC2,在选择Security Group的时候,选择新创建的XiongInternalSecurityGroup
,如下所示,这样就限制了只能从XiongPublicSubnet
进行访问:
使用SSH进行访问:
[c:\~]$
Connecting to 54.255.238.161:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-10-0-1-130 ~]$ sudo su
[root@ip-10-0-1-130 ec2-user]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=0.895 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=47 time=1.02 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=47 time=1.02 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=47 time=0.968 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=47 time=0.980 ms
^C
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4014ms
rtt min/avg/max/mdev = 0.895/0.977/1.022/0.046 ms
[root@ip-10-0-1-130 ec2-user]#
在这里的私有地址是10.0.1.130
那么通过公有的EC2访问私有的EC2,上传所创建的私钥,名为XiongEC2KeyPair.pem
,私有EC2的地址为:10.0.2.43
,使用Bastion进行访问,通过SSH进行访问如下:
[root@ip-10-0-1-130 ec2-user]#
[root@ip-10-0-1-130 ec2-user]# ls
XiongEC2KeyPair.pem
[root@ip-10-0-1-130 ec2-user]# pwd
/home/ec2-user
[root@ip-10-0-1-130 ec2-user]# ssh [email protected] -i XiongEC2KeyPair.pem
The authenticity of host '10.0.2.43 (10.0.2.43)' can't be established.
ECDSA key fingerprint is SHA256:vJAvER9E5hehP6KOEqDErZxWaDjlRnjLypdHSrQ4Fmk.
ECDSA key fingerprint is MD5:df:48:7d:eb:d6:11:10:9c:cc:d4:2f:1b:19:d4:59:6e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.2.43' (ECDSA) to the list of known hosts.
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-10-0-2-43 ~]$ ifconfig
eth0 Link encap:Ethernet HWaddr 06:26:BB:0C:73:8A
inet addr:10.0.2.43 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::426:bbff:fe0c:738a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:582 errors:0 dropped:0 overruns:0 frame:0
TX packets:637 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:63293 (61.8 KiB) TX bytes:62320 (60.8 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:2 errors:0 dropped:0 overruns:0 frame:0
TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:140 (140.0 b) TX bytes:140 (140.0 b)
[ec2-user@ip-10-0-2-43 ~]$
前面创建的私有的EC2是不能访问外网的,这样是安全的,但是如果需要进行软件更新怎么办呢?
[ec2-user@ip-10-0-2-43 ~]$ sudo su
[root@ip-10-0-2-43 ec2-user]# yum update -y
Loaded plugins: priorities, update-motd, upgrade-helper
Could not retrieve mirrorlist http://repo.ap-southeast-1.amazonaws.com/latest/main/mirror.list error was
...
...
[root@ip-10-0-2-43 ec2-user]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
time out...
这里需要用到NAT才能访问到外网。
NAT Instance是在Security Group后面的,本质上是一个虚拟机Instance,会有性能限制,可能成为瓶颈。 NAT Gateway是在Security Group前面的,但是是在ACL后面的,是可扩展的,性能优于NAT Instance,除了性能高以外,还不需要维护,不需要与安全组Security Group关联,不需要做Disabling Source/Destination Checks操作。
创建一个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
可以成功了!
[root@ip-10-0-2-43 ec2-user]# yum update -y
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main | 2.1 kB 00:00:00
amzn-updates | 2.5 kB 00:00:00
(1/5): amzn-main/latest/group_gz | 4.4 kB 00:00:00
(2/5): amzn-updates/latest/group_gz | 4.4 kB 00:00:00
(3/5): amzn-updates/latest/updateinfo | 611 kB 00:00:01
(4/5): amzn-updates/latest/primary_db | 2.4 MB 00:00:01
(5/5): amzn-main/latest/primary_db | 4.0 MB 00:00:02
Resolving Dependencies
--> Running transaction check
...
...
只要在Default VPC Security Group里放行ICMP,也是可以Ping通外网的。
[root@ip-10-0-2-43 ec2-user]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=46 time=2.08 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=46 time=2.12 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=46 time=2.02 ms
...
...
那么现在删除这个NAT Instance,下面来创建NAT Gateway可以达到同样的效果。
以上删除NAT Instance后,在路由表中会显示一个黑洞‘Blackhole’,如下图所示:
结果是ping 8.8.8.8
和yum update -y
都无法使用。
在VPC中直接创建一个NAT Gateway,在public Subnet中,如下图所示,这里要创建一个EIP,Elastic IP
直接从私有的EC2中创建一个路由到这个新创建的NAT GATEWAY,在私有的Subnet中的路由表中添加。如下图所示:
测试的结果是ping 8.8.8.8
和yum update -y
都又可以正常使用了。
前面创建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进行访问。
[root@ip-10-0-1-130 ec2-user]# ssh [email protected] -i XiongEC2KeyPair.pem
^C
[root@ip-10-0-1-130 ec2-user]# ssh [email protected] -i XiongEC2KeyPair.pem
Last login: Sun Nov 17 07:19:47 2019 from ip-10-0-1-130.ap-southeast-1.compute.internal
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-10-0-2-43 ~]$ exit
logout
注意
一个Subnet只能在一个ACL里面,然而,一个Network ACL可以与多个Subnets相关联。
至少需要两个Subnets才能创建Loader Balancer
将私有的EC2移回到默认的VPC XiongTestVPC
默认的ACL,这样测试会更容易些。
添加一个有S3访问权限的角色,
检查下权限:
[root@ip-10-0-1-130 ec2-user]# aws s3 ls
Unable to locate credentials. You can configure credentials by running "aws configure".
[root@ip-10-0-1-130 ec2-user]# ssh [email protected] -i XiongEC2KeyPair.pem
Last login: Sun Nov 17 07:20:51 2019 from ip-10-0-1-130.ap-southeast-1.compute.internal
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-10-0-2-43 ~]$ aws s3 ls
2019-01-06 13:16:41 xiong-polly
2019-01-06 13:17:07 xiong-polly-mp3
2019-01-01 01:55:31 xiong2019
[ec2-user@ip-10-0-2-43 ~]$
为了测试需要,删除NAT Gateway以测试私有的EC2不能访问S3。记得删除NAT Gateway的时候删除EIP。
再测试,已经不能访问S3了,因为NAT Gateway删除后,私有的EC2已经不能访问外网了。
[ec2-user@ip-10-0-2-43 ~]$ aws s3 ls
...
创建一个S3 Gateway的Endpoint,com.amazonaws.ap-southeast-1.s3 amazon Gateway
,
可以查看到在私有的Subnet的Route Table里添加了一条路由到这个新创建的可以访问S3 的 Endpoint,测试结果如下,这里需要加上Region,否则不成功。
[ec2-user@ip-10-0-2-43 ~]$ aws s3 ls
^C
[ec2-user@ip-10-0-2-43 ~]$ aws s3 ls --region ap-southeast-1
2019-01-06 13:16:41 xiong-polly
2019-01-07 03:44:18 xiong-polly-mp3
2019-01-06 13:18:34 xiong2019
[ec2-user@ip-10-0-2-43 ~]$
NAT: Network Address Translation (NAT)
Bastions: Jumbox,
Endpoints 通过VPC可以直接访问AWS的一些服务,不需要通过外网。
EIPElastic IP
AWS Network ACLs
AWS NAT Instances
Securely Connect to Linux Instances Running in a Private Amazon VPC
Ephemeral port Wkipedia