このガイドでは、Fortinet FortiGate ファイアウォールと組み合わせて、Internet Protocol Security(IPsec)トンネルで Cloudflare WAN(旧 Magic WAN)を設定する方法と例を示します。
ここで示す FortiGate の設定は、Cloudflare WAN が求める 双方向ヘルスチェック に対応しています。ただし、トンネルヘルスチェック以外のトラフィックフローは考慮していません。現在の FortiGate 設定に合わせて調整が必要な場合があります。
FortiGate の設定は、次の 2 つの FortiGate ファイアウォールで検証しました。
- VMware ESXi 6.5 上の FortiGate Virtual Appliance バージョン 7.0.8
- FortiGate FG80F、バージョン 7.0.12
Cloudflare WAN を設定するには、ダッシュボードまたは API でアカウントに IPsec トンネルと静的ルートを追加します。
作業の前に、アカウントに割り当てられた IPv4 anycast アドレスがあることを確認します。Cloudflare ダッシュボードの Address Space > Leased IPs ↗ で確認できます。
Cloudflare は、世界各地のデータセンターの複数ノードからエンドポイント IP を広報することで、自社ネットワーク上の障害を自動的に処理します。自社ネットワーク側の障害に備えるには、別々のルーターから 2 本の IPsec トンネルを設定します。
- トンネルを追加する の手順に従い、次のオプションで必要な IPsec トンネルを作成します。
- Health check type: Request に変更します。
- Replay Protection: デフォルト設定のまま変更しません。
IPsec トンネルの背後にある IP アドレス空間を定義する静的ルートを 2 本追加します。前の節で定義した 2 本の IPsec トンネルへ、それぞれ 1 本ずつです。
デフォルトでは、静的ルートの優先度は 100 です。Cloudflare は Equal Cost Multipath Routing(ECMP) を使い、2 本のトンネルにトラフィックを均等に負荷分散します。Active / Passive モデルを使いたい場合は、1 本目のルートのデフォルト値 100 を残し、2 本目のトンネルを 150 に設定します(値が大きいほど優先度は低くなります)。
-
静的ルートを設定する の手順に従い、静的ルートを作成します。
-
1 本目のルートでは、次の設定にします。
- Prefix: 前の節で定義した 1 本目の IPsec トンネルの背後にある RFC1918 ↗ サブネットを指定します。
- Tunnel/Next hop: 1 本目のトンネル(Tunnel 01 of 02)を選びます。
-
2 本目のルートでは、次の設定にします。
- Prefix: 前の節で定義した 2 本目の IPsec トンネルの背後にある RFC1918 ↗ サブネットを指定します。
- Tunnel/Next hop: 2 本目のトンネル(Tunnel 02 of 02)を選びます。
ICMP の非対称ルーティングを有効にし、ヘルスチェックが想定どおり動くようにします。このオプションは必須です。有効にしないと、Cloudflare WAN の正しい動作に不可欠なトンネルヘルスチェックが設計どおり動きません。
非対称ルーティングを有効にすると FortiGate の動作が変わります。詳細は 非対称ルーティング有効時の FortiGate の動作 ↗ を参照してください。
config system settings
set asymroute-icmp enable
endネットワークで Network Address Translation Traversal(NAT-T)を使っている場合は、この機能を有効にし、ポート 4500 で Internet Key Exchange(IKE)通信を開始できます。
IKE ポートを設定するには、システム設定に次を追加します。
config system settings
set ike-port 4500
endNAT-T を有効にするには、設定中の IPsec トンネルに set nattraversal enable を追加します。
fortigate # config vpn ipsec phase1-interface
edit "<NAME_OF_YOUR_TUNNEL>"
set nattraversal enable詳細は Fortinet のドキュメント ↗ を参照してください。
ルートベースの IPsec 構成では、アンチリプレイ保護を無効にする必要があります。次のコマンドはグローバルにアンチリプレイ保護を無効にしますが、ファイアウォールポリシー単位でも行えます。詳細は Fortinet の ポリシー単位のアンチリプレイ対応 ↗ を参照してください。
config system global
set anti-replay disable
endIPsec トンネルは、ルートベースのサイト間 Virtual Private Network(VPN)モデルを使います。このモデルは、仮想トンネルインターフェイスとルーティングに依存して、IPsec トンネルを流れるトラフィックを定義します。
phase1-interface と phase2-interface オブジェクトで IPsec トンネルを 2 本設定します。
次の例では、FortiGate ファイアウォールの外部 / 出力インターフェイスを wan1 とします。
MWAN_IPsec_Tun1 は、Cloudflare 側の設定で追加した Tunnel 01 of 02 に対応します。MWAN_IPsec_Tun2 は、Cloudflare 側の設定で追加した Tunnel 02 of 02 に対応します。
fortigate # config vpn ipsec phase1-interface
edit "MWAN_IPsec_Tun1"
set interface "wan1"
set ike-version 2
set keylife 86400
set peertype any
set net-device enable
set proposal aes256gcm-prfsha512 aes256gcm-prfsha384 aes256gcm-prfsha256
set localid "f1473dXXXXXXX72e33.49561179.ipsec.cloudflare.com"
set dhgrp 20
set nattraversal disable
set remote-gw 162.159.67.210
set add-gw-route enable
set psksecret <YOUR_PRE-SHARED_KEY>
next
edit "MWAN_IPsec_Tun2"
set interface "wan1"
set ike-version 2
set keylife 86400
set peertype any
set net-device enable
set proposal aes256gcm-prfsha512 aes256gcm-prfsha384 aes256gcm-prfsha256
set localid "de91565XXXXXXXfbbd6632.49561179.ipsec.cloudflare.com"
set dhgrp 20
set nattraversal disable
set remote-gw 172.XX.XX.210
set add-gw-route enable
set psksecret ENC <YOUR_PRE-SHARED_KEY>
next
end2 つの phase1-interface それぞれに対し、phase2-interface を 1 つずつ追加します。
fortigate # config vpn ipsec phase2-interface
edit "MWAN_IPsec_Tun1"
set phase1name "MWAN_IPsec_Tun1"
set proposal aes256gcm aes128gcm
set dhgrp 20
set replay disable
set keylifeseconds 28800
set auto-negotiate enable
set keepalive enable
next
edit "MWAN_IPsec_Tun2"
set phase1name "MWAN_IPsec_Tun2"
set proposal aes256gcm aes128gcm
set dhgrp 20
set replay disable
set keylifeseconds 28800
set auto-negotiate enable
set keepalive enable
next
endphase1-interface 設定で set net-device enable を指定したときに自動追加された仮想トンネルインターフェイスを設定します。
仮想トンネルインターフェイスに追加が必要な設定は、次だけです。
ip: ローカル IP アドレス(/32ネットマスク255.255.255.255で指定)。remote-ip: 先の IPsec トンネル節で指定したインターフェイスアドレスに対応する値(/31ネットマスク255.255.255.254で指定)。alias: 任意です。
次の例では、FortiGate ファイアウォールの外部 / 出力インターフェイスを wan1 とします。
fortigate # config system interface
edit "MWAN_IPsec_Tun1"
set vdom "root"
set ip 10.252.2.91 255.255.255.255
set allowaccess ping
set type tunnel
set remote-ip 10.252.2.90 255.255.255.254
set alias "MWAN_IPsec_Tun1"
set snmp-index 17
set interface "wan1"
next
edit "MWAN_IPsec_Tun2"
set vdom "root"
set ip 10.252.2.93 255.255.255.255
set allowaccess ping
set type tunnel
set remote-ip 10.252.2.92 255.255.255.254
set alias "MWAN_IPsec_Tun2"
set snmp-index 18
set interface "wan1"
next
end仮想トンネルインターフェイスを設定したら、remote-ip 属性に紐づく IP アドレスへ ping できるはずです。
次の例は、両方の仮想トンネルインターフェイスへの ping が成功した結果です。
fortigate # execute ping 10.252.2.90
PING 10.252.2.90 (10.252.2.90): 56 data bytes
64 bytes from 10.252.2.90: icmp_seq=0 ttl=64 time=5.8 ms
64 bytes from 10.252.2.90: icmp_seq=1 ttl=64 time=5.8 ms
64 bytes from 10.252.2.90: icmp_seq=2 ttl=64 time=5.8 ms
64 bytes from 10.252.2.90: icmp_seq=3 ttl=64 time=5.8 ms
64 bytes from 10.252.2.90: icmp_seq=4 ttl=64 time=5.7 ms
--- 10.252.2.90 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 5.7/5.7/5.8 msfortigate # execute ping 10.252.2.92
PING 10.252.2.92 (10.252.2.92): 56 data bytes
64 bytes from 10.252.2.92: icmp_seq=0 ttl=64 time=6.1 ms
64 bytes from 10.252.2.92: icmp_seq=1 ttl=64 time=6.1 ms
64 bytes from 10.252.2.92: icmp_seq=2 ttl=64 time=6.1 ms
64 bytes from 10.252.2.92: icmp_seq=3 ttl=64 time=6.1 ms
64 bytes from 10.252.2.92: icmp_seq=4 ttl=64 time=6.0 ms
--- 10.252.2.92 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 6.0/6.0/6.1 msこのサンプル設定では、FortiGate ファイアウォールに 3 つのゾーンが設定されている前提です。これらのゾーンオブジェクトは、後述のポリシーで使います。
Trust_Zone: LAN インターフェイスを含みます。Untrust_Zone: WAN インターフェイスを含みます。Cloudflare_Zone: 両方の IPsec トンネルインターフェイスを含みます。
fortigate # config system zone
edit "Cloudflare_Zone"
set intrazone allow
set interface "MWAN_IPsec_Tun1" "MWAN_IPsec_Tun2"
next
edit "Trust_Zone"
set intrazone allow
set interface "internal"
next
edit "Untrust_Zone"
set intrazone allow
set interface "wan1"
next
endCloudflare の IPv4 アドレス空間 ↗ を表す Address Object と、双方向ヘルスチェック用 anycast IP のオブジェクトを作成します。
config firewall address
edit "Cloudflare_IPv4_01"
set color 9
set subnet 173.245.48.0 255.255.240.0
next
edit "Cloudflare_IPv4_02"
set color 9
set subnet 103.21.244.0 255.255.252.0
next
edit "Cloudflare_IPv4_03"
set color 9
set subnet 103.22.200.0 255.255.252.0
next
edit "Cloudflare_IPv4_04"
set color 9
set subnet 103.31.4.0 255.255.252.0
next
edit "Cloudflare_IPv4_05"
set color 9
set subnet 141.101.64.0 255.255.192.0
next
edit "Cloudflare_IPv4_06"
set color 9
set subnet 108.162.192.0 255.255.192.0
next
edit "Cloudflare_IPv4_07"
set color 9
set subnet 190.93.240.0 255.255.240.0
next
edit "Cloudflare_IPv4_08"
set color 9
set subnet 188.114.96.0 255.255.240.0
next
edit "Cloudflare_IPv4_09"
set color 9
set subnet 197.234.240.0 255.255.252.0
next
edit "Cloudflare_IPv4_10"
set color 9
set subnet 198.41.128.0 255.255.128.0
next
edit "Cloudflare_IPv4_11"
set color 9
set subnet 162.158.0.0 255.254.0.0
next
edit "Cloudflare_IPv4_12"
set color 9
set subnet 104.16.0.0 255.248.0.0
next
edit "Cloudflare_IPv4_13"
set color 9
set subnet 104.24.0.0 255.252.0.0
next
edit "Cloudflare_IPv4_14"
set color 9
set subnet 172.64.0.0 255.248.0.0
next
edit "Cloudflare_IPv4_15"
set color 9
set subnet 131.0.72.0 255.255.252.0
next
edit "Bidirect_HC_Endpoint_01"
set comment "Bidirectional health check endpoint address"
set color 9
set subnet 172.64.240.253 255.255.255.255
next
edit "Bidirect_HC_Endpoint_02"
set comment "Bidirectional health check endpoint address"
set color 9
set subnet 172.64.240.254 255.255.255.255
next
endCloudflare の IPv4 サブネットをすべて含む Address Object を作成します。次の CLI コマンドを SSH ターミナルにコピーして貼り付けると、オブジェクトを自動作成できます。
config firewall addrgrp
edit "Cloudflare_IPv4_Nets"
set member "Cloudflare_IPv4_01" "Cloudflare_IPv4_02" "Cloudflare_IPv4_03" "Cloudflare_IPv4_04" "Cloudflare_IPv4_05" "Cloudflare_IPv4_06" "Cloudflare_IPv4_07" "Cloudflare_IPv4_08" "Cloudflare_IPv4_09" "Cloudflare_IPv4_10" "Cloudflare_IPv4_11" "Cloudflare_IPv4_12" "Cloudflare_IPv4_13" "Cloudflare_IPv4_14" "Cloudflare_IPv4_15"
set color 9
next
endReply 方式の双方向ヘルスチェックに関連する ICMP トラフィックを許可するファイアウォールルールを追加します。
fortigate (policy) # show
config firewall policy
edit 2
set name "CF_Magic_Health_Checks"
set uuid 80eb76ce-3033-51ee-c5e5-d5a670dff3b3
set srcintf "Cloudflare_Zone"
set action accept
set srcaddr "Cloudflare_IPv4_Nets"
set dstaddr "Bidirect_HC_Endpoint_01" "Bidirect_HC_Endpoint_02"
set schedule "always"
set service "ALL_ICMP"
set logtraffic all
next
endIPsec トンネルで受信した双方向ヘルスチェックのトラフィックが、同じトンネルを通って戻るように、ポリシーベースルーティングルールを追加します。
2 本の IPsec トンネルそれぞれに、ポリシーベースルーティングルールを 1 本ずつ追加します。
fortigate # config router policy
edit 1
set input-device "MWAN_IPsec_Tun1"
set srcaddr "all"
set dstaddr "all"
set gateway 10.252.2.90
set output-device "MWAN_IPsec_Tun1"
next
edit 2
set input-device "MWAN_IPsec_Tun2"
set srcaddr "all"
set dstaddr "all"
set gateway 10.252.2.92
set output-device "MWAN_IPsec_Tun2"
next
endCloudflare ダッシュボードは、Cloudflare からオリジンネットワークへトラフィックをルーティングする、アカウント上のすべての anycast トンネルの健全性を監視します。詳細は ダッシュボードでトンネルの健全性を確認する を参照してください。
パケットキャプチャで、ポリシーベースルーティングルールが想定どおり動いているかを確認します。
Tunnel 01 of 02 に入ったトラフィックは、同じトンネルから出る必要があります。次の例のとおりです。
fortigate # diagnose sniffer packet any 'host 172.64.240.253' 4
interfaces=[any]
filters=[host 172.64.240.253]
0.601569 MWAN_IPsec_Tun1 in 172.64.240.253 -> 162.158.176.118: icmp: echo reply
0.601585 MWAN_IPsec_Tun1 out 172.64.240.253 -> 162.158.176.118: icmp: echo reply
0.611164 MWAN_IPsec_Tun1 in 172.64.240.253 -> 172.71.87.94: icmp: echo reply
0.611178 MWAN_IPsec_Tun1 out 172.64.240.253 -> 172.71.87.94: icmp: echo reply
0.617562 MWAN_IPsec_Tun1 in 172.64.240.253 -> 172.71.129.214: icmp: echo reply
0.617574 MWAN_IPsec_Tun1 out 172.64.240.253 -> 172.71.129.214: icmp: echo reply
0.622042 MWAN_IPsec_Tun1 in 172.64.240.253 -> 172.69.61.43: icmp: echo reply
0.622056 MWAN_IPsec_Tun1 out 172.64.240.253 -> 172.69.61.43: icmp: echo reply
0.624092 MWAN_IPsec_Tun1 in 172.64.240.253 -> 172.68.9.214: icmp: echo reply逆に、Tunnel 02 of 02 に入ったトラフィックは、同じトンネルから出る必要があります。
fortigate # diagnose sniffer packet any 'host 172.64.240.254' 4
interfaces=[any]
filters=[host 172.64.240.254]
0.912041 MWAN_IPsec_Tun2 in 172.64.240.254 -> 172.70.177.56: icmp: echo reply
0.912057 MWAN_IPsec_Tun2 out 172.64.240.254 -> 172.70.177.56: icmp: echo reply
0.913579 MWAN_IPsec_Tun2 in 172.64.240.254 -> 172.70.221.154: icmp: echo reply
0.913592 MWAN_IPsec_Tun2 out 172.64.240.254 -> 172.70.221.154: icmp: echo reply
0.914247 MWAN_IPsec_Tun2 in 172.64.240.254 -> 162.158.1.85: icmp: echo reply
0.914260 MWAN_IPsec_Tun2 out 172.64.240.254 -> 162.158.1.85: icmp: echo reply
0.918533 MWAN_IPsec_Tun2 in 172.64.240.254 -> 172.71.125.75: icmp: echo reply
0.918550 MWAN_IPsec_Tun2 out 172.64.240.254 -> 172.71.125.75: icmp: echo reply
0.924465 MWAN_IPsec_Tun2 in 172.64.240.254 -> 172.69.21.134: icmp: echo replyFlow Debugging は、トラフィックが想定した経路でファイアウォールに入り、出ているかを確認するのに役立ちます。前の節のスニファーパケットキャプチャより詳しい情報が出ますが、ログ量が非常に多いため、どうしても必要なときだけ有効にします。
加えて、フローデバッグログの解釈や、アプリケーションの要件に合わせてフローを正しくルーティングする FortiGate の設定推奨については、Fortinet のテクニカルサポートへの問い合わせが必要になることがほとんどです。
fortigate # diagnose debug disable
fortigate # diagnose debug flow filter clear
fortigate # diagnose debug reset
fortigate # diagnose debug flow filter addr 172.64.240.253
fortigate # diagnose debug show flow show function-name enable
fortigate # diagnose debug config-error-log timestamps enable
fortigate # diagnose debug flow trace start 999
fortigate # diagnose debug enable
fortigate # 2023-08-01 09:27:26 id=20085 trace_id=2871 func=print_pkt_detail line=5844 msg="vd-root:0 received a packet(proto=1, 172.64.240.253:56968->172.70.121.28:0) tun_id=162.159.67.210 from MWAN_IPsec_Tun1. type=0, code=0, id=56968, seq=0."
2023-08-01 09:27:26 id=20085 trace_id=2871 func=rpdb_srv_match_input line=1036 msg="Match policy routing id=1: to 10.252.2.90 via ifindex-34"
2023-08-01 09:27:26 id=20085 trace_id=2871 func=vf_ip_route_input_common line=2605 msg="find a route: flag=00000000 gw-162.159.67.210 via MWAN_IPsec_Tun1"
2023-08-01 09:27:26 id=20085 trace_id=2871 func=ipsecdev_hard_start_xmit line=669 msg="enter IPSec interface MWAN_IPsec_Tun1, tun_id=0.0.0.0"
2023-08-01 09:27:26 id=20085 trace_id=2871 func=_do_ipsecdev_hard_start_xmit line=229 msg="output to IPSec tunnel MWAN_IPsec_Tun1"
2023-08-01 09:27:26 id=20085 trace_id=2871 func=esp_output4 line=844 msg="IPsec encrypt/auth"
2023-08-01 09:27:26 id=20085 trace_id=2871 func=ipsec_output_finish line=544 msg="send to 172.71.91.34 via intf-wan1"
2023-08-01 09:27:26 id=20085 trace_id=2872 func=print_pkt_detail line=5844 msg="vd-root:0 received a packet(proto=1, 172.64.240.253:18685->162.158.209.64:0) tun_id=162.159.67.210 from MWAN_IPsec_Tun1. type=0, code=0, id=18685, seq=0."
2023-08-01 09:27:26 id=20085 trace_id=2872 func=rpdb_srv_match_input line=1036 msg="Match policy routing id=1: to 10.252.2.90 via ifindex-34"
2023-08-01 09:27:26 id=20085 trace_id=2872 func=vf_ip_route_input_common line=2605 msg="find a route: flag=00000000 gw-162.159.67.210 via MWAN_IPsec_Tun1"
2023-08-01 09:27:26 id=20085 trace_id=2872 func=ipsecdev_hard_start_xmit line=669 msg="enter IPSec interface MWAN_IPsec_Tun1, tun_id=0.0.0.0"
2023-08-01 09:27:26 id=20085 trace_id=2872 func=_do_ipsecdev_hard_start_xmit line=229 msg="output to IPSec tunnel MWAN_IPsec_Tun1"
2023-08-01 09:27:26 id=20085 trace_id=2872 func=esp_output4 line=844 msg="IPsec encrypt/auth"
2023-08-01 09:27:26 id=20085 trace_id=2872 func=ipsec_output_finish line=544 msg="send to 172.71.91.34 via intf-wan1"CTRL + C では、通常 Flow Debugging は止まりません。
デバッグログが流れているあいだでも、次を入力するだけで Flow Debugging を無効にできます。
fortigate # diagnose debug disable