This site covers Fortinet and A10 as part of *** Shadowgarden.org ***

FortiGate リンクモニタによる経路監視と自動経路切替の設定ガイド

目次

本記事について

本記事では、Fortinet 社のファイアウォール製品である FortiGate について、ルートが冗長化されている場合にリンクモニタ機能によりルート監視を行い、メインルート障害時に自動でバックアップルートに切替えるための設定方法を説明します。

動作確認環境

本記事の内容は以下の機器にて動作確認を行った結果に基づいて作成されています。

  • FortiGate-60F
    • バージョン 7.4.3

想定するシナリオ

FortiGate では外部ネットワークへルーティングするルートとして wan1 を発信インターフェースとするルートと wan2 を発信インターフェースとするルートの2つのルートを持っています。通常時は wan1 から発信するルートをメインルートとして使いますが、このルートに障害が発生した場合は wan2 から発信するルートに自動でルートを切り替えたいです。

FortiGate では外部ネットワーク向けのデフォルトルートとして以下の2つのルートを設定しています。

config router static
    edit 1
        set gateway 10.100.1.254
        set device "wan1"
    next
    edit 2
        set gateway 10.100.2.254
        set distance 11
        set device "wan2"
    next
end

wan2 から発信するルートは distance を 11 と設定することにより優先度を落とし、wan1 から発信するルートを優先して使用するようにしています。

ファイアウォールポリシーの設定としては、internal1 から wan1 への通信を許可するポリシーと、internal1 から wan2 への通信を許可するポリシーが設定されています。

config firewall policy
    edit 1
        set name "internal1_to_wan1"
        set uuid ad7bc670-f406-51ee-8445-98f18762e5a1
        set srcintf "internal1"
        set dstintf "wan1"
        set action accept
        set srcaddr "10.1.1.0/24"
        set dstaddr "all"
        set schedule "always"
        set service "ALL"
        set logtraffic all
        set nat enable
    next
    edit 2
        set name "internal1_to_wan2"
        set uuid 385deb68-f40e-51ee-ebe5-e0a964ffb686
        set srcintf "internal1"
        set dstintf "wan2"
        set action accept
        set srcaddr "10.1.1.0/24"
        set dstaddr "all"
        set schedule "always"
        set service "ALL"
        set logtraffic all
        set nat enable
    next
end

FortiGate のリンクモニタ機能の利用

ルーティング要件を満たすために、FortiGate で wan1 から発信するルートで外部ネットワーク上の 8.8.8.8 を定期的に ping 監視し、疎通が取れなくなった場合はルート上に障害発生と判断してルートを wan2 から発信するルートに切替えます。これを実現するための機能として「リンクモニタ」という機能が FortiGate にはあります。

以下でリンクモニタの設定方法を説明します。

リンクモニタで障害検知時に削除される対象ルート

リンクモニタの設定では監視対象 IP を設定しますが、監視対象 IP が決まるとその IP へルーティング時の発信インターフェースゲートウェイアドレスが決まります(もしくは明示的に設定します)。リンクモニタのデフォルト設定では障害検知時、発信インターフェースゲートウェイアドレスがリンクモニタ設定と一致しているようなスタティックルートのすべてが削除対象ルートになります。

OS バージョン 7.0 からは、削除対象のルートを指定する機能が追加されました。これにより、指定したルートのみを削除対象にすることができるようになりました。(これはオプションです。)

リンクモニタの設定方法

リンクモニタの設定は GUI ではできないため、CLI で設定します。

リンクモニタのコンフィグはconfig system link-monitorです。以下の例の通り監視対象ごとにedit項目を作成して設定します。

config system link-monitor
    edit "8.8.8.8_from_wan1"
        set addr-mode ipv4
        set srcintf "wan1"
        set server-config default
        set server-type static
        set server "8.8.8.8"
        set protocol ping
        set gateway-ip 0.0.0.0
        set source-ip 0.0.0.0
        set interval 500
        set probe-timeout 500
        set failtime 5
        set recoverytime 5
        set probe-count 30
        set ha-priority 1
        set update-cascade-interface enable
        set update-static-route enable
        set update-policy-route enable
        set status enable
        set diffservcode 000000
        unset class-id
        set service-detection disable
    next
end

主な設定項目は以下の通りです。

項目set 設定項目デフォルト値備考
設定名edit の ID 値として設定
ソースインターフェースsrcintf
監視対象 IPserver複数のIPを指定可能
(スペース区切り)
複数指定時はすべてのIPで
疎通不可がトリガーになる
監視で使用するプロトコルprotocolping
監視通信のゲートウェイgateway-ip
削除対象ルートrouteバージョン 7.0 以降の機能
監視通信のソース IPsource-ip
監視通信の間隔interval500 [ミリ秒]
障害と判定する失敗回数failtime5 [回]
復旧と判定する成功回数recoverytime5 [回]
障害時指定インターフェースを
ダウンさせるか
update-cascade-interfaceenable詳細は後述
障害時対象ルートを削除するかupdate-static-routeenable
リンクモニタ有効化statusenable

上記の内、設定必須項目はserverのみでそれ以外はオプションです。srcintf,gateway-ip,source-ipが未設定の場合これらの値はルーティングテーブルに従い決定されます。

update-static-routedisableにしてしまうと、障害時でも対象ルートがルーティングテーブルから削除されずルートが切り替わらないため注意してください。

今回のシナリオでは以下の設定値とします。

項目set 設定項目設定値
設定名edit の ID 値として設定8.8.8.8_from_wan1
ソースインターフェースsrcintfwan1
監視対象 IPserver8.8.8.8
監視で使用するプロトコルprotocolping
監視通信のゲートウェイgateway-ip10.100.1.254
削除対象ルートroute設定無し
監視通信のソース IPsource-ip10.100.1.1
その他項目デフォルト値
config system link-monitor
    edit 8.8.8.8_from_wan1
        set srcintf wan1
        set server 8.8.8.8
        set protocol ping
        set gateway-ip 10.100.1.254
        set source-ip 10.100.1.1
    next
end

設定後のコンフィグは以下のようになります。

config system link-monitor
    edit "8.8.8.8_from_wan1"
        set srcintf "wan1"
        set server "8.8.8.8"
        set gateway-ip 10.100.1.254
        set source-ip 10.100.1.1
    next
end

リンクモニタの設定は以上です。

update-cascade-interface 設定について

config system link-monitor
    edit "8.8.8.8_from_wan1"
        set update-cascade-interface enable
    next
end

update-cascade-interfaceが有効な場合、リンクモニタで障害を検知した際に指定したインターフェースをダウンさせることができます。この機能を利用するためには追加の設定が必要です。

今回の想定シナリオでは wan1 を発信インターフェースとするルートが監視対象のため、config system interfaceの wan1 の設定に以下の設定を追加します。

config system interface
    edit "wan1"
        set fail-detect enable
        set fail-detect-option detectserver link-down
        set fail-alert-interfaces "internal5"
    next
end

上の追加設定の内、5行目のset fail-alert-interfaces "internal5"の部分でリンクモニタで障害検知時にダウンさせるインターフェースを指定します。この設定例の場合、internal5 がダウンすることになります。

set fail-alert-interfacesの設定値としてはスペース区切りで複数のインターフェースを指定することが可能です。

リンクモニタの動作確認

内部ネットワークの端末から外部ネットワーク上の 8.8.8.8 に連続 Ping を実行しつつ、経路上の FortiGate~外部ネットワーク間で障害を発生させてみます。

まず障害発生前の FortiGate のルーティングテーブルは以下の通りです。

Routing table for VRF=0
S*      0.0.0.0/0 [10/0] via 10.100.1.254, wan1, [1/0]

障害発生前後の端末の Ping の状況は以下の通りです。

5秒ほどで通信断から復旧していることが分かります。

障害発生中の FortiGate のルーティングテーブルは以下の通りです。

Routing table for VRF=0
S*      0.0.0.0/0 [11/0] via 10.100.2.254, wan2, [1/0]

wan2 から発信するルートに切り替わっていることが分かります。

リンクモニタの状態確認コマンド

diagnose sys link-monitor status allコマンドでリンクモニタの状態を確認できます。

以下は正常時のコマンド出力です。

Link Monitor: 8.8.8.8_from_wan1, Status: alive, Server num(1), cfg_version=0 HA state: local(alive), shared(alive)
Flags=0x1 init, Create time: Sat Apr  6 20:59:45 2024
Source interface: wan1 (5)
VRF: 0
Source IP: 10.100.1.1
Gateway: 10.100.1.254
Interval: 500 ms
Service-detect: disable
Diffservcode: 000000
Class-ID: 0
Transport-Group: 0
Class-ID: 0
  Peer: 8.8.8.8(8.8.8.8)
        Source IP(10.100.1.1)
        Route: 10.100.1.1->8.8.8.8/32, gwy(10.100.1.254)
        protocol: ping, state: alive
                Latency(Min/Max/Avg): 15.165/141.997/28.880 ms
                Jitter(Min/Max/Avg): 0.046/121.683/15.488 ms
                Packet lost: 0.000%
                MOS: 4.373
                Number of out-of-sequence packets: 0
                Fail Times(0/5)
                Packet sent: 4435, received: 3115, Sequence(sent/rcvd/exp): 4436/4436/4437

1行目のStatus: aliveや16行目のstate: aliveで正常であることを確認できます。

以下は障害発生時のコマンド出力です。

Link Monitor: 8.8.8.8_from_wan1, Status: dead, Server num(1), cfg_version=0 HA state: local(dead), shared(dead)
Flags=0x9 init log_downgateway, Create time: Sat Apr  6 20:59:45 2024
Source interface: wan1 (5)
VRF: 0
Source IP: 10.100.1.1
Gateway: 10.100.1.254
Interval: 500 ms
Service-detect: disable
Diffservcode: 000000
Class-ID: 0
Transport-Group: 0
Class-ID: 0
  Peer: 8.8.8.8(8.8.8.8)
        Source IP(10.100.1.1)
        Route: 10.100.1.1->8.8.8.8/32, gwy(10.100.1.254)
        protocol: ping, state: dead
                Packet lost: 16.000%
                MOS: 4.396
                Number of out-of-sequence packets: 0
                Recovery times(0/5) Fail Times(2/5)
                Packet sent: 4591, received: 3253, Sequence(sent/rcvd/exp): 4592/4574/4575

1行目のStatus: deadや16行目のstate: deadで障害発生中であることを確認できます。

リンクモニタ使用時の通信断時間について

リンクモニタ使用時の通信断時間は以下の設定項目の設定値に依存します。

項目set 設定項目デフォルト値
監視通信の間隔interval500 <ミリ秒>
障害と判定する失敗回数failtime5 <回>

デフォルトの設定では 500 ミリ秒間隔で送信される Ping が 5 回連続で失敗した場合に障害と判定されるため、少なくとも 2.5 秒間は通信断が発生します。上の設定項目の値を変えると通信断時間も変わってきます。

ただし、通信経路上の FortiGate 以外のネットワーク機器の設定内容もかかわってくるためネットワーク全体の設計を考慮する必要があります。

上記の interval、failtime のデフォルト値は FortiOS バージョンによって変わる可能性があるため、使用バージョンでのデフォルト値を確認することを推奨します。

障害復旧時の通信断について

障害から復旧時は通信経路の切り戻りが発生します。経路が戻るタイミングで瞬断程度の通信断が発生します。

【要注意】サーバダウンによる意図しない経路切り替わりが起こり得る

リンクモニタでは特定の経路上に障害が無いかを監視するために指定したアドレスへ Ping を実行しますが、指定したアドレスを持つサーバがダウンした場合もリンクモニタとしては障害発生と判断してしまいます。

経路上に障害が無ければ経路を切り替えたくは無いので、意図しない経路切り替わりが起こってしまうことになります。

これを防止する方法として、監視対象となるアドレス(サーバ)を複数設定する方法があります。

リンクモニタのserver設定では以下のように複数のアドレスを指定することが可能です。

config system link-monitor
    edit "8.8.8.8_from_wan1"
        set server "8.8.8.8" "8.8.4.4"
    next
end

server設定で複数のアドレスを指定した場合、すべてのアドレスに対して通信不可とならない限りは障害と判定されません。よって、一つのサーバのダウンによって経路切り替わりが発生することを防止できます。

2つのアドレスを指定した場合のdiagnose sys link-monitor status allの表示は以下のようになります。

FortiGate-60F # diagnose sys link-monitor status all

Link Monitor: 8.8.8.8_from_wan1, Status: alive, Server num(2), cfg_version=0 HA state: local(alive), shared(alive)
Flags=0x1 init, Create time: Mon Apr  8 21:01:49 2024
Source interface: wan1 (5)
VRF: 0
Source IP: 10.100.1.1
Gateway: 10.100.1.254
Interval: 500 ms
Service-detect: disable
Diffservcode: 000000
Class-ID: 0
Transport-Group: 0
Class-ID: 0
  Peer: 8.8.8.8(8.8.8.8)
        Source IP(10.100.1.1)
        Route: 10.100.1.1->8.8.8.8/32, gwy(10.100.1.254)
        protocol: ping, state: alive
                Latency(Min/Max/Avg): 0.527/0.654/0.584 ms
                Jitter(Min/Max/Avg): 0.003/0.113/0.050 ms
                Packet lost: 0.000%
                MOS: 4.404
                Number of out-of-sequence packets: 0
                Fail Times(0/5)
                Packet sent: 4533, received: 3666, Sequence(sent/rcvd/exp): 4534/4534/4535
  Peer: 8.8.4.4(8.8.4.4)
        Source IP(10.100.1.1)
        Route: 10.100.1.1->8.8.4.4/32, gwy(10.100.1.254)
        protocol: ping, state: alive
                Latency(Min/Max/Avg): 0.551/0.652/0.592 ms
                Jitter(Min/Max/Avg): 0.000/0.095/0.034 ms
                Packet lost: 0.000%
                MOS: 4.404
                Number of out-of-sequence packets: 0
                Fail Times(0/5)
                Packet sent: 4533, received: 2310, Sequence(sent/rcvd/exp): 4534/4534/4535

ここで 8.8.4.4 への疎通が取れなくなった場合、以下のような表時になります。

FortiGate-60F # diagnose sys link-monitor status all

Link Monitor: 8.8.8.8_from_wan1, Status: alive, Server num(2), cfg_version=0 HA state: local(alive), shared(alive)
Flags=0x1 init, Create time: Mon Apr  8 21:01:49 2024
Source interface: wan1 (5)
VRF: 0
Source IP: 10.100.1.1
Gateway: 10.100.1.254
Interval: 500 ms
Service-detect: disable
Diffservcode: 000000
Class-ID: 0
Transport-Group: 0
Class-ID: 0
  Peer: 8.8.8.8(8.8.8.8)
        Source IP(10.100.1.1)
        Route: 10.100.1.1->8.8.8.8/32, gwy(10.100.1.254)
        protocol: ping, state: alive
                Latency(Min/Max/Avg): 0.546/0.652/0.594 ms
                Jitter(Min/Max/Avg): 0.001/0.076/0.029 ms
                Packet lost: 0.000%
                MOS: 4.404
                Number of out-of-sequence packets: 0
                Fail Times(0/5)
                Packet sent: 4718, received: 3851, Sequence(sent/rcvd/exp): 4719/4719/4720
  Peer: 8.8.4.4(8.8.4.4)
        Source IP(10.100.1.1)
        Route: 10.100.1.1->8.8.4.4/32, gwy(10.100.1.254)
        protocol: ping, state: dead
                Packet lost: 65.000%
                MOS: 4.370
                Number of out-of-sequence packets: 0
                Recovery times(0/5) Fail Times(0/5)
                Packet sent: 4718, received: 2429, Sequence(sent/rcvd/exp): 4719/4653/4654

8.8.4.4 の状態を示す29行目ではstate: deadとなっていますが、全体の状態を示す3行目ではStatus: aliveとなっていて経路障害とは判定されていないことがわかります。

ここでさらに 8.8.8.8 へも疎通が取れなくなった場合は以下の表示になります。全体の状態を示す3行目でStatus: deadとなり経路障害であると判定されていることが分かります。

FortiGate-60F # diagnose sys link-monitor status all

Link Monitor: 8.8.8.8_from_wan1, Status: dead, Server num(2), cfg_version=0 HA state: local(dead), shared(dead)
Flags=0x9 init log_downgateway, Create time: Mon Apr  8 21:01:49 2024
Source interface: wan1 (5)
VRF: 0
Source IP: 10.100.1.1
Gateway: 10.100.1.254
Interval: 500 ms
Service-detect: disable
Diffservcode: 000000
Class-ID: 0
Transport-Group: 0
Class-ID: 0
  Peer: 8.8.8.8(8.8.8.8)
        Source IP(10.100.1.1)
        Route: 10.100.1.1->8.8.8.8/32, gwy(10.100.1.254)
        protocol: ping, state: dead
                Packet lost: 11.000%
                MOS: 4.399
                Number of out-of-sequence packets: 0
                Recovery times(0/5) Fail Times(1/5)
                Packet sent: 4963, received: 4084, Sequence(sent/rcvd/exp): 4964/4952/4953
  Peer: 8.8.4.4(8.8.4.4)
        Source IP(10.100.1.1)
        Route: 10.100.1.1->8.8.4.4/32, gwy(10.100.1.254)
        protocol: ping, state: dead
                Packet lost: 100.000%
                MOS: 4.350
                Number of out-of-sequence packets: 0
                Recovery times(0/5) Fail Times(0/5)
                Packet sent: 4963, received: 2429, Sequence(sent/rcvd/exp): 4964/4653/4654

以上です。

参考資料

あわせて読みたい

【おすすめ】FortiGate の設計構築中なら以下の記事も役立つかもです

Amazon アフィリエイトリンク

以下は Amazon アフィリエイトリンクです。インフラエンジニアにそこそこおすすめなアイテムです。

【アフィリエイト】ブログ始めるならおすすめ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次