FortiGateを設置したネットワーク環境で、SNAT(ソースNAT)およびDNAT(デスティネーションNAT)が正常に動作しない事象が発生しました。
設定には特に問題がなく、FortiGateのログにも拒否や許可の形跡が見られなかったため、そもそも通信がFortiGateに届いていない状態でした。
原因調査のため、上位L3スイッチでARPテーブルを確認しました。
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 ← FortiGateで使う予定のIP
この結果から、FortiGateが使用する予定だったIPアドレスに、別のMACアドレスが登録されていたことが判明しました。いわゆるIPアドレスの重複です。
なぜARPが更新されなかったのか
重複していた機器を取り外しても、ARPテーブルは更新されませんでした。
これは、FortiGateがそのIPで通信しない限りARPリクエストを送らないためです。SNATやVIPで設定されたIPは仮想的に割り当てられているだけで、FortiGate自身が通信をしないとARP応答も出しません。
対処法:インターフェースに一時的にIPを割り当ててARP更新を狙う
L3スイッチのARPテーブルをクリアすることも考えましたが、他機器に影響が出る可能性があったため却下しました。
そこで、FortiGateの物理インターフェース(WAN側)に、一時的にそのIPアドレスを設定してARPを送らせる方法を取りました。
FGT# config system interface
FGT(interface) # edit wan1
FGT(wan1) # set ip 192.168.1.100 255.255.255.0
FGT(wan1) # end
このコマンドを入力後、FortiGateがARPを送信し、上位スイッチのMACアドレスが更新されました。
ARPが書き換わったことを確認したら、インターフェースからこのIPを削除して、SNAT/DNAT設定を元に戻せば完了です。
まとめ
SNATやDNATで使うIPが他機器と重複していた場合、ARPが更新されないとFortiGateに通信が届きません。
FortiGateの性質上、仮想IPではARPを自発的に出さないため、一時的に物理インターフェースへ設定しARPを送らせる方法は非常に有効です。
同じようなトラブルに直面した際は、参考にしてみてください。