FortiGate SNAT / DNAT ARP IPアドレス重複 トラブルシューティング

FortiGateを設置したネットワーク環境で、SNAT(ソースNAT)およびDNAT(デスティネーションNAT)が正常に動作しない事象が発生しました。設定には問題なく、FortiGateのログにも拒否や許可の形跡がない。つまりそもそも通信がFortiGateに届いていないという状況でした。

原因はIPアドレスの重複でした。しかし単純な重複ではなく、FortiGateのVIP(DNAT)やIPプール(SNAT)で使用する仮想IPの特性が絡んだ、少し厄介なトラブルです。本記事では、このトラブルの原因と対処法を現場での実体験をもとに解説します。

👷 現場での体験談

FortiGateの導入作業でNAT設定を終えて「あとは通信確認だけ」という段階になったのに、まったく通信が通らない状況になりました。FortiGateのポリシーログを見ても何もヒットしていない。最初はポリシーの問題だと思って設定を何度も見直しましたが、原因はまったく別のところにありました。

上位スイッチのARPテーブルを確認すると、FortiGateが使うはずのIPに別のMACアドレスが登録されていました。以前その環境で使われていた機器が取り外し済みだったにもかかわらず、ARPのキャッシュが残り続けていたのです。「通信がFortiGateに届いていない」のではなく「通信が古いMACアドレス宛に飛んでいた」というのが正確な状況でした。この経験から、NAT設定が終わったらARPテーブルも必ず確認するようになりました。

SNAT/DNAT IP重複問題図
SNAT/DNAT IP重複問題:同一IPアドレスの二重利用による通信不安定と対処法
SNAT/DNAT IP重複問題図
SNAT/DNAT IP重複問題:同一IPアドレスの二重利用による通信不安定と対処法

事象の概要

今回の事象は以下の状況で発生しました。

項目状況
FortiGateの設定SNAT(IPプール)・DNAT(VIP)を設定済み。設定内容に誤りなし
FortiGateのログ許可・拒否のログともにヒットなし。通信がFortiGateに届いていない状態
実際の原因FortiGateが使用するIPアドレスに、別機器のMACアドレスが上位スイッチのARPテーブルに残存していた
発生タイミング以前使用していた機器を取り外した後、同じIPをFortiGateのNATに割り当てたタイミング

ARPテーブルで原因を特定する

通信がFortiGateに届いていない場合、まず上位L3スイッチのARPテーブルを確認します。ARPテーブルは「このIPアドレスはこのMACアドレスの機器が持っている」という対応表です。ここに間違ったMACアドレスが登録されていると、パケットが正しい宛先(FortiGate)に届きません。

Switch# show arp

Protocol  Address       Age (min)  Hardware Addr       Type   Interface
Internet  192.168.1.254  2         00:11:22:33:44:55   ARPA   Vlan10
Internet  192.168.1.100  -         aa:bb:cc:dd:ee:ff   ARPA   Vlan10  ← ❌ 別機器のMAC

192.168.1.100はFortiGateのVIPまたはIPプールで使用する予定のアドレスですが、ARPテーブルにはaa:bb:cc:dd:ee:ffという別の機器のMACアドレスが登録されています。この状態では上位スイッチが192.168.1.100宛のパケットをFortiGateではなく別の機器(または存在しない機器)に転送してしまいます。

🚨 Age(min)が「-」になっているエントリに注意 CiscoスイッチでAgeが「-(ダッシュ)」のエントリはスタティック(手動設定)または固定割り当てのARPエントリです。動的エントリはエージングで自然消滅しますが、スタティックエントリはコマンドで明示的に削除するまで残り続けます。

なぜARPが更新されなかったのか

重複していた機器を取り外した後も、上位スイッチのARPテーブルは古いMACアドレスを保持し続けていました。これにはFortiGateのNAT設定特有の動作が関係しています。

FortiGateのVIP(DNAT)とIPプール(SNAT)のARP動作

NATの種類ARP応答(Respond)自発的なARP送信(Gratuitous ARP)問題のポイント
VIP(DNAT)デフォルト有効
(arp-reply enable)
送信しないARP要求が来れば応答できるが、古いキャッシュがある場合は要求自体が来ない
IPプール(SNAT)通信発生時のみ送信しないFortiGateから外向きの通信が発生しない限りARPは更新されない

ARPには2種類の動作があります。

ARP応答(Reply)
「誰が192.168.1.100を持っていますか?」というARP要求を受けて、「私です」と返す動作。FortiGateのVIPはこれをデフォルトで行う
Gratuitous ARP(自発送信)
要求されていないのに自ら「192.168.1.100は私(このMAC)です」と宣言するARP。キャッシュを強制上書きできる。FortiGateのVIP・IPプールはこれを送信しない

上位スイッチに古いARPキャッシュが残っている場合、スイッチは「すでにMACアドレスを知っている」ため新たにARP要求を送りません。FortiGateがARP応答を返せる状態でも、そもそもARP要求が来ないため更新されないというのが今回の根本原因です。

図1:古いARPキャッシュによってパケットが届かない仕組み
外部クライアント
→ 192.168.1.100宛に送信
上位L3スイッチ
ARPテーブル:
192.168.1.100 → aa:bb:cc:dd(旧機器)
❌ 旧機器(存在しない)に転送
FortiGateには届かない
FortiGateのVIPはARP要求があれば応答できるが、スイッチは古いキャッシュを使うためARP要求を出さない
図2:IPアドレス重複トラブルの原因内訳(現場経験ベース)

対処法:インターフェースに一時的にIPを割り当ててARP更新を狙う

今回は以下の手順で対処しました。

検討した選択肢と却下した理由

対処案判断理由
L3スイッチのARPテーブルを全クリア却下他の機器のARPエントリも消えるため、再学習が完了するまで全体に影響が出る可能性がある
スタティックARPエントリを手動削除条件付き有効スタティックエントリであれば削除後にFortiGateのMACが学習される。ただし削除後に正しく再学習されるか確認が必要
FortiGateのインターフェースに一時的にIPを設定採用物理インターフェースにIPを設定すると自動的にGratuitous ARPが送信され、上位スイッチのARPキャッシュを強制上書きできる。他機器への影響が最小限

実際の対処手順

1
FortiGateの物理インターフェースに重複IPを一時設定する

物理インターフェース(今回はwan1)に問題のIPアドレスを設定します。これによりFortiGateがGratuitous ARPを自動送信し、上位スイッチのARPキャッシュを強制的に上書きします。

FGT# config system interface
FGT(interface) # edit wan1
FGT(wan1) # set ip 192.168.1.100 255.255.255.0
FGT(wan1) # end
2
上位スイッチのARPテーブルが更新されたか確認する

上位スイッチでshow arpを再実行し、MACアドレスがFortiGateのものに更新されたか確認します。

Switch# show arp

Protocol  Address       Age (min)  Hardware Addr       Type   Interface
Internet  192.168.1.100  0         xx:xx:xx:xx:xx:xx   ARPA   Vlan10
                                   ↑ FortiGateのMACに更新されていればOK
3
インターフェースから一時IPを削除し、元のNAT設定に戻す

ARPの更新を確認したら、物理インターフェースから一時的に設定したIPを削除し、元のVIP・IPプール設定に戻します。

FGT# config system interface
FGT(interface) # edit wan1
FGT(wan1) # unset ip
FGT(wan1) # end

! 元のインターフェースIP(例:192.168.1.1)を再設定する場合
FGT(wan1) # set ip 192.168.1.1 255.255.255.0
FGT(wan1) # end
注意:unset ip後はインターフェースIPが消えるため、そのインターフェース経由のSSH接続が切れる場合があります。コンソール接続またはWebGUIからの作業を推奨します。

VIPのARP動作をCLIで確認する

FortiGateのVIPにはarp-replyという設定があります。デフォルトで有効(enable)になっており、ARP要求が来た際にFortiGateが応答を返す動作をします。念のためこの設定が有効になっているか確認しておきましょう。

! VIPの設定確認
FGT# show firewall vip

config firewall vip
    edit "VIP_192.168.1.100"
        set extip 192.168.1.100
        set mappedip 10.0.0.10
        set extintf "wan1"
        set arp-reply enable    ← ここがenableになっているか確認
    next
end
ℹ arp-reply と Gratuitous ARP の違い arp-reply enableは「ARP要求が来たら応答する」設定です。これとは別にGratuitous ARP(自発的なARP送信)は、VIPとIPプールでは自動送信されません。今回のように上位スイッチに古いキャッシュが残っている場合はarp-replyがenableでも解決しないため、物理インターフェースへの一時設定でGratuitous ARPを送らせる手法が有効です。

同様のトラブルを防ぐための確認チェックリスト

FortiGateのNAT設定後に通信が通らない場合、以下の順番で確認すると原因を早期に特定できます。

順番確認内容コマンド
FortiGateのログにヒットがあるかFortiGate GUI → ログ
上位スイッチのARPテーブルを確認show arp
VIPのarp-reply設定確認show firewall vip
FortiGateのルーティングテーブル確認get router info routing-table all
フロートレースで通信経路を追跡diagnose debug flow filter addr [IP]
diagnose debug flow trace start 10

まとめ

SNATやDNATで使うIPが他機器と重複していた場合、ARPテーブルが更新されずFortiGateに通信が届かないことがあります。

  • FortiGateのVIP(DNAT)はARP応答(arp-reply)はするが、Gratuitous ARPは送信しない
  • 上位スイッチに古いARPキャッシュが残っていると、ARP要求自体が来ないため自然には更新されない
  • 対処法は物理インターフェースに一時的にIPを設定→Gratuitous ARPを強制送信→ARPキャッシュ更新後にIPを削除
  • ARPテーブルの全クリアは他機器への影響があるため、今回の手法が影響を最小限に抑えられる
  • NAT設定後に通信が通らない場合、まずFortiGateのログを確認し、ログにヒットがなければ上位スイッチのARPテーブルを確認する習慣をつける

同様のトラブルに直面した際はぜひ参考にしてください。