跟我一同做 借助VPC打造专属的私密Internet
虚构公用云(Virtual Private Cloud ,VPC)在云计算技术中表演了关键角色。VPC能让两个云实例之间启动私有通讯,将网络流量与其余互联网用户隔分开,从而提高安保性。换句话说,作为一种虚构网络环境,VPC能在私有云基础设备中创立一个隔离且私密的网络空间,为用户提供一个安保、灵敏、可定制的网络环境,协助他们构建和治理各种类型的运行和服务。
也就是说,就像是“套娃”一样,咱们可以借助这种技术,在公共互联网的基础上构建一个规模更小,更私密的公用“Internet”来。想想是不是还挺激动?
请收下这份教程,祝你玩得欢快!
下文咱们将经过一个仪表板为例启动引见。为此咱们将部署两个运行程序,每个运行程序由一个运行主机和一个数据库主机组成(共四个主机)。第一个运行程序和对应的数据库主机驳回反常模式来部署,第二组则性能为在VPC中运转。
每个运行的前端都经常使用Qwik构建,并经常使用Tailwind启动样式设计。主机端由Qwik City(Qwik的官方元框架)提供支持,并在Node.js上运转,托管在共享的Linode VPS上。这些运行还经常使用PM2进后退程治理,并经常使用Caddy作为反向代理和SSL供应商。数据存储在PostgreSQL数据库中,该数据库也在共享的Linode VPS上运转。运行程序经常使用Drizzle与数据库启动交互,Drizzle是JavaScript的对象相关映射器(ORM)。
两个运行程序的整个基础架构都由Terraform治理,详细来说,经常使用了Terraform的Linode提供程序启动治理。首次接触Linode的童鞋对此或许觉得有些生疏,但只需学会了操作方法,就能加快轻松地启动基础架构的性能和销毁。
假设感兴味,大家也可以在
正如上文所述,本例将部署两个相反的运行程序。这方面并没有什么特意须要留意的,相应的内容如下图所示。
整个技术栈没有什么特意之处。之所以选用这些工具也没什么特意的要素,大家齐全可以联合自己的需求和习气选用自己觉得最适宜的工具。
真正幽默的局部在于基础架构。
首先看看一号运行程序,它基本上由两个托管在Akamai云中的主机组成,一个用于运行程序,另一个用于数据库。当用户加载运行程序时,运行程序主机将从数据库中提取数据,构建HTML,并将结果前往给用户。
这里的疑问在于数据库衔接的性能。某些状况下,咱们或许会部署一个数据库主机,但并不能事前知道须要准许哪些IP地址的设备(如运行主机)访问。此时很多人习用的做法是方便粗犷地间接准许具有正确凭据的任何计算机衔接。但这会带来安保隐患,由于攻打者有或许借此衔接到数据库并窃取敏感数据。
虽然攻打者依然须要知道数据库主机、端口、用户名和明码能力失掉访问权限,因此看起来这个隐患其实也并不是很大。毕竟刚才也说了,这种做法在业内其实很经常出现。但其实还有更好的做法!
假设曾经知道每台须要访问的计算机的IP地址,那么一种比拟好的处置打算是设置防火墙或VLAN。但假设基础架构愈加灵活,主机会频繁启动和封锁,IP地址列表的保养上班或许会显得十分费事。这就到了VPC的用武之地。咱们可以将主机性能到VPC中,并允只准许位于同一个VPC网络中的计算机相互自在通讯。
这就是二号运行程序的设置模式。用户可以衔接到运行主机,该主机位于VPC中,但准许处置来自公共互联网的流量。该运行主机可以衔接到数据库,数据库也位于同一个VPC中,并且只准许来自同一网络的访问。而后,运行主机就可以照常从数据库失掉数据,构建HTML,并将页背地往给用户。
关于个别用户,两个运行的访问体验没有任何差异。阅读器可以很好地加载任何一个运行的界面。对个别用户来说,VPC经常使用与否都不会对自己发生一丝一毫的影响。
但是关于攻打者来说,体验就一模一样了。即使攻打者设法失掉了数据库访问凭据,他们也无法衔接,由于VPC的网络是被隔离的。此时,VPC充任了虚构防火墙的角色,确保只要位于同一个网络中的设备能力访问数据库。(这个概念有时也被称为“宰割[segmentation]”)
经过参与emoji图标的示用意来展现技术概念,这诚然是一种可恶的做法,但为了更有压服力,最好还是能给出实证。因此咱们将尝试着经常使用数据库客户端DBeaver间接衔接两个数据库,而后看看会出现什么。
关于一号数据库,咱们设置了一个Postgres衔接:经常使用从Akamai仪表板失掉的主机IP地址以及在Terraform脚本中设置的端口、用户名和明码。发现衔接可以按预期上班。
关于二号数据库,咱们只须要更改IP地址,由于一切数据库性能都是由相反Terraform脚本处置的,惟一的区别是:二号数据库主机被放在与二号运行主机相反的VPC中,并且性能为只准许来自同一网络内的计算机访问。
毫不异常,当咱们尝试衔接时,虽然提供了一切正确消息,但依然收到了一个失误:
失误消息中齐全没有提就任何关于VPC的内容。它只是说咱们的IP地址不在性能文件的准许访问列表中。这是正当的。假设须要,咱们可以明白地参与自己的IP地址并取得对数据库的访问权限,但这不是重点。
这里的重点是:咱们并没有明白将任何IP地址参与到Postgres的准许列表中。但是运行主机能够反常衔接,但其余一切人都被VPC阻止了。
为了便于大家自行试验和练习,咱们提供了部署上述运行程序的Terraform代码。相关文件请访问 。
须要留意的是,咱们曾经尽最大抵力让这个Terraform文件对其他人可重用。这须要更多的变量和基于tfvars文件的
接上去一同看看其中的关键局部。
首先,由于经常使用了Linode Terraform提供程序,因此有必要了解这是如何设置的:
terraform { required_providers { linode = { source = "linode/linode" version = "2.13.0" } }}variable "LINODE_TOKEN" {}provider "linode" { token = var.LINODE_TOKEN}
这局部设置了提供程序以及Terraform要求咱们提供的变量,或许大家也可以经常使用tfvars文件提供。
接上去须要设置实践的VPC资源以及子网资源。
resource "linode_vpc" "vpc" { label = "${local.app_name}-vpc" region = var.REGION}resource "linode_vpc_subnet" "vpc_subnet" { vpc_id = linode_vpc.vpc.id label = "${local.app_name}-vpc-subnet" ipv4 = "${var.VPC_SUBNET_IP}"}
主机只能参与到同一地域的VPC中。在撰写本文时,Akamai云平台支持VPC的地域有13个。最新消息请参阅Akamai官方。
有三个IPv4地址范围是专门保管可用于私有网络(如VPC)的:
因此在性能子网时,咱们必定从这三个选项当选用一个,并且必定经常使用CIDR格局来指定想经常使用的IP范围。这里咱们经常使用了10.0.0.0/24。
私有网络中的每台主机都将领有该范围内的一个IPv4地址。
为了让Terraform部署咱们的运行主机,咱们经常使用了linode_instance资源,此外还经常使用了stackscript资源来创立一个可重复经常使用的部署脚本,用于装置和性能软件。这就像一个位于Akamai云仪表板中的Bash脚本,咱们可以间接将其用于新的主机。
相关代码就不放在这里了,但须要经过NVM装置Node.js 20,装置PM2,克隆名目代码库,运转运行,并设置Caddy。StackScript的内容请自行参阅源代码,下文想方便说说Terraform的局部。
resource "linode_instance" "application1" { depends_on = [ linode_instance.database1 ] image = "linode/ubuntu20.04" type = "g6-nanode-1" label = "${local.app_name}-application1" group = "${local.app_name}-group" region = var.REGION authorized_keys = [ linode_sshkey.ssh_key.ssh_key ] stackscript_id = linode_stackscript.configure_app_server.id stackscript_data = { "GIT_REPO" = var.GIT_REPO, "START_COMMAND" = var.START_COMMAND, "DOMAIN" = var.DOMAIN1, "NODE_PORT" = var.NODE_PORT, "DB_HOST" = linode_instance.database1.ip_address, "DB_PORT" = var.DB_PORT, "DB_NAME" = var.DB_NAME, "DB_USER" = var.DB_USER, "DB_PASS" = var.DB_PASS, }}resource "linode_instance" "application2" { depends_on = [ linode_instance.database2 ] image = "linode/ubuntu20.04" type = "g6-nanode-1" label = "${local.app_name}-application2" group = "${local.app_name}-group" region = var.REGION authorized_keys = [ linode_sshkey.ssh_key.ssh_key ] stackscript_id = linode_stackscript.configure_app_server.id stackscript_data = { "GIT_REPO" = var.GIT_REPO, "START_COMMAND" = var.START_COMMAND, "DOMAIN" = var.DOMAIN2, "NODE_PORT" = var.NODE_PORT, "DB_HOST" = var.DB_PRIVATE_IP, "DB_PORT" = var.DB_PORT, "DB_NAME" = var.DB_NAME, "DB_USER" = var.DB_USER, "DB_PASS" = var.DB_PASS, } interface { purpose = "public" } interface { purpose = "vpc" subnet_id = linode_vpc_subnet.vpc_subnet.id }}
这两个资源的性能环节简直相反,只要一些关键的事件须要留意:
另外还要留意,运行主机要部署到与VPC相反的地域,要素如上文所述。
数据库也经常使用linode_instance和linode_stackscript资源启动设置。雷同,StackScript的内容就间接略过了,感兴味的同窗请间接参阅代码。接上去咱们须要装置Postgres,设置数据库和凭据,并提供一些性能选项。
resource "linode_instance" "database1" { image = "linode/ubuntu20.04" type = "g6-nanode-1" label = "${local.app_name}-db1" group = "${local.app_name}-group" region = var.REGION authorized_keys = [ linode_sshkey.ssh_key.ssh_key ] stackscript_id = linode_stackscript.configure_db_server.id stackscript_data = { "DB_NAME" = var.DB_NAME, "DB_USER" = var.DB_USER, "DB_PASS" = var.DB_PASS, "PG_HBA_ENTRY" = "host all all all md5" }}resource "linode_instance" "database2" { image = "linode/ubuntu20.04" type = "g6-nanode-1" label = "${local.app_name}-db2" group = "${local.app_name}-group" region = var.REGION authorized_keys = [ linode_sshkey.ssh_key.ssh_key ] stackscript_id = linode_stackscript.configure_db_server.id stackscript_data = { "DB_NAME" = var.DB_NAME, "DB_USER" = var.DB_USER, "DB_PASS" = var.DB_PASS, "PG_HBA_ENTRY" = "host all all samenet md5" } interface { purpose = "public" } interface { purpose = "vpc" subnet_id = linode_vpc_subnet.vpc_subnet.id ipv4 { vpc = var.DB_PRIVATE_IP } }}
与运行程序主机一样,这两个数据库主机大抵相反,但有一些关键区别:
第二个数据库蕴含将自己参与到VPC的性能。
客户端身份验证文件(pg_hba.conf)中会被写入不同的设置。一号数据库准许一切的互联网衔接("host all all all md5"),而二号数据库只准许来自相反网络的访问("host all all samenet md5")。
另外须要留意,在性能VPC设置时,咱们明白调配了主机的私有IP地址(var.DB_PRIVATE_IP)。这与运行程序主机所取得的静态值相反,因此可以从VPC外部衔接到数据库。
宿愿本文能让大家了解到VPC是什么,有什么用,以及何时应该思考经常使用。这就像领有了自己的小型私有互联网。严厉意义过去说,VPC并不是为了代替VLAN或防火墙,但它是现有安保通常很好的补充。
如您所在的企业也在思考洽购云服务或启动云迁徙,