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テーブルも必ず確認するようになりました。


事象の概要
今回の事象は以下の状況で発生しました。
| 項目 | 状況 |
|---|---|
| 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 ← ❌ 別機器のMAC192.168.1.100はFortiGateのVIPまたはIPプールで使用する予定のアドレスですが、ARPテーブルにはaa:bb:cc:dd:ee:ffという別の機器のMACアドレスが登録されています。この状態では上位スイッチが192.168.1.100宛のパケットをFortiGateではなく別の機器(または存在しない機器)に転送してしまいます。
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キャッシュが残っている場合、スイッチは「すでにMACアドレスを知っている」ため新たにARP要求を送りません。FortiGateがARP応答を返せる状態でも、そもそもARP要求が来ないため更新されないというのが今回の根本原因です。
→ 192.168.1.100宛に送信
ARPテーブル:
192.168.1.100 → aa:bb:cc:dd(旧機器)
FortiGateには届かない
対処法:インターフェースに一時的にIPを割り当ててARP更新を狙う
今回は以下の手順で対処しました。
検討した選択肢と却下した理由
| 対処案 | 判断 | 理由 |
|---|---|---|
| L3スイッチのARPテーブルを全クリア | 却下 | 他の機器のARPエントリも消えるため、再学習が完了するまで全体に影響が出る可能性がある |
| スタティックARPエントリを手動削除 | 条件付き有効 | スタティックエントリであれば削除後にFortiGateのMACが学習される。ただし削除後に正しく再学習されるか確認が必要 |
| FortiGateのインターフェースに一時的にIPを設定 | 採用 | 物理インターフェースにIPを設定すると自動的にGratuitous ARPが送信され、上位スイッチのARPキャッシュを強制上書きできる。他機器への影響が最小限 |
実際の対処手順
物理インターフェース(今回は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上位スイッチで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に更新されていればOKARPの更新を確認したら、物理インターフェースから一時的に設定した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) # endVIPの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
endarp-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テーブルを確認する習慣をつける
同様のトラブルに直面した際はぜひ参考にしてください。



