FortiGateを運用していると「PMTUD(Path MTU Discovery)用に専用のファイアウォールポリシーを作るべきか」という疑問に行き当たることがあります。
結論から言うと、原則として専用ポリシーを個別に作成する必要はありません。本記事ではその理由と、PMTUDがうまく機能しない場合の対策を整理します。

なぜ専用ポリシーが不要なのか

① FortiGate自体の自動応答機能(send-pmtu-icmp)

FortiGateには、MTUを超えるサイズのパケット(DFビット=1)を受信した際、送信元へ自動的にICMP(Type 3, Code 4: Fragmentation Needed)を返送してPMTUDをサポートする機能が、デフォルトで有効化されています(set send-pmtu-icmp enable)。つまり、この応答自体はFortiGateが標準で処理してくれます。

② ステートフルインスペクションによる関連ICMPの自動許可

通過トラフィック(トランジット通信)で発生するPMTUD用のICMPエラーメッセージは、FortiOSのステートフルインスペクションエンジンによって「既存セッションに関連するトラフィック(Related ICMP)」として自動的に処理・許可されます。そのため、ICMPを通過させるためだけの個別ファイアウォールポリシーを定義する必要はありません。

補足:PMTUDが機能しない(ブラックホール化する)場合の対策

途中のインターネット網や相手側機器でICMPが遮断され、PMTUDが正常に機能しない現象、いわゆるPMTUDブラックホールが発生することがあります。

FortiGateでこの問題を回避・解消する際は、専用のICMPポリシーを作るのではなく、既存のファイアウォールポリシー内で「TCP MSSの調整(MSSクランプ)」を設定するのが一般的かつ確実な対策です。

ポリシーでの設定例(IPoE/VPN等の環境)

config firewall policy
    edit <ポリシーID>
        set tcp-mss-sender 1420
        set tcp-mss-receiver 1420
    next
end

VPNやIPoE tunnel等でヘッダーが付与されMTUが小さくなる環境では、TCPハンドシェイク時にMSS値を自動調整(最大1420バイト等に制限)することで、パケットのフラグメンテーションやPMTUDエラーの発生自体を防げます。

まとめ

  • PMTUD用のICMP応答・許可はFortiGateが標準機能とステートフルインスペクションで自動処理するため、専用ポリシーは不要
  • ICMPが経路上で遮断されPMTUDが機能しない場合は、専用ポリシーではなくTCP MSSクランプ(tcp-mss-sender / tcp-mss-receiver)で対処するのが確実

PMTUD関連のトラブルに遭遇したら、まずICMPポリシーの追加を検討する前に、MSSクランプの設定が入っているかを確認するとよいでしょう。