透過 VPC Transit Hub and Spoke 架構集中通訊 - 第二部分

本指導教學可能會產生成本。 使用「成本估算器」根據您的預計用量生成成本估算。

Virtual Private Cloud (VPC) 在 IBM Cloud中提供網路隔離及安全。 VPC 可以是封裝公司部門(行銷、開發、會計等)的構建塊,也可以是企業擁有的微服務集合。DevSecOps團隊。 VPC 可以連接至內部部署企業及彼此。 這可能需要透過集中式防火牆閘道應用裝置來遞送資料流量。 本指導教學將逐步執行此高階視圖中所描述的 Hub 與輪輻架構的實作:

vpc-transit-overview
教程架構圖

這是兩部分指導教學的第二部分。 此部分將著重於透過傳輸中心防火牆路由器在 VPC 之間遞送所有資料流量。 討論並實作使用網路負載平衡器的可調式防火牆路由器。 使用「虛擬專用端點 (VPE)」閘道,將專用 DNS 用於微服務識別及 IBM Cloud 服務實例識別。

本指導教學是獨立式,因此不需要執行 第一部分 中的步驟。 如果您不熟悉 IBM Cloud中的網路 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 的位址空間。 區域型架構如下所示:

區域
區域

此圖顯示車流。 Only the enterprise <-> spoke is passing through the firewall:

車流
車流

這是透過 Direct Link、Transit Gateway 及 VPC 遞送來達成。 所有區域都以類似方式配置,下圖顯示區域 1 的詳細資料:

VPC 佈置
VPC 佈置

CIDR 10.1.0.0/16 涵蓋運輸及輪輻,並透過 Direct Link 傳遞至企業作為通告路徑。 同樣地,CIDR 192.168.0.0/24 涵蓋企業,並透過 Transit Gateway 傳遞至輪輻作為通告路徑。

輪輻中的 Egress 路徑會將資料流量遞送至防火牆路由器。 Ingress routes in the transit route enterprise <-> spoke traffic through the firewall-router.

佈建起始 VPC 資源,透過防火牆-路由器遞送所有內部 VPC 資料流量

企業通常使用 Transit 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 中的配置。

套用層

  1. 隨附的 GitHub 儲存庫 具有用來實作架構的原始檔。 在桌面 Shell 中複製儲存庫:

    git clone https://github.com/IBM-Cloud/vpc-transit
    cd vpc-transit
    
  2. config_tf 目錄包含您需要配置的配置變數。

    cp config_tf/template.terraform.tfvars config_tf/terraform.tfvars
    
  3. 編輯 config_tf/terraform.tfvars

    • 進行必要的變更。
    • 變更值 all_firwewall = true
  4. 如果還沒有,請取得 Platform API 金鑰,並匯出 API 金鑰供 Terraform 使用:

    export IBMCLOUD_API_KEY=YourAPIKEy
    
  5. 由於每一層都以正確的順序安裝很重要,本指導教學中的部分步驟將安裝多層,因此提供 Shell 指令 。/apply.sh。 下列將顯示說明:

    ./apply.sh
    
  6. 您可以執行 ./apply.sh : :來套用所有已配置的層。 冒號是第一個 (或 config_tf) 和最後一個 (vpe_dns_forwarding_rules_tf) 的速記。 -p 會列印層:

    ./apply.sh -p : :
    
  7. 套用上述第一部分中的所有層 (即使從第一部分繼續使用此指令,在配置變更 all_firewall = true 的情況下重新套用起始層)。

    ./apply.sh : spokes_egress_tf
    

如果您在部分 1 中繼續追蹤,則會將一些額外的進入路徑新增至傳輸進入路徑表格,以避免透過防火牆路由器進行遞送。 在此步驟中,這些已移除,且傳輸進入路由表只有這些項目,因此區域的所有送入資料流量都會遞送至相同區域中的防火牆路由器。 您的 下一個中繼站 位址可能不同,但將會是防火牆路由器實例的 IP 位址:

區域 目的地 下一個中繼站
達拉斯 1 10.1.0.0/16 10.1.15.196達拉斯 2

若要觀察,請執行下列動作:

  1. 在 IBM Cloud中開啟 VPC
  2. 選取 Transit VPC,並注意顯示的位址字首。
  3. 按一下管理路由表
  4. 按一下 tgw-ingress Transit Gateway Ingress Route 表格

將輪輻及傳輸遞送至防火牆-路由器

透過與原始實例位於同一區域中的中轉 VPC 防火牆路由器路由源自分支的所有雲端流量,這是透過分支預設出口路由表中的這些路由完成的(針對達拉斯/美國南部顯示):

區域 目的地 下一個中繼站
達拉斯 1 10.0.0.0/8 10.1.15.196達拉斯 2

同樣地,在傳輸 VPC 中-透過與原始實例相同區域中的防火牆路由器,遞送所有企業及雲端資料流量。 例如,嘗試連接 10.2.0.4 (輪輻 0,區域 2) 的傳輸測試實例 10.1.15.4 (傳輸區域 1) 將透過區域 1 中的防火牆路由器傳送: 10.1.15.196。

傳輸中路由的預設出口路由表(針對達拉斯/美國南部顯示):

區域 目的地 下一個中繼站
達拉斯 1 10.0.0.0/8 10.1.15.196達拉斯 2

不要將內部 VPC 資料流量遞送至防火牆-路由器

在此範例中,內部 VPC 資料流量將不會通過防火牆路由器。 例如,輪輻 0 中的資源可以直接連接至輪輻 0 上的其他資源。 若要達成此額外的特定路徑,可以新增以委派內部資料流量。 例如,在輪輻 0 中,具有 CIDR 範圍: 10.1.0.0/24、10.2.0.0/24、10.3.0.0/24 可以委派內部路由。

分支 0 的預設出口路由表中的路由(針對達拉斯/美國南部顯示):

區域 目的地 下一個中繼站
達拉斯1 10.1.0.0/24 delegate 1

類似的路線會新增至運輸及其他輪輻。

防火牆子網路

防火牆路由器本身呢? 先前未提及這一點,但預期此變更,在 Transit VPC 中建立了 egress_delegate 路由器,該路由器將遞送至所有目的地的預設值。 它只與防火牆路由器子網路相關聯,因此其他子網路使用的預設 Egress 遞送表變更不會影響防火牆路由器。 如需詳細資料,請檢查 Transit VPC 的路由表。 請造訪 IBM Cloud 主控台中的 VPC。 選取 Transit VPC,然後按一下 管理遞送表,按一下 egress-delegate 遞送表,按一下 子網路 標籤,並記下用於防火牆路由器的 -fw 子網路。

套用並測試其他防火牆

  1. 套用層:

    ./apply.sh all_firewall_tf
    
  2. 執行測試套組。

    您預期的結果如下: 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的範例。 相符的輸出路徑為:

區域 目的地 下一個中繼站
達拉斯 2 10.0.0.0/8 10.2.15.196

選取圖表中間區域 (區域 2) 中的防火牆路由器,由左至右移動。 在傳回路徑區域 1 上已選取。

若要修正此問題,需要新增一些更具體的路徑,以強制較高號碼區域在指定較低區域號碼目的地時遞送至較低區域號碼防火牆。 當參照相同或更高編號的區域時,會繼續遞送至相同區域中的防火牆。

啟用跨區域遞送
啟用跨區域遞送

每個分支的預設出口路由表中的路由(針對達拉斯/美國南部顯示):

區域 目的地 下一個中繼站
達拉斯 2 10.1.0.0/16 10.1.15.196達拉斯 3

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 中的防火牆路由器。

  1. 套用 all_firewall_asym 層:

    ./apply.sh all_firewall_asym_tf
    
  2. 執行測試套組。

    您的預期結果是: 所有測試透過,並行運行它們(-n 10):

    pytest -n 10 -m curl
    

VPC 之間的所有資料流量現在都透過防火牆路由器遞送。

高效能高可用性 (HA) 防火牆-路由器

若要防止防火牆路由器變成效能瓶頸或單一失敗點,可以新增 VPC 網路負載平衡器,將資料流量配送至區域防火牆路由器,以建立高可用性、HA 防火牆路由器。 請檢查您的防火牆路由器文件,以驗證它是否支援此架構。

高可用性防火牆
高可用性防火牆

此圖顯示在 路由模式 中配置「網路負載平衡器 (NLB)」並在兩個防火牆路由器前面的單一區域。 若要查看此建構,需要變更配置並重新套用。

  1. 在 config_tf/terraform.tfvars: 中變更這兩個變數

    firewall_nlb                 = true
    number_of_firewalls_per_zone = 2
    

    此變更會導致防火牆路由器的 IP 位址從先前使用的防火牆路由器實例變更為 NLB 的 IP 位址。 IP 位址變更需要套用至傳輸及分支 VPC 中的許多 VPC 路由表路由。 最好套用先前套用的所有層:

  2. 透過 all_firewall_asym_tf 層套用所有層:

    ./apply.sh : all_firewall_asym_tf
    

觀察所做的變更:

  1. 開啟 VPC 的負載平衡器
  2. 選擇區域 1 (Dallas 1/us-south-1 ) 中的負載平衡器,其後綴為 fw-z1-s3
  3. 請注意 專用 IP

將「專用 IP」與 Transit VPC Ingress Route 表格中的 IP 進行比較:

  1. 開啟 虛擬私有雲
  2. 選取 Transit VPC。
  3. 按一下 管理遞送表
  4. 按一下 tgw-ingress 遞送表。 請注意 下一個中繼站 IP 位址符合其中一個 NLB 專用 IP

驗證備援:

  1. 執行輪輻 0 區域 1 測試:
    pytest -k r-spoke0-z1 -m curl
    
  2. 開啟 VPC 的虛擬伺服器實例
  3. 透過指定不容許入埠連接埠 80 的安全群組,停止流向 0 防火牆實例的資料流量。 尋找字尾為 fw-z1-s3-0 的實例,然後開啟詳細資料視圖:
    1. 向下捲動並按一下 網路介面 旁邊的鉛筆編輯
    2. 取消勾選 x-fw-inall-outall
    3. 檢查 x-fw-in22-outall
    4. 按一下儲存
  4. 再次執行 pytest。 它將指出失敗。 NLB 停止將資料流量遞送至無回應實例需要幾分鐘的時間,此時所有測試都會通過。 繼續等待並執行 pytest,直到所有測試都通過為止。

不再需要 NLB 防火牆。 移除 NLB 防火牆:

  1. 在 config_tf/terraform.tfvars: 中變更這兩個變數

    firewall_nlb                 = false
    number_of_firewalls_per_zone = 1
    
  2. 透過 all_firewall_asym_tf 層套用所有層:

    ./apply.sh : all_firewall_asym_tf
    

關於在遞送模式中配置 NLB 的附註

NLB 路由模式將重寫路由表項目-在失效接手期間一律保留路由表中的作用中 NLB 應用裝置 IP 位址。 但只有包含 NLB 的 Transit VPC 中的路由才會這麼做。 分支具有已使用其中一個 NLB 應用裝置 IP 起始設定的輸出路徑。 將不會在 NLB 應用裝置失效接手上更新輪輻下一個中繼站!

需要在 Transit VPC 中維護入口路徑,NLB 將重新編寫以反映作用中應用裝置。 輪輻輸出路徑會將封包遞送至傳輸 VPC 的正確區域。 在 Transit VPC 區域內遞送將會找到包含作用中應用裝置的相符入口規則。

以下是先前討論的 Transit VPC Ingress Route 表格。 下一個躍點將與作用中 NLB 應用裝置保持最新。 請注意,Dallas 3 具有由 NLB 路由模式服務寫入的更改,以反映活動設備。

區域 目的地 下一個中繼站
達拉斯 1 10.0.0.0/8 10.1.15.196達拉斯 2

NLB 需要建立 IAM 授權,以容許 NLB 寫入 VPC。 此授權由 apply.sh Script 建立。 如需 Script 所執行配置的詳細資料,請參閱 使用遞送模式建立網路負載平衡器

路由模式 NLB 儲存區必須配置成將 階段作業持續性類型 設為空值。

DNS

IBM Cloud DNS Services 服務用來將名稱轉換為 IP 位址。 在此範例中,會在雲端中建立 DNS 服務。 即會建立 DNS 區域 cloud.example.com,並將 Transit VPC 新增為允許的網路。 雲端實例的 DNS 記錄會新增至 cloud.example.com。 例如,在區域 1 中為輪輻 0 工作者建立了完整名稱 spoke0-z1-worker.cloud.example.com的 A 記錄。

檢閱 關於 VPE 閘道的 DNS 共用。 Transit VPC 已啟用為 DNS 中心。 每一個輪輻 VPC 都配置有與 Transit VPC 中心的 DNS 解析連結。 這會將 DNS 伺服器的輪輻 VPC DHCP 設定配置成傳輸 VPC 自訂解析器。

DNS 佈置
DNS 佈置

DNS 資源

套用 dns_tf 層,以針對 Transit VPC 及輪輻 VPC 中的每一個測試實例建立雲端 DNS 區域及 A 記錄。 也會為企業模擬建立 DNS 實例。

./apply.sh dns_tf

檢查已建立的 DNS 服務:

  1. 在 IBM Cloud 主控台中開啟 資源清單
  2. 展開 網路 區段,並注意 DNS Services
  3. 尋找並按一下以開啟字尾為 transit 的實例。
  4. 按一下 DNS 區域 cloud.example.com。 請注意與運輸及輪輻中每一個測試實例相關聯的 A 記錄。
  5. 按一下左側的 自訂解析器 標籤,並注意解析器位於每一個區域中。
  6. 按一下 轉遞規則 標籤,並注意轉遞規則。 請注意,enterprise.example.com 會轉遞至內部部署解析器。

檢查傳輸及分支 VPC,並注意 DNS 配置:

  1. 開啟 VPC
  2. 請注意,Transit VPC 已設定 DNS-Hub 指示器。
  3. 請注意,每一個輪輻 VPC 都已設定 DNS-Shared 指示器。
  4. 按一下其中一個輪輻 VPC。
    1. 向下捲動至 選用 DNS 設定
    2. 開啟 DNS 解析器設定 展開/收合,並注意 DNS 解析器類型是 delegated,且 DNS 解析器伺服器位於傳輸 VPC 10.1.15.x、10.2.15.y、10.2.15.z
    3. 開啟 DNS 解析連結 展開/收合,並通知 DNS 中心 VPC 已設為傳輸 VPC。

DNS 測試

在 pytest Script 中有一組可用的 curl DNS 測試。 這些測試將使用遠端的 DNS 名稱 curl。 有相當多的測試因此平行執行:

pytest -n 10 -m dns

虛擬專用端點閘道

VPC 容許透過 Virtual Private Endpoint (VPE) for VPC 對 IBM Cloud Services 進行專用存取。 VPE 閘道容許透過標準 IBM Cloud VPC 控制項進行細晶網路存取控制:

會為每一個 VPC VPE 閘道建立 DNS 區域。 DNS 區域會自動新增至與 VPC 相關聯的專用 DNS 服務。 每一個輪輻 VPC 都具有對傳輸 VPC 的 DNS 配置 bound。 這可讓輪輻 VPE DNS 區域與傳輸 VPC 共用。

新增虛擬專用端點閘道
新增虛擬專用端點閘道

  1. 套用 vpe_transit_tf 及 vpe_agres_tf 層,以建立 IBM Cloud Databases for PostgreSQL 實例及 VPE,以用於傳輸及每一個輪輻 VPC:

    ./apply.sh vpe_transit_tf vpe_spokes_tf
    
  2. pytest Script 中有一組 vpevpedns 測試。 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。 您透過 Transit VPC 防火牆路由器遞送所有跨 VPC 資料流量。 已為傳輸 VPC 中心建立 DNS 服務,且每一個分支 VPC 都已 DNS 連結至傳輸 VPC。

移除資源

使用 ./apply.sh 指令,以相反順序在所有目錄中執行 terraform destroy :

./apply.sh -d : :

擴展指導教學

您的架構可能與所呈現的架構不同,但可能是從這裡所討論的基本元件來建構。 展開本指導教學的構想: