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
endVPNやIPoE tunnel等でヘッダーが付与されMTUが小さくなる環境では、TCPハンドシェイク時にMSS値を自動調整(最大1420バイト等に制限)することで、パケットのフラグメンテーションやPMTUDエラーの発生自体を防げます。
まとめ
- PMTUD用のICMP応答・許可はFortiGateが標準機能とステートフルインスペクションで自動処理するため、専用ポリシーは不要
- ICMPが経路上で遮断されPMTUDが機能しない場合は、専用ポリシーではなくTCP MSSクランプ(
tcp-mss-sender/tcp-mss-receiver)で対処するのが確実
PMTUD関連のトラブルに遭遇したら、まずICMPポリシーの追加を検討する前に、MSSクランプの設定が入っているかを確認するとよいでしょう。