通过VPC Transit Hub和Spoke架构集中通信——第二部分
本教程可能会发生成本。 使用 成本估算器 根据您的预计使用量生成成本估算。
虚拟私有云 (VPC) 在 IBM Cloud中提供网络隔离和安全性。 VPC 可以是一个构件,封装一个公司部门(营销、开发、会计......)或一个 DevSecOps 团队拥有的微服务集合。 VPC 可以连接到本地企业,也可以相互连接。 这可能导致需要通过集中式防火墙-网关设备来路由流量。 本教程将介绍此高级视图中描述的中心和辐射体系结构的实现:
这是两部分教程的第二部分。 此部分将专注于通过中转中心防火墙-路由器在 VPC 之间路由所有流量。 讨论并实施了使用网络负载均衡器的可扩展防火墙路由器。 专用 DNS 用于通过虚拟专用端点 (VPE) 网关进行微服务标识和 IBM Cloud 服务实例标识。
本教程是独立的,因此不需要执行 第一部分 中的步骤。 如果您不熟悉 IBM Cloud中的 VPC,网络 IP 布局和规划, Transit Gateway,IBM Cloud® Direct Link 或非对称路由考虑通过第一部分进行读取。
中心和辐射模型支持多种不同的方案:
- 中心可以是辐条和企业使用的共享微服务的存储库。
- 该集线器可以是企业与云之间的流量防火墙-路由器和路由的中心点。
- The hub can monitor all or some of the traffic - spoke <-> spoke, spoke <-> transit, or spoke <-> enterprise.
- 中心可以保存由辐射共享的 VPN 资源。
- 该中心可以是共享云资源 (例如数据库) 的存储库,这些资源通过由 VPC 安全组和子网访问控制表控制的 虚拟专用端点(VPE)网关 进行访问,由辐条和企业共享
有一个配套的 GitHub 存储库,用于将连接划分为多个增量层。 在教程中,薄层支持引入叮咬大小挑战和解决方案。
将探讨以下问题:
- VPC 出口和入口路由。
- 虚拟网络功能 与网络负载均衡器组合,以支持高可用性和可伸缩性。
- VPE 网关。
- DNS 解析。
分层架构将引入资源并演示连接性。 每个层都将添加额外的连接和资源。 这些层以 Terraform 实现。 可以通过更改 Terraform 变量来更改参数 (例如区域数)。 分层方法允许教程引入小问题,并在完整体系结构的上下文中演示解决方案。
目标
- 了解基于 VPC 的中心和辐射模型背后的概念,用于管理所有 VPC 到 VPC 的流量。
- 了解 VPC 入口和出口路由。
- 确定并 (可选) 解决非对称路由问题。
- 了解如何将网络负载均衡器用于高可用性和可扩展的防火墙路由器。
- 利用 DNS 服务路由和转发规则,构建架构完善的名称解析系统。
准备工作
本教程需要:
terraform
以使用基础结构作为代码来供应资源,python
以 (可选) 运行 pytest 命令,- 实现防火墙路由器将要求您 启用 IP 电子欺骗检查,
请参阅 先决条件 以获取一些选项,包括用于轻松创建先决条件环境的 Dockerfile。
此外:
- 检查用户许可权。 请确保您的用户帐户具有足够的许可权来创建和管理本教程中的所有资源。 请参阅以下列表:
- VPC 必需的许可权。
- 创建 Transit Gateway 所需的许可权。
- IP 电子欺骗检查所需的许可权。
- 管理权限所需的许可权。
第一部分摘要
在本教程的 第一部分 中,我们仔细规划了传输和辐射 VPC 的地址空间。 基于区域的体系结构如下所示:
此图显示交通流。 Only the enterprise <-> spoke is passing through the firewall:
这是通过 Direct Link,Transit Gateway 和 VPC 路由实现的。 所有区域都进行了类似的配置,下图显示了区域 1 的详细信息:
CIDR 10.1.0.0/16 涵盖运输和轮辐,并通过 Direct Link 作为广告路线传递到企业。 类似地,CIDR 192.168.0.0/24 涵盖企业,并通过 Transit Gateway 传递到辐条作为广告路线。
辐条中的出口路由将流量路由到防火墙路由器。 Ingress routes in the transit route enterprise <-> spoke traffic through the firewall-router.
供应通过防火墙路由器路由所有内部 VPC 流量的初始 VPC 资源
通常,企业使用传输 VPC 来监视使用防火墙路由器的流量。 In part one only enterprise <-> spoke traffic was flowing through the transit firewall-router. 本节介绍如何通过防火墙路由器将所有 VPC 路由到 VPC 流量。
此图显示在此步骤中实现的流量流:
VPC 之间的所有流量都将流经防火墙路由器:
- enterprise <-> spoke.
- enterprise <-> transit.
- transit <-> spoke.
- spoke <-> spoke in different VPC.
VPC 中的流量不会流经防火墙。
如果从第一部分继续,请特别记下 terraform.tfvars: all_firewall = true
中的配置。
应用层
-
配套 GitHub Repository 具有用于实现体系结构的源文件。 在桌面 shell 中,克隆存储库:
git clone https://github.com/IBM-Cloud/vpc-transit cd vpc-transit
-
config_tf 目录包含需要配置的配置变量。
cp config_tf/template.terraform.tfvars config_tf/terraform.tfvars
-
编辑 config_tf/terraform.tfvars。
- 进行必需的更改。
- 更改值
all_firwewall = true
。
-
如果您还没有,请获取 一个平台API密钥,并导出API密钥供Terraform使用:
export IBMCLOUD_API_KEY=YourAPIKEy
-
由于按正确顺序安装每个层非常重要,并且本教程中的某些步骤将安装多个层,因此提供了 shell 命令 。/apply.sh。 以下内容将显示帮助:
./apply.sh
-
您可以应用通过执行
./apply.sh : :
配置的所有层。 这些冒号是第一个 (或 config_tf) 和最后一个 (vpe_dns_forwarding_rules_tf) 的速记。 -p 打印层:./apply.sh -p : :
-
应用第一部分中和上面描述的所有层 (即使从第一部分继续使用此命令以使用配置更改
all_firewall = true
重新应用初始层)。./apply.sh : spokes_egress_tf
如果您在第一部分中关注某些其他入口路由,那么会将这些其他入口路由添加到中转入口路由表中,以避免通过防火墙路由器进行路由。 在此步骤中,已除去这些项,并且传输入口路由表仅包含这些条目,以便将区域的所有入局流量路由到同一区域中的防火墙路由器。 您的 下一个中继段 地址可能不同,但将是防火墙路由器实例的 IP 地址:
区域 | 目标 | 下一个中继段 |
---|---|---|
Dallas10.1.0.0/1610.1.15.196 | ||
Dallas10.2.0.0/1610.2.15.196 | ||
Dallas10.3.0.0/1610.3.15.196 |
要观察此情况:
- 在 IBM Cloud中打开 VPC。
- 选择 传输 VPC 并注意显示的地址前缀。
- 点击管理路由表
- 单击 tgw-ingress Transit Gateway 入口路由表
将辐射和传输路由到防火墙-路由器
通过辐条默认出口路由表中的这些路由(如 Dallas/us-south 所示),可将源于辐条的所有云流量路由至与源实例位于同一区域的中转 VPC 防火墙路由器:
区域 | 目标 | 下一个中继段 |
---|---|---|
Dallas10.0.0.0/810.1.15.196 | ||
Dallas10.0.0.0/810.2.15.196 | ||
Dallas10.0.0.0/810.3.15.196 |
同样,在传输 VPC 中,将所有企业和云流量通过防火墙路由器 (与发端实例位于同一专区中) 进行路由。 例如,尝试与 10.2.0.4 (辐射 0,区域 2) 连接的传输测试实例 10.1.15.4 (传输区域 1) 将通过区域 1 中的防火墙路由器发送: 10.1.15.196。
转接默认出口路由表中的路由(显示为 Dallas/us-south):
区域 | 目标 | 下一个中继段 |
---|---|---|
Dallas10.0.0.0/810.1.15.196 | ||
Dallas10.0.0.0/810.2.15.196 | ||
Dallas10.0.0.0/810.3.15.196 | ||
Dallas192.168.0.0/1610.1.15.196 | ||
Dallas192.168.0.0/1610.2.15.196 | ||
Dallas192.168.0.0/1610.3.15.196 |
请勿将内部 VPC 流量路由到防火墙路由器
在此示例中,Intra-VPC 流量不会通过防火墙路由器。 例如,辐射 0 中的资源可以直接连接到辐射 0 上的其他资源。 要完成此额外的更具体的路由,可以添加以委派内部流量。 例如,在具有 CIDR 范围 10.1.0.0/24,10.2.0.0/24和 10.3.0.0/24 的辐射 0 中,可以委派内部路由。
轮辐 0 的默认出口路由表中的路由(显示为 Dallas/us-south):
区域 | 目标 | 下一个中继段 |
---|---|---|
Dallas 1 | 10.1.0.0/24 | delegate |
Dallas 1 | 10.2.0.0/24 | delegate |
Dallas 1 | 10.3.0.0/24 | delegate |
Dallas 2 | 10.1.0.0/24 | delegate |
Dallas 2 | 10.2.0.0/24 | delegate |
Dallas 2 | 10.3.0.0/24 | delegate |
Dallas 3 | 10.1.0.0/24 | delegate |
Dallas 3 | 10.2.0.0/24 | delegate |
Dallas 3 | 10.3.0.0/24 | delegate |
在过境和其他辐条上增加了类似的路线。
防火墙子网
防火墙-路由器本身呢? 前面没有提到这一点,但由于预期会发生此更改,因此在传输 VPC 中创建了一个 egress_Delegate 路由器,用于将路由委派给所有目标的缺省路由。 它仅与防火墙-路由器子网相关联,因此防火墙-路由器不受其他子网所使用的缺省出口路由表的更改影响。 请检查传输 VPC 的路由表以获取更多详细信息。 访问 IBM Cloud 控制台中的 VPC。 选择传输 VPC,然后单击 管理路由表,单击 出口-委派 路由表,单击 子网 选项卡,并记下用于防火墙路由器的 -fw 子网。
应用并测试更多防火墙
-
应用层:
./apply.sh all_firewall_tf
-
运行测试套件。
您的预期结果为: cross zone transit <-> spoke and spoke <-> spoke will be 失败:
pytest -m "curl and lz1 and (rz1 or rz2)"
修订跨区域路由
如前所述,要使系统具有跨区域故障的弹性,最好消除跨区域流量。 如果需要跨区域支持,那么可以添加其他出口路径。 下图中显示了辐射 0 到辐射 1 流量的问题:
绿色路径是发起方辐射 0 区域 2 10.2.0.4 路由到辐射 1 区域 1 10.1.1.4的示例。 匹配的出口路径为:
区域 | 目标 | 下一个中继段 |
---|---|---|
Dallas10.0.0.0/810.2.15.196 |
选择图的中间区域区域 2 中的防火墙路由器向左向右移动。 在返回路径区域 1 上已选择。
要解决此问题,需要添加一些更具体的路由,以在指定了较低区域编号目标时强制较高区域路由到较低区域编号防火墙。 引用相同或更高编号的区域时,将继续路由到同一区域中的防火墙。
每个轮辐默认出口路由表中的路由(显示为 Dallas/us-south):
区域 | 目标 | 下一个中继段 |
---|---|---|
Dallas10.1.0.0/1610.1.15.196 | ||
Dallas10.1.0.0/1610.1.15.196 | ||
Dallas10.2.0.0/1610.2.15.196 |
These routes are also going to correct a similar transit <--> spoke cross zone asymmetric routing problem. 请考虑中转工作程序 10.1.15.4-> 辐射工作程序 10.2.0.4。 来自区域 1 中的传输工作程序的流量将选择区域 1 (同一区域) 中的防火墙路由器。 返回时,将使用区域 2 (同一区域) 中的防火墙路由器,现在将使用区域 1 中的防火墙路由器。
-
应用 all_firewall_asym 层:
./apply.sh all_firewall_asym_tf
-
运行测试套件。
您的预期结果是: 所有测试 通过,并行运行 (-n 10):
pytest -n 10 -m curl
现在,VPC 之间的所有流量都通过防火墙路由器进行路由。
高性能高可用性 (HA) 防火墙-路由器
为了防止防火墙路由器成为性能瓶颈或单点故障,可以添加 VPC 网络负载均衡器以将流量分发到分区防火墙路由器,从而创建高可用性,HA 和防火墙路由器。 请检查防火墙路由器文档以验证它是否支持此体系结构。
此图显示以 路由方式 在两个防火墙路由器前配置了网络负载均衡器 (NLB) 的单个区域。 要查看此构造,需要更改配置并再次应用。
-
在 config_tf/terraform.tfvars: 中更改这两个变量
firewall_nlb = true number_of_firewalls_per_zone = 2
此更改将导致防火墙路由器的 IP 地址从先前使用的防火墙路由器实例更改为 NLB 的 IP 地址。 需要将 IP 地址更改应用于传输和辐射 VPC 中的多个 VPC 路由表路由。 最好应用之前应用的所有层:
-
通过all_firewall_非对称 _tf 层应用所有层:
./apply.sh : all_firewall_asym_tf
观察所做的更改:
- 打开 VPC 负载均衡器。
- 选择区域 1(Dallas1/us-south-1)中的负载平衡器,其后缀为 fw-z1-s3。
- 请注意 专用 IP。
将专用 IP 与传输 VPC 入口路由表中的 IP 进行比较:
- 打开 虚拟私有云。
- 选择运输 VPC。
- 单击 管理路由表。
- 单击 tgw-ingress 路由表。 请注意,下一个中继段 IP 地址与其中一个 NLB 专用 IP 匹配
验证弹性:
- 运行辐射 0 区域 1 测试:
pytest -k r-spoke0-z1 -m curl
- 打开 VPC 的虚拟服务器实例
- 通过指定不允许入站端口 80 的安全组,停止到 0 防火墙实例的流量。 找到后缀为 fw-z1-s3-0 的实例,然后打开详细信息视图:
- 向下滚动并点击 网络接口 旁边的画笔编辑
- 取消选中 x-fw-inall-outall
- 检查 x-fw-in22-outall
- 单击保存。
- 再次运行 pytest。 它将指示失败。 NLB 需要几分钟才能停止将流量路由到无响应实例,此时所有测试都将通过。 继续等待并运行 pytest,直到所有测试通过为止。
不再需要 NLB 防火墙。 除去 NLB 防火墙:
-
在 config_tf/terraform.tfvars: 中更改这两个变量
firewall_nlb = false number_of_firewalls_per_zone = 1
-
通过all_firewall_非对称 _tf 层应用所有层:
./apply.sh : all_firewall_asym_tf
关于在路由方式下配置的 NLB 的说明
NLB 路由方式将重写路由表条目-在故障转移期间始终保留路由表中的活动 NLB 设备 IP 地址。 但是,仅对包含 NLB 的中转 VPC 中的路线执行此操作。 该辐射具有使用其中一个 NLB 设备 IP 初始化的出口路径。 不会在 NLB 设备故障转移上更新发言的下一个中继段!
需要在传输 VPC 中维护入口路径,NLB 将重写该路径以反映活动设备。 辐射出口路由将把包传递到传输 VPC 的正确区域。 在传输 VPC 区域内的路由将找到将包含活动设备的匹配入口规则。
下面是前面讨论的中转 VPC 入口路由表。 下一个中继段将与活动 NLB 设备保持最新。 请注意,NLB 路由模式服务写入了一项更改▄■▄,以反映活动设备。
区域 | 目标 | 下一个中继段 |
---|---|---|
Dallas10.0.0.0/810.1.15.196 | ||
Dallas10.0.0.0/810.2.15.196 | ||
Dallas10.0.0.0/810.3.15.197 |
NLB 要求创建允许 NLB 写入 VPC 的 IAM 授权。 此授权由 apply.sh
脚本创建。 有关脚本执行的配置的更多详细信息,请参阅 使用路由方式创建网络负载均衡器。
必须在将 会话持久性类型 设置为空的情况下配置路由方式 NLB 池。
DNS
IBM Cloud DNS Services 服务用于将名称转换为 IP 地址。 在此示例中,将在云中创建 DNS 服务。 将创建 DNS 区域 cloud.example.com
,并将传输 VPC 添加为允许的网络。 云实例的 DNS 记录将添加到 cloud.example.com。 例如,将为区域 1 中的辐射 0 工作程序创建一条记录,该记录将具有全名 spoke0-z1-worker.cloud.example.com。
查看 关于 VPE 网关的 DNS 共享。 传输 VPC 已作为 DNS 中心启用。 每个辐射 VPC 都配置有与传输 VPC 集线器的 DNS 解析绑定。 这会将 DNS 服务器的辐射 VPC DHCP 设置配置为传输 VPC 定制解析器。
DNS 资源
应用 dns_tf 层为传输 VPC 和辐射 VPC 中的每个测试实例创建添加云 DNS 区域和 A 记录。 还会为企业模拟创建 DNS 实例。
./apply.sh dns_tf
检查创建的 DNS 服务:
- 在 IBM Cloud 控制台中打开 资源列表。
- 展开 联网 部分,并注意到 DNS Services。
- 找到并单击以打开后缀为 Transit 的实例。
- 单击 DNS 区域 cloud.example.com。 请注意与运输和轮辐中的每个测试实例关联的 A 记录。
- 单击左侧的 定制解析器 选项卡,并注意解析器位于每个专区中。
- 单击 转发规则 选项卡并注意转发规则。 请注意,
enterprise.example.com
已转发到本地解析器。
检查传输和辐射 VPC 并注意 DNS 配置:
- 打开 VPC
- 请注意,传输 VPC 具有
DNS-Hub
指示符集。 - 请注意,每个辐射 VPC 都具有
DNS-Shared
指示符集。 - 单击其中一个辐射 VPC。
- 向下滚动到 可选 DNS 设置
- 打开 DNS 解析器设置 折叠标记,并注意 DNS 解析器类型为
delegated
,DNS 解析器服务器位于传输 VPC 10.1.15.x,10.2.15.y,10.2.15.z - 打开 DNS 解析绑定 折叠标记,并通知 DNS 中心 VPC 已设置为传输 VPC。
DNS 测试
在 pytest 脚本中提供了一组 curl DNS 测试。 这些测试将使用远程服务器的 DNS 名称进行 curl。 有不少这样并行运行测试:
pytest -n 10 -m dns
虚拟专用端点网关
VPC 允许通过 Virtual Private Endpoint (VPE) for VPC 对 IBM Cloud 服务进行专用访问。 VPE 网关允许通过标准 IBM Cloud VPC 控件进行细粒度网络访问控制:
将为每个 VPC VPE 网关创建 DNS 区域。 DNS 区域将自动添加到与 VPC 关联的专用 DNS 服务。 每个辐射 VPC 都具有到传输 VPC 的 DNS 配置 bound
。 这使辐射 VPE DNS 区域能够共享到传输 VPC。
-
通过应用 vpe_transit_tf 和vpe_发言人 _tf 层,为传输和每个辐射 VPC 创建 IBM Cloud Databases for PostgreSQL 实例和 VPE:
./apply.sh vpe_transit_tf vpe_spokes_tf
-
在 pytest 脚本中提供了一组 vpe 和 vpedns 测试。 vpedns 测试将验证 Databases for PostgreSQL 实例的 DNS 名称是否位于外层 VPC 的专用 CIDR 块中。 vpe 测试将执行 psql 命令以远程访问 Databases for PostgreSQL 实例。 从辐射 0 区域 1 测试 vpe 和 vpedns:
- 预期结果所有测试都通过
pytest -m 'vpe or vpedns' -k spoke0-z1
本教程中的所有测试现在都应该通过。 有不少。 并行运行这些命令:
pytest -n 10
生产说明和结论
IBM Cloud for Financial Services 的 VPC 参考体系结构 提供了有关保护 IBM Cloud中工作负载的更多详细信息。
要进行的一些明显更改:
- 选择 CIDR 块是为了澄清和便于解释。 多专区区域中的可用性专区可以是 10.1.0.0/10,10.64.0.0/10,10.128.0.0/10 以节省地址空间。 同样,工作程序节点的地址空间可以以防火墙,DNS 和 VPE 空间为代价进行扩展。
- 应该仔细考虑工作程序 VSI,虚拟专用端点网关,DNS 位置和防火墙的每个网络接口的安全组。
- 应仔细考虑每个子网的网络访问控制表。
- 浮动 IP 已连接到所有测试实例,以支持通过 SSH 进行的连接测试。 这在生产中是不需要的或不可取的。
- 实施基于上下文的限制 规则以进一步控制对所有资源的访问。
在本教程中,您创建了一个中心 VPC 和一组辐射 VPC。 您通过传输 VPC 防火墙路由器路由了所有跨 VPC 流量。 为传输 VPC 中心创建了 DNS 服务,并且每个辐射 VPC 都是与传输 VPC 绑定的 DNS。
除去资源
使用 ./apply.sh
命令以逆向顺序在所有目录中执行 terraform destroy
:
./apply.sh -d : :
扩展教程
您的体系结构可能与所呈现的体系结构不同,但可能是从此处讨论的基本组件构造的。 展开本教程的构想:
- 使用 IBM Cloud® Internet Services 集成入局公共因特网访问。
- 在传输中添加 Flow Logs for VPC capture。
- 将每个辐条放在 企业 中的单独帐户中。
- 强制某些辐条通过防火墙的辐条流量,而某些辐条不通过防火墙的辐条流量。
- 将工作程序 VSI 替换为 Red Hat OpenShift on IBM Cloud 和 VPC 负载均衡器。
- 强制通过传输 VPC 中的防火墙和 公共网关 的所有出站流量。