画像4

今でもちょいちょい訊かれることが多いため、メモ程度にまとめておきます。

参考URL:
GRE および IP セキュリティでの IP フラグメンテーション、MTU、MSS、および PMTUD の問題の解決
http://www.cisco.com/cisco/web/support/JP/100/1006/1006439_pmtud_ipfrag-j.html 


■MTU値の計測

 一般的にイーサネットでは標準フレームサイズとして1,500bytesで通信をおこないます。そのためMTU(Maximum Transmission Unit, 最大伝送ユニット)値として1500が設定されていることになります。

フレッツ回線の場合PPPoE接続のため46bytesを使用するため、MTUは1454となります。さらにNTT西日本のフレッツ光プレミアムでは、IPv6を使用するCTUの仕様で1438になります。この辺は一般的なブロードバンドルータだと自動で設定されるので周知の通り。

ただし、CATV回線やマンション敷設のVDSL等の場合、さらにケーブルモデムやVDSLモデムの仕様でMTUが低く設定されている可能性があります。

この場合、PCをWAN回線に直結し、pingコマンドでフレーム数を計測します。

ping www.yahoo.co.jp -f -l "フレーム数 - 28"

pingコマンドではIPヘッダ部(20bytes)とTCP(ICMP)ヘッダ部(8bytes)を併せて28bytesが必要なので、実際に計測するフレーム数から28を引いて設定します。

MTU:1500の場合
 ping www.yahoo.co.jp -f -l 1472 でping応答あり、同1473で「DF(分割禁止)が設定されています」のエラー。

MTU:1454の場合(フレッツ回線)
 ping www.yahoo.co.jp -f -l 1426 でping応答あり、1427でエラー。

MTU:1300の場合(VDSL、CATVなど)
 ping www.yahoo.co.jp -f -l 1272 でping応答あり、1273でエラー。


■ルータへのMSS値の設定
MSS(TCP Maximum Segment Size, 最大セグメントサイズ)値は、実際にTCP/IPで受け取るデータ量で、CiscoルータではLAN側インターフェースで「ip tcp adjust-mss」コマンドにより、MTUから各種ヘッダのサイズを引いたサイズを設定します。

標準でMSSはIPヘッダ(20bytes)とTCPヘッダ(20bytes)の合計40bytesをMTUから除いた値となります(MTU:1454の場合、MSSは1414)。

ただし、ルータがVPNなどでトンネリングや暗号化を行う場合、ルータ間の通信では必要なヘッダが付加されますのでMSSでは相当分を差し引いて設定する必要があります。


■CiscoルータでのMSSの設定例

(コマンド例)
 interface Vlan 1
 ip tcp adjust-mss 1314
 
通常のMSS値=MTU値-40、だが、VPNの場合、さらにIPsecやGREのヘッダを引いた値を設定する必要があります。

 設定例(Path MTU:1454の場合)
VPNなしの場合のMSS値: 1454 - 40 = 1414


VPNありの場合のMSS値
①IPSecカプセリング&暗号化により付加されるヘッダ
・IPsec(ESP-AES-SHA1): 12 (SHA1)  + 16 (AES)  + 8 (ESP)  + 20 (IPv4) = 56
・IPsec(ESP-3DES-SHA1):  12 (SHA1)  + 8 (3DES)  + 8 (ESP)  + 20 (IPv4) = 48

②GREトンネルにより付加されるヘッダ
・GREトンネル:  24

IPsec + GRE トンネルVPNでのMSS値 1454 - ① - ② - 40
  1454 - 56 - 24 - 40 = 1334

ただし、CiscoではGRE + IPSecでの差し引き分を100bytes(フレーム数1500の場合MTUは1400)にすることを推奨しているため、おなじくフレッツの場合

 1454 - 100 - 40 = 1314

を割り当てればよいと考えられます。

なお、詳細は割愛しますが、この値(差し引き分100bytes)を割り当てておけば、GRE + IPSecの場合のほか、DMVPNなどの他のVPNソリューションを使用した場合も対応できるようです。