Skip to content

Azure VPN Gateway 實踐 BGP + 線路備援: 以 FortiGate 為例

本文提供如何建立 IPsec VPN 及 BGP 連線路由,從地端 ForiGate 到 Azure VPN Gateway (Active-Active + BGP + 線路備援) 過程,適合你地端有 IPS 會遇到非對稱路由的問題時,你可以改採用 Active / Standby 線路架構,倘若你有想要參考 ECMP 的做法,可參閱之前寫的文章 Azure VPN Gateway 實踐 BGP + ECMP: 以 FortiGate 為例

(社群工商時間) Kubernetes Community Days Taipei 2024

最近正在開始籌備 Kubernetes Community Days Taipei 2024,下面是幾個明確的時程表:

  • KCD Taipei 2024 CFP 開始: 2024/3/31
  • KCD Taipei 2024 CFP 結束: 2024/5/9
  • KCD Taipei 2024 議程發布: 2024/7/7
  • COSCUP 2024 活動舉辦: 2024/8/3 - 2024/8/4

我們最近 一群用愛發電的阿宅們持續抓頭找贊助中,如果你是個人想要捐一份心意的話,歡迎可以到我們的 Cloud Native Taiwan User Group 社群專戶 支持一下我們,社群永續發展需要你、我、乾爹、乾媽的一起努力

總體架構圖

建議下載這張圖對照下面設定,IP 和名稱是可以對齊下面的所有內容和設定

然後分為 2 個角度處理

  1. 雲端 Azure 方
  2. 地端 FortiGate 方

A. 雲端 Azure 方

1. 選大本營,開始挖網路

你需要先選定其中一個 Azure Region 區域,並且建立一個新的 Virtual Network 網段,並且在裡面建立一個保留子網段 GatewaySubnet,且最小的網段大小為 /27

如本圖是在 Azure Region: Japan East 建立 Virtual Network 名稱為 vnet-hub-japaneast 10.0.0.0/24,根據 Visual Subnet Calculator (Azure Edition) 的計算,可以在這個網段內再建立一個 10.0.0.0/27 的子網段,且使用保留子網段名稱為 GatewaySubnet

一般我都會說這樣子的環境就是 Hub-Spoke 網路架構的 Hub 部分

2. 建立 Azure VPN Gateway

因為 Azure VPN Gateway 的參數選擇會影響到後續架構的設計,我建議先從下面這種正常方式開局.也是最通用的架構

按照這個設定來說,因 GatewaySubnet 是 10.0.0.0/27,可以分析一下這網段在幹嘛

服務 IP 作用
Azure 10.0.0.1 Gateway IP
Azure 10.0.0.2 保留給 DNS 用
Azure 10.0.0.3 保留給 DNS 用
VPN IN_O 10.0.0.4 IN_0 的 BGP Peering IP,這晚一點會用到
VPN IN_1 10.0.0.5 IN_1 的 BGP Peering IP,這晚一點會用到

3. 建立 Local Network Gateway

1 個 Local Network Gateay 只能描述 1 個地端對外 IP 和 1 個 BGP Peering 資訊

這頁設定是要來描述地端設備的基本參數,你需要先知道你

Local Network Gateway 個數 = 有多少 WAN Port 要連上來 * 該設備有多少個 BGP 需要跟 Azure Peering * 站點數量

譬如說上圖就是,我只有 1 個 WAN Port 對外,我也只有一個 BGP 65510 需要跟 Azure Peering,站台數量總共也才 1 個,所以我只需要建立一個 Local Network Gateway 即可

我知道有人家裡是 2 個 WAN Port 然後不同 ISP,所以按照上面邏輯,你需要建立 2 個 Local Network Gateway

4. 用 Connection 連接 Local Network Gateway 和 Azure VPN Gateway

這頁主要是在描述 Azure VPN Gateway 的具體參數要怎麼跟地端設備連接,基本上沒意外都是預設值,如果有問題的話,建議看你地端設備的 IPsec / IKE policy 有沒有什麼長得很不一樣的要特別調整,通常建立不起來的主要原因是兩邊的加密選擇對不起來,要特別調整

B. 地端 FortiGate 方

因為我家只有 FortiGate 可以用,所以下面就以 FortiGate 的設備為主,如果你是其他家的設備也可以自行參考,我都是用基本設定,大部分都沒用什麼特殊的黑魔法

此外,因為我本身也不是專精 FortiGate,都是受客戶驅動才去買了一台回家自己搞,如果有任何設定不合理或者是漏了,歡迎指正,我會非常感謝你,台灣很多甲方同行也會很多人會感謝你

0. 版本資訊

  • ForiOS v6.4

1. 盤一下介面

system-interface
homecloud-fgt # show system interface
config system interface
    edit "wan1"
        set vdom "root"
        set mode pppoe
        set allowaccess ping
        set type physical
        set lldp-reception disable
        set monitor-bandwidth enable
        set role wan
        set snmp-index 1
        set username "[email protected]"
        set password ENC tifaismywife
    next
    edit "loopback" # (1)
        set vdom "root"
        set ip 1.2.3.4 255.255.255.255 # (4)
        set allowaccess ping https ssh http
        set bfd enable # (5)
        set type loopback
        set role lan
        set snmp-index 15
    next
    edit "azure-tunnel-1" # (2)
        set vdom "root"
        set allowaccess ping
        set type tunnel
        set snmp-index 19
        set interface "wan1"
    next
    edit "azure-tunnel-2" # (3)
        set vdom "root"
        set allowaccess ping
        set type tunnel
        set snmp-index 20
        set interface "wan1"
    next
  1. 利用 loopback interface 永遠都是 UP 的特性和提供多條實體或虛擬線路中進行負載平衡或冗餘的特性,來提供 BGP Peering 的 IP 位置,而非採用 Interface IP 來提供
  2. 這個需要等 IPsec 建立之後才會出現
  3. 這個需要等 IPsec 建立之後才會出現
  4. 我想大家都專業的,你也知道我這是亂寫的,不要認真
  5. Azure VPN Gateway 本身沒支援 BFD,但 ExpressRoute Gateway 有

2. 挖 IPsec Tunnel

就是照著官方文件寫 FortiGate - IPsec VPN to Azure with virtual network gateway 設定即可,基本上沒啥太大問題

phase 1
homecloud-fgt # show vpn ipsec phase1-interface
config vpn ipsec phase1-interface
    edit "azure-tunnel-1"
        set interface "wan1"
        set ike-version 2
        set keylife 28800
        set peertype any
        set net-device disable
        set proposal aes256-sha1 3des-sha1 aes256-sha256
        set dpd on-idle
        set dhgrp 2
        set nattraversal disable
        set remote-gw <Azure VPN Public IP IN_0>
        set psksecret ENC n0gam3n0l1f3
    next
    edit "azure-tunnel-2"
        set interface "wan1"
        set ike-version 2
        set keylife 28800
        set peertype any
        set net-device disable
        set proposal aes256-sha1 3des-sha1 aes256-sha256
        set dpd on-idle
        set dhgrp 2
        set nattraversal disable
        set remote-gw <Azure VPN Public IP IN_1>
        set psksecret ENC n0gam3n0l1f3
    next
end
phase 2
homecloud-fgt # show vpn ipsec phase2-interface
config vpn ipsec phase2-interface
    edit "azure-tunnel-1"
        set phase1name "azure-tunnel-1"
        set proposal aes256-sha1 3des-sha1 aes256-sha256
        set pfs disable
        set auto-negotiate enable # (1)
        set keylifeseconds 27000
    next
    edit "azure-tunnel-2"
        set phase1name "azure-tunnel-2"
        set proposal aes256-sha1 3des-sha1 aes256-sha256
        set pfs disable
        set auto-negotiate enable # (2)
        set keylifeseconds 27000
    next
end
  1. 這個官方文件沒寫,但我有加,主要是為了 keepalive enable,這個看起來是藏起來的參數
  2. 這個官方文件沒寫,但我有加,主要是為了 keepalive enable,這個看起來是藏起來的參數

3. 開通 Firewall Policy

每一條 Tunnel 最少都要有 2 個 Policy,去跟回都要,因為 Azure VPN Gateway 有 2 個 Public IP 可以建立 Tunnel,所以你最少需要建立 4 個 Policy

Firewall Policy
homecloud-fgt # show firewall policy
config firewall policy
    edit 7
        set name "toAzure-over-azure-tunnel-1"
        set srcintf "Zone-BigSwitch"
        set dstintf "azure-tunnel-1"
        set srcaddr "all"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "ALL"
        set tcp-mss-sender 1350 # (1)
        set tcp-mss-receiver 1350 # (2)
    next
    edit 11
        set name "toAzure-over-azure-tunnel-2"
        set srcintf "Zone-BigSwitch"
        set dstintf "azure-tunnel-2"
        set srcaddr "all"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "ALL"
        set tcp-mss-sender 1350
        set tcp-mss-receiver 1350
    next
    edit 10
        set name "FromAzure-over-azure-tunnel-1"
        set srcintf "azure-tunnel-1"
        set dstintf "Zone-BigSwitch"
        set srcaddr "all"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "ALL"
        set tcp-mss-sender 1350
        set tcp-mss-receiver 1350
    next
    edit 12
        set name "FromAzure-over-azure-tunnel-2"
        set srcintf "azure-tunnel-2"
        set dstintf "Zone-BigSwitch"
        set srcaddr "all"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "ALL"
        set tcp-mss-sender 1350
        set tcp-mss-receiver 1350
    next
end
  1. TCP MSS 要 1350,如果沒支援的參數的話,找一下 MTU 要 1400 bytes
  2. TCP MSS 要 1350,如果沒支援的參數的話,找一下 MTU 要 1400 bytes

4. 中場檢查一下 IPsec Tunnel 狀態

畢竟 BGP Peering 是基於 IPsec Tunnel 而成,如果沒有先把 IPsec 先搞好的話,後面不用做,所以這邊要進行檢查確認

從 FortiGate 角度看

看到 selectors(total,up): 1/1 就是正常的

Get VPN IPsec Tunnel Summary
1
2
3
homecloud-fgt # get vpn ipsec tunnel summary
'azure-tunnel-2' <Azure VPN Public IP IN_1>:0  selectors(total,up): 1/1  rx(pkt,err): 98031/0  tx(pkt,err): 157394/0
'azure-tunnel-1' <Azure VPN Public IP IN_0>:0  selectors(total,up): 1/1  rx(pkt,err): 111535/0  tx(pkt,err): 223401/1

從 Azure 的角度看

看到 Local Network Gateway 中 Status 那一欄呈現 Connected 才是正確的

5. 上 route-map

跟前一篇文章相比,最大的差異在這邊,一般是建議,連線到 IN_0 的那一個 VPN IP 當作是 Primary 為主,IN_1 那個當作是 Standby,雖說 Azure VPN Gateway 原生設計是無狀態,但我個人理解是他們兩個還是有一個隱藏的優先權順序,只是不是反應在路由上

Config route-map
homecloud-fgt # show router route-map
config router route-map
    edit "Standby_Tunnel"
        config rule
            edit 1
                set set-aspath "65510" # (2)
            next
        end
    next
    edit "Active_Tunnel"
        config rule
            edit 1
                set set-local-preference 200 # (1)
            next
        end
    next
end
  1. 預設 Local Preference 為 100,然後數字越高越優先走,這邊就是針對 Active Tunnel 設定 Local Preference 為 200
  2. 因為要讓其他鄰居知道 Standby Tunnel 的 AS_Path 比較長,所以特別用 AS Path Prepending 多設定一次自己的 ASN

6. 使出普通 BGP 攻擊魔法

我還是需要申明一下,下面設定是我個人家裡的設定,可能不適用於你的環境,可自行調整或提供建議

Config BGP
homecloud-fgt # show router bgp
config router bgp
    set as 65510
    set router-id 1.2.3.4
    set keepalive-timer 5 # (1)
    set holdtime-timer 10 # (2)
    set ebgp-multipath enable # (3)
    set multipath-recursive-distance enable # (4)
    set graceful-restart enable
    set fast-external-failover enable # (9)
    config neighbor
        edit "10.0.0.5" # (5)
            set advertisement-interval 1 # (6)
            set ebgp-enforce-multihop enable # (7)
            set link-down-failover enable # (8)
            set soft-reconfiguration enable
            set capability-graceful-restart enable
            set interface "azure-tunnel-2" # (10)
            set remote-as 65515 # (11)
            set route-map-out "Standby_Tunnel" # (15)
            set update-source "loopback" # (12)
        next
        edit "10.0.0.4"
            set advertisement-interval 1
            set ebgp-enforce-multihop enable
            set link-down-failover enable
            set soft-reconfiguration enable
            set capability-graceful-restart enable
            set interface "azure-tunnel-1"
            set remote-as 65515
            set route-map-in "Active_Tunnel" # (14)
            set update-source "loopback"
        next
    end
    config redistribute "connected"
        set status enable
    end
    config redistribute "rip"
    end
    config redistribute "ospf"
    end
    config redistribute "static"
        set status enable # (13)
    end
    config redistribute "isis"
    end
    config redistribute6 "connected"
    end
    config redistribute6 "rip"
    end
    config redistribute6 "ospf"
    end
  1. 目前有強者我客戶實測調到這數字 Failover 時間很好,我之前是設定 10
  2. 目前有強者我客戶實測調到這數字 Failover 時間很好,我之前是設定 30
  3. 因為我是用 Loopback IP 而不是 Interface IP,如果不點的話,預設 eBGP TTL 是 1,跟現行架構至少跳 2 跳會導致連不上,得開,詳細請洽 Forti 文件
  4. 因為我採用 BGP ECMP 路由,有特別開這個,詳細請洽 Forti 文件
  5. 這個就是 Azure VPN Gateway 提供的其中一個 BGP Peer IP
  6. MRAI 我是用預設值, 沒特別改, 但你想要設定 0 也是可以
  7. 這個會影響 ebgp-multihop-ttl 從預設值 1 變成 255
  8. 一旦 VPN Tunnel 不小心跳起來的話,Forti 會自動關閉 BGP Neighbor 並且刪除相關路由,避免走錯路
  9. 這個不知道為什麼不會出現在設定檔內,但看起來是有啟動,我自己補寫上去
  10. 這個就是走 azure-tunnel-2 路線去 BGP Peering
  11. Azure VPN Gateway 所設定的 BGP ASN
  12. 要特別指定 loopback 作為 BGP Peer 的 Update Source
  13. BGP Peering 路由我是用 Static Route 放的,所以這個要勾,你如果是別的方式 redistribute 路由,就自行調整
  14. 主要控制從其他鄰居接收到的路由,可以透過調整 Local Preference 來提升路由優先權,保持出站也是對稱路由 (Symmetric Routing)
  15. 主要控制自己發送給鄰居的路由,可以透過調整 AS Path Prepending 來影響鄰居對你的入站流量 (inbound) 的選擇

7. 上 Static Route

這邊是為了要做 BGP Peering 之用,我需要放路由指向特定的 Interface,如果你有其他熟悉的方式可以達到同樣的效果,也可以用其他方式,這邊只是提供參考

Check Static Route
homecloud-fgt # show router static
config router static
    edit 1
        set dst 10.0.0.4 255.255.255.255
        set device "azure-tunnel-1"
    next
    edit 2
        set dst 10.0.0.5 255.255.255.255
        set device "azure-tunnel-2"
    next
    edit 3
        set dst 10.0.0.4 255.255.255.255
        set device "azure-tunnel-2"
    next
    edit 4
        set dst 10.0.0.5 255.255.255.255
        set device "azure-tunnel-1"
    next
end

8. (非必要) 手動觸發 BGP 軟更新

正常來說他應該時間到了會自己更新表,但我的不知道為啥沒更新,就自己手動觸發 soft update

基於 Technical Tip: BGP soft reset to refresh BGP routing table without tearing down existing peering sessions 的建議,可以手動觸發 BGP 軟更新

Check BGP Info
homecloud-fgt # execute router clear bgp all soft

9. 檢查 BGP Establish 狀態

從 FortiGate 角度看

Check BGP Info
homecloud-fgt # get router info bgp summary
VRF 0 BGP router identifier 1.2.3.4, local AS number 65510
BGP table version is 145
2 BGP AS-PATH entries
0 BGP community entries

Neighbor    V         AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.0.0.4    4      65515   73557   74603      144    0    0 02:19:32        5
10.0.0.5    4      65515   67248   68386      143    0    0 02:20:51        5

Total number of neighbors 2

homecloud-fgt # get router info bgp neighbors 10.0.0.4
VRF 0 neighbor table:
BGP neighbor is 10.0.0.4, remote AS 65515, local AS 65510, external link
  BGP version 4, remote router ID 10.0.0.4
  BGP state = Established, up for 02:25:56 # (1)
  Last read 00:00:01, hold time is 10, keepalive interval is 3 seconds
  Configured hold time is 10, keepalive interval is 5 seconds
  Neighbor capabilities:
    Route refresh: advertised and received (new)
    Address family IPv4 Unicast: advertised and received
    Address family IPv6 Unicast: advertised and received
  Received 73688 messages, 0 notifications, 0 in queue
  Sent 74734 messages, 15 notifications, 0 in queue
  Route refresh request: received 0, sent 3
  Minimum time between advertisement runs is 1 seconds
  Update source is loopback

homecloud-fgt # get router info bgp neighbors 10.0.0.5
VRF 0 neighbor table:
BGP neighbor is 10.0.0.5, remote AS 65515, local AS 65510, external link
  BGP version 4, remote router ID 10.0.0.5
  BGP state = Established, up for 02:28:06 # (2)
  Last read 00:00:01, hold time is 10, keepalive interval is 3 seconds
  Configured hold time is 10, keepalive interval is 5 seconds
  Neighbor capabilities:
    Route refresh: advertised and received (new)
    Address family IPv4 Unicast: advertised and received
    Address family IPv6 Unicast: advertised and received
  Received 67397 messages, 0 notifications, 0 in queue
  Sent 68535 messages, 18 notifications, 0 in queue
  Route refresh request: received 0, sent 3
  Minimum time between advertisement runs is 1 seconds
  Update source is loopback
  1. BGP 狀態需為 Established 才是正確的
  2. BGP 狀態需為 Established 才是正確的

從 Azure 的角度看

9. 檢查路由表

從 FortiGate 角度看

Check RIB from FortiGate
homecloud-fgt # get router info routing-table database
Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
       O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       > - selected route, * - FIB route, p - stale info

Routing table for VRF=0
S    *> 0.0.0.0/0 [5/0] via 5.6.7.254, ppp1 # (1)
B    *> 10.56.0.0/24  [20/0] via 10.0.0.5 (recursive is directly connected, azure-tunnel-1), 00:03:32 # (2)
B    *> 10.0.0.0/24   [20/0] via 10.0.0.5 (recursive is directly connected, azure-tunnel-1), 00:03:32 # (3)
S    *> 10.0.0.4/32   [10/0] is directly connected, azure-tunnel-1 # (4)
     *>               [10/0] is directly connected, azure-tunnel-2
S    *> 10.0.0.5/32   [10/0] is directly connected, azure-tunnel-2
     *>               [10/0] is directly connected, azure-tunnel-1
C    *> 5.6.7.8/32 is directly connected, ppp1 # (5)
C    *> 5.6.7.254/32 is directly connected, ppp1 # (6)
C    *> 192.168.200.0/24 is directly connected, vlan200
C    *> 1.2.3.4/32 is directly connected, loopback # (7)
  1. 這個是我家 PPPoE 出去的路由,不用理會
  2. 這個是 Spoke 網段的路由,因為 Local Preference 比較高的關係,會走 azure-tunnel-1
  3. 這個是 Hub 網段的路由,因為 Local Preference 比較高的關係,會走 azure-tunnel-1
  4. 下面四條都是做 IPsec Tunnel 等級的 Redundancy 路由,當然如果 WAN Port 炸了,這四條就沒用了
  5. WAN IP
  6. WAN Gateway IP
  7. Loopback IP
Show BGP info for network
homecloud-fgt # get router info bgp network
VRF 0 BGP table version is 132, local router ID is 1.2.3.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight RouteTag Path
*> 0.0.0.0/0        5.6.7.254                          32768        0 ? <-/1>
*  10.0.0.0/24      10.0.0.4              0       200   0           0 65515 i <-/->
*>                  10.0.0.5              0             0           0 65515 i <-/1>
*  10.56.0.0/24     10.0.0.4              0       200   0           0 65515 i <-/->
*>                  10.0.0.5              0             0           0 65515 i <-/1>
*> 10.0.0.4/32      0.0.0.0                            32768        0 ? <-/1>
*> 10.0.0.5/32      0.0.0.0                            32768        0 ? <-/1>
*> 5.6.7.8/32       0.0.0.0                            32768        0 ? <-/1>
*> 5.6.7.254/32     0.0.0.0                            32768        0 ? <-/1>
*> 192.168.200.0    0.0.0.0                            32768        0 ? <-/1>
*> 1.2.3.4/32       0.0.0.0                            32768        0 ? <-/1>

Total number of prefixes 15

homecloud-fgt # get router info bgp network 10.56.0.0/24
VRF 0 BGP routing table entry for 10.56.0.0/24
Paths: (2 available, best #1, table Default-IP-Routing-Table)
  Advertised to non peer-group peers:
   10.0.0.5
  Original VRF 0
  65515
    10.0.0.4 from 10.0.0.4 (10.0.0.4)
      Origin IGP metric 0, localpref 200, valid, external, best # (1)
      Last update: Thu Mar  7 09:06:41 2024

  Original VRF 0
  65515
    10.0.0.5 from 10.0.0.5 (10.0.0.5)
      Origin IGP metric 0, localpref 100, valid, external
      Last update: Thu Mar  7 09:06:41 2024
  1. 雖然有收到來自 10.0.0.4 和 10.0.0.5 相同的路由,但因為高 Local Preference 的關係,所以路徑會選 10.0.0.4 也就是 azure-tunnel-1 出去
Check BGP info for route
homecloud-fgt # get router info bgp network-longer-prefixes 10.56.0.0/24
VRF 0 BGP table version is 132, local router ID is 1.2.3.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight RouteTag Path
*> 10.56.0.0/24     10.0.0.4                 0    200      0        0 65515 i <-/->
*                   10.0.0.5                 0             0        0 65515 i <-/1>

Total number of prefixes 1

從 Azure 的角度看

良心建議...你直接下載 Learned routed 用 Excel 看比較快

故障轉移測試 (Failover Test)

1. 斷掉主要幹道 azure-tunnel-1

Disable Primary Tunnel
1
2
3
4
5
config system interface
    edit "azure-tunnel-1 "
        set status down
    next
end

2. 檢查連線狀況

憑良心講,這個速度真的有點慢,掉了 15 個封包,徵求強者改善意見

  • 意見 1 (強者我客戶 C 大): 把它塞到 SD-WAN Zone 裡面能改善

3. 檢查路由表

路由表都顯示正確且預期的資訊

Check RIB from FortiGate
homecloud-fgt # get router info routing-table database
Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
       O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       > - selected route, * - FIB route, p - stale info

Routing table for VRF=0
S    *> 0.0.0.0/0 [5/0] via 5.6.7.254, ppp1 # (1)
B    *> 10.56.0.0/24  [20/0] via 10.0.0.5 (recursive is directly connected, azure-tunnel-2), 00:05:00 # (2)
B    *> 10.0.0.0/24   [20/0] via 10.0.0.5 (recursive is directly connected, azure-tunnel-2), 00:05:00 # (3)
S    *> 10.0.0.4/32   [10/0] is directly connected, azure-tunnel-1 inactive # (4)
     *>               [10/0] is directly connected, azure-tunnel-2
S    *> 10.0.0.5/32   [10/0] is directly connected, azure-tunnel-2
     *>               [10/0] is directly connected, azure-tunnel-1 inactive
C    *> 5.6.7.8/32 is directly connected, ppp1 # (5)
C    *> 5.6.7.254/32 is directly connected, ppp1 # (6)
C    *> 192.168.200.0/24 is directly connected, vlan200
C    *> 1.2.3.4/32 is directly connected, loopback # (7)
  1. 這個是我家 PPPoE 出去的路由,不用理會
  2. 這個是 Spoke 網段的路由,因為剩 azure-tunnel-2 可達的關係,會走 azure-tunnel-2
  3. 這個是 Hub 網段的路由,因為剩 azure-tunnel-2 可達的關係,會走 azure-tunnel-2
  4. 因為 azure-tunnel-1 斷線了.所以標注 inactive
  5. WAN IP
  6. WAN Gateway IP
  7. Loopback IP
Show BGP info for network
1
2
3
4
5
6
7
8
homecloud-fgt # get router info bgp network 10.56.0.0/24
VRF 0 BGP routing table entry for 10.56.0.0/24
Paths: (1 available, best #1, table Default-IP-Routing-Table)
  Original VRF 0
  65515
    10.0.0.5 from 10.0.0.5 (10.0.0.5)
      Origin IGP metric 0, localpref 100, valid, external, best # (1)
      Last update: Thu Mar  7 09:06:41 2024
  1. 只剩他一條囉,自然是 Best Path

4. 恢復主要幹道 azure-tunnel-1

Enable Primary Tunnel
1
2
3
4
5
config system interface
    edit "azure-tunnel-1 "
        set status up
    next
end

5. 檢查路由表

Check RIB from FortiGate
homecloud-fgt # get router info routing-table database
Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
       O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       > - selected route, * - FIB route, p - stale info

Routing table for VRF=0
S    *> 0.0.0.0/0 [5/0] via 5.6.7.254, ppp1
B    *> 10.56.0.0/24  [20/0] via 10.0.0.5 (recursive is directly connected, azure-tunnel-1), 00:00:55
B    *> 10.0.0.0/24   [20/0] via 10.0.0.5 (recursive is directly connected, azure-tunnel-1), 00:00:55
S    *> 10.0.0.4/32   [10/0] is directly connected, azure-tunnel-1
     *>               [10/0] is directly connected, azure-tunnel-2
S    *> 10.0.0.5/32   [10/0] is directly connected, azure-tunnel-2
     *>               [10/0] is directly connected, azure-tunnel-1
C    *> 5.6.7.8/32 is directly connected, ppp1
C    *> 5.6.7.254/32 is directly connected, ppp1
C    *> 192.168.200.0/24 is directly connected, vlan200
C    *> 1.2.3.4/32 is directly connected, loopback

homecloud-fgt # get router info bgp network 10.56.0.0/24
VRF 0 BGP routing table entry for 10.56.0.0/24
Paths: (2 available, best #1, table Default-IP-Routing-Table)
  Advertised to non peer-group peers:
   10.0.0.5
  Original VRF 0
  65515
    10.0.0.4 from 10.0.0.4 (10.0.0.4)
      Origin IGP metric 0, localpref 200, valid, external, best
      Last update: Thu Mar  7 09:06:41 2024

  Original VRF 0
  65515
    10.0.0.5 from 10.0.0.5 (10.0.0.5)
      Origin IGP metric 0, localpref 100, valid, external
      Last update: Thu Mar  7 09:06:41 2024

BGP Best Path Selection

基於 FortiGate - BGP path selection processBGP Attributes and Path Selection,下面有幾個 BGP Best Path Selection 的方式可供參考:

Priority Attribute Description General VPN Appliance Support? Azure VPN Gateway 可接收? ExpressRoute Gateway 可接收? Comment
1 Highest weight this attribute is local to the FortiGate ⛔ 不能調整 ✅ 可調整 建議少用
2 Highest local preference Applicable within AS ⛔ 不能調整 ⛔ 不能調整 已知使用頻率第 1,地端控制出口流量用,這個屬性沒辦法透過 eBGP 轉出去
3 Route originated by the local router next hop = 0.0.0.0 ✅ 要用 Azure Route Table ✅ 要用 Azure Route Table 基本能力
4 Shortest AS path length ✅ 可加可收 ✅ 可收,但自己不能加 ✅ 可收,但自己不能加 已知使用頻率第 2,Azure 主要推薦用 AS Path Prepending 控制路由,但建議用 BGP Communites 替代
5 lowest origin code IGP > EGP > incomplete 已知使用頻率第 3,基本能力
6 lowest MED Exchanged between autonomous systems ⛔ 不收 MED ⛔ 不收 MED 已知使用頻率第 4
7 eBGP path over iBGP path 基本能力
8 Path through the closest IGP neighbor 基本能力
9 Oldest route for EBGP paths 基本能力
10 the lowest neighbor BGP router ID 基本能力
11 the lowest neighbor IP address 基本能力

上面都是在沒有使用 Azure vWAN 的狀況下前提,因為 Azure vWAN 有支援 route-map (preview) 這個功能,會讓上面能力表會有所變化

Q&A

Q1: 斷線了, 連線檢查步驟是如何?

A1:

  1. 檢查雲端 IPsec Tunnel 狀態,因為點 Azure Portal 很容易一翻兩瞪眼,只要不是 Connected 就是有問題
  2. 檢查地端 IPsec Tunnel 狀態,應為 Up
  3. 檢查是不是被 Firewall 擋下來了
  4. 檢查 BGP 狀態是否為 Established
  5. 檢查路由表,看那條路由到底飛去哪裡

因為大概 9 成問題都是被擋在 Firewall 漏寫規則...

Q2: 如果我在 Azure 上開 Azure Firewall,且我需要地端上雲都要經過 Azure Firewall 的話,我還需要動地端路由嗎?

A2: 地端不需要做任何變動,若要動路由的部分,是要動雲端的

Q3: Azure VPN Gateway 開啟 BGP 的狀態下,支援 BFD (Bidirectional Forwarding Detection) 嗎?

A3: 不支援,開了沒作用,替代方案是使用 keepalives 但 ExpressRoute Gateway 有支援,所以還是可以在 Loopback 上開 BFD 起來

Q4: 如果我想要做 ECMP 架構的話,Azure VPN Gateway 支援嗎?

A4: 支援,因為 Azure VPN Gateway 原生設計是無狀態的,所以只要無論哪個介面進去或出來他都不會擋,故地端網路設計得當是可以支援,可參考 Azure VPN Gateway 實踐 BGP + ECMP: 以 FortiGate 為例

Q5: 如果原先 VPN Gateway 原先是 Active-Standby Mode, 我換成 Active-Active Mode 會不會額外要付成 2 個 VPN Gateway 成本的問題?

A5: 依據 Azure VPN Gateway FAQ - 將 VPN 閘道設定為主動-主動是否有額外的成本?

不用多付錢, 但因為需要多綁一個 Public IP (Standard, Static), 所以每月僅會多 3.65 美元的費用

文後廢言

私心希望 Forti 爸爸看到文章可以支持一下開源社群 Q_Q

References

Comments