【図解】FortiGateのmtuとtcp-mss設定~Ciscoのadjust-mssとの違い~

前提

MTU と MSS の基礎知識は以下で手に入れて下さい。

【図解】MTUとMSS, パケット分割の考え方(IPフラグメンテーションとTCPセグメンテーション)
【図解】MTUとMSS, パケット分割の考え方(IPフラグメンテーションとTCPセグメンテーション)
MTU と MSS の違い MTU (Maximum Transmissi...

FortiGate と Cisco の MTU 設定と MSS 調整設定

FortiGate には Cisco と同様にインタフェースに対して MTU や MSS 調整設定をすることができます。

MTU については両機器に差異はありません。出力インタフェースの最大転送ユニットを指定します。以下では、MTU=1480 の設定例を示しています。

[Cisco の MTU 設定]

(config)# interface giga 0/0
(config-if)# ip mtu 1480

[FortiGate の MTU 設定]

# config system interface
# edit wan1
# set mtu-override enable
# set mtu 1480

ですが MSS 調整については細かい挙動が異なります。

Cisco の MSS 調整設定

Cisco の "ip tcp adjust-mss" 設定を入れたインタフェースは、TCP syn および TCP syn/ack のいずれにおいても、TCP のオプション#2 [MSS] を書き換える動作をします。

MSS はネゴシエーションではなく単一方向でそれぞれ通知しあうものなので、クライアントはサーバに自分の MSS(パケット当たりで受信できる TCP ペイロードの大きさ)を伝えますし、その値が何であるかを考慮せず、サーバはクライアントに自分の MSS を伝えます。

"ip tcp adjust-mss 1440" を設定することで、クライアント⇒サーバの TCP syn の MSS も書き換わるし、サーバ⇒クライアントの TCP syn/ack の MSS も書き換わります。

FortiGate の set tcp-mss 設定

FortiGate の場合は set tcp-mss 1440 を設定したインタフェースに入ってくる TCP syn および TCP syn/ack の MSS を書き換えますが、インタフェースから出力されるパケットについては MSS の書き換えを行いません。

なので Cisco と同様の挙動にするには、通過するインタフェース両方に set tcp-mss を設定する必要があります。

ただ、ここにも1つ問題があります。現状の FortiOS (5.6 や 6.) では PPPoE 設定をしているインタフェースには set tcp-mss が効かないそうです。

この問題を回避するには、インタフェースレベルでの MSS 調整設定を諦め、ポリシーレベルでの MSS 調整設定を入れる必要があります。

# config firewall policy
# edit 1
# set tcp-mss-sender 1440
# set tcp-mss-receiver 1440

このように両方設定することで Cisco と同様、クライアントにもサーバにも書き換えた MSS を通知することができます。