在AWS中创建定制的虚拟私有云(VPC)

2023-11-04 05:08
文章标签 定制 创建 私有 虚拟 aws vpc

本文主要是介绍在AWS中创建定制的虚拟私有云(VPC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 创建定制VPC
  • 在VPC里创建两个Subnet
  • 创建Internet Gateway
  • 创建额外的Route table访问外部
    • 创建额外的Route table
    • 添加路由到Internet Gateway
    • 关联公有Subnet到额外的公有的Route table
  • 在定制VPC里创建一个新的Security Group (安全组)
  • 在定制VPC里创建两个EC2 (公有和私有)
    • 创建公有EC2
    • 创建私有EC2
  • 私有EC2通过NAT访问外网
    • NAT Gateway和NAT Instance的比较
    • 使用NAT Instance
    • 使用NAT Gateway
  • 添加定制ACL并设置ACL
  • Endpoints测试
  • 术语
  • Reference

创建定制VPC

AWS里一般默认有一个VPC,如果直接使用的话,可以省去很多麻烦。如果创建定制VPC,所有的组件需要各个创建,可以了解各个组件的细节。如果创建定制的VPC,会新创建一个默认的Route Table,Network ACL,和Security Group。不会创建Subnet和Internet Gateway。

创建一个定制的VPC并取名为XiongTestVPC, IPv4 CIDR block为10.0.0.0/16,如下图所示:
create VPC

这里默认创建了Network ACL是允许所有的流量进出, 也就是所有的Source和Destination都是0.0.0.0/0允许。

以下未知,是否要设置DNS resolution和DNS hostnames为Enabled?

DNS resolution       Enabled
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如下图所示:

Create public Subnet

对于公有的Subnet,改变设置公有的Subnet的自动分配公有地址,在Action --> Modify auto-assign IP settings里,如下图所示:

Auto assign public IP

同理,创建另一个私有的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上。如下图所示:

Attach Internet GW

注意:一个VPC只能附加一个Internet gateway。

创建额外的Route table访问外部

创建额外的Route table

在创建定制VPC的时候,会默认创建一个Route table为主Route Table,这个默认创建的Route Table只能访问本地,是私有的(private),不能访问外部,这个Route Table专门用于内部私有的Subnet。那么这里我们创建一个额外的Route table可以访问外部,取名为XiongRouteTablePublic,用于外部的公有的Subnet。如下图所示:

Create public route table

添加路由到Internet Gateway

XiongRouteTablePublic这个公有的Route Table里添加两个(分别是IPV4和IPV6)指向前面新创建的可以访问外部的Internet Gateway, 也就是XiongTestInternetGateway0.0.0.0/0为IPV4, ::/0为IPV6,如下图所示:

Edit public route table

关联公有Subnet到额外的公有的Route table

关联公有Subnet也就是XiongPublicSubnet到额外的Route table也就是XiongRouteTablePublic,在Subnets > Edit route table association界面中,这样公有Subnet就可以访问外部公网我了。添加的地方如下图所示:

associate public subnet to public route table

在定制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

如下图所示:

create Internal SG

注意:Security Groups不能跨VPC。一个VPC里只能有一个Internet Gateway。
注意:Security Groups是stateful,也就是说添加到Inbound的规则,也自动添加到Outbound上去。

在定制VPC里创建两个EC2 (公有和私有)

在定制VPC里创建两个EC2 (公有和私有),公有EC2可以访问外网,也可以被外网访问,例如Web Server,私有EC2只能内部才能访问,例如数据库服务器。

创建公有EC2

使用以下启动脚本:

#!/bin/bash
yum install httpd -y
yum update -y
service httpd start
chkconfig httpd on
echo "<html><h1>Hello Xiong, this is public EC2 Instance!</h1></html>" > /var/www/html/index.html

这里要选择, XiongTestVPCXiongPublicSubnet,前面已经设置过XiongPublicSubnet会自动分配公网地址, 如下图所示:

Create public EC2

创建私有EC2

再创建一个私有EC2,假如用作内部数据服务器,这里要选择, XiongTestVPCXiongPrivateSubnet,前面已经设置过XiongPrivateSubnet 不会自动分配公网地址, 如下图所示:

Create private EC2
这里在创建私有EC2,在选择Security Group的时候,选择新创建的XiongInternalSecurityGroup,如下所示,这样就限制了只能从XiongPublicSubnet进行访问:

Select internal SG
测试能从外网访问公用EC2.

Test EC2

使用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 ec2-user@10.0.2.43 -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:8Ainet addr:10.0.2.43  Bcast:10.0.2.255  Mask:255.255.255.0inet6 addr: fe80::426:bbff:fe0c:738a/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1RX packets:582 errors:0 dropped:0 overruns:0 frame:0TX packets:637 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:63293 (61.8 KiB)  TX bytes:62320 (60.8 KiB)lo        Link encap:Local Loopbackinet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:2 errors:0 dropped:0 overruns:0 frame:0TX packets:2 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:140 (140.0 b)  TX bytes:140 (140.0 b)[ec2-user@ip-10-0-2-43 ~]$

私有EC2通过NAT访问外网

前面创建的私有的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 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

这里要选择, XiongTestVPCXiongPublicSubnet

参考这个链接 , 需要关闭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.

如下图所示,进行更改,
Source Dest check
更改后如下:
Source Dest check disabled
下面从私有的EC2中创建一个路由到这个NAT Instance,在私有的Subnet中的路由表中添加。
route to NAT instance
以上再测试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’,如下图所示:

Blackhole
结果是ping 8.8.8.8yum update -y都无法使用。

使用NAT Gateway

在VPC中直接创建一个NAT Gateway,在public Subnet中,如下图所示,这里要创建一个EIP,Elastic IP
Create NAT Gateway

直接从私有的EC2中创建一个路由到这个新创建的NAT GATEWAY,在私有的Subnet中的路由表中添加。如下图所示:

Route to NAT Gateway

测试的结果是ping 8.8.8.8yum 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的规则 。
Edit ACL

注意
我在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 ec2-user@10.0.2.43 -i XiongEC2KeyPair.pem
^C
[root@ip-10-0-1-130 ec2-user]# ssh ec2-user@10.0.2.43 -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

Endpoints测试

将私有的EC2移回到默认的VPC XiongTestVPC默认的ACL,这样测试会更容易些。

添加一个有S3访问权限的角色,

Add s3 access role

检查下权限:

[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 ec2-user@10.0.2.43 -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

S3 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

本次实验的拓扑图。
拓扑图

Reference

AWS Network ACLs
AWS NAT Instances
Securely Connect to Linux Instances Running in a Private Amazon VPC
Ephemeral port Wkipedia

这篇关于在AWS中创建定制的虚拟私有云(VPC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/343443

相关文章

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中