前提
- YAMAHA製ルーター
- Windows10のVPNクライアント
- L2PT/IPSecでVPN接続
- VPN接続先のLANにWebサーバーが居る
- VPN接続は確立しており、Webサーバーへのpingは通っている
- WebサーバーへのHTTP(S)通信はページや通信状況?で表示出来たりできなかったりする
- WebサーバーもWindowsベース(ここは未確定)
解決方法
VPNトンネルにMSSを明示的に設定します。
ルーターのVPN設定の確認
VPNトンネルの設定からMTUを見つける
CONFIGリポートのPP anonymousの設定から、ip pp mtu xxxx
という記述を探します。
ここで指定されている値がVPN接続のMTUです。
VPNトンネルの設定からMSSを見つける
個々のVPNトンネル設定から、ip tunnel tcp mss limit xxxx
という記述を見つけます。
値がauto
になっている場合、tunnel select ...
からtunnel enable ...
までのブロックをコピーして、該当のmss limit xxxx
の値を先ほど見つけたmtuから40を引いた値で上書き設定します。
VPN接続とサイトが閲覧可能か確認します。
多分これで安定して閲覧できるようになるかと思います。
説明
MTUとMSS
用語の解説はこちらをご参照ください。
通常、MSSはネゴシエーションの過程で調整されるはずですが、Windows10はそれが非常に苦手なようです。
今回この記事を書く理由になったサーバーとクライアントの通信のパケットを確認したところ、ルーターからのICMP type3 code4(Fragmentation Needed and DF set)をサーバーが無視します。
このため、サーバーからのパケットが破棄され、クライアントはリクエストを再送し、やがて通信が途絶してしまいます。
VPNトンネルのMTUは設定で明示されているため、そこからTCP/IPのヘッダー長40を引いた値をMSSとして設定しておけば、安定した通信が可能になります。
YAMAHAさんはWindowsのVPNクライアントをサポートしないと明言しているため、おそらくWindowsの実装に不具合があるのでしょう…
クライアントの最適なMTUを調べて設定するのは大変ですが、ルーターがMSS書き換えに対応できるのであれば、こちらの方が楽です。