某ファミレスにて、無料で使用できるWi-Fiに接続して、VPN接続し、リモート作業をしようとした。
以前までは使えていたはずなのに、なぜか使えなくなっている。
具体的な状況は以下のとおり。
- VPN接続(IKEv2)は可能
- VPN接続後、SSHでサーバに接続しようしても、シェルが出てこない
- VPN接続後、リモートデスクトップすると繋がっているが、画面が黒いまま
以上から、VPN接続後のTCPセッションは張れるが、その後の通信が出来ていない、サイズの小さいパケットは通るが、大きいパケットが通らないと推察される。
つまり、MTUが小さい可能性がある。
この状況での対処方法を記載する。
MTUの調査
まずは無料Wi-Fiの回線のMTUを調査する。
調査方法としては、以下の方法がある。
- 以下のサイトにアクセスし、MTU確認する
https://www.speedguide.net/analyzer.php - コマンドプロンプトのPingでパケットサイズ指定を変えながら、応答がある最大のサイズを探す。
> ping www.yahoo.co.jp -f -l 1090
その値に+28した値がMTUである。
この例では、1118となる。
某ファミレスでは、このMTUが1118となっていた。
イーサネットは通常1500、フレッツのPPPoEは1454であるため、このMTUは非常に小さい値である。
途中経路で暗号化をしているなどで、MTUが減ることは仕方が無いが、ここまで小さいと、わざと潰して、ネットワークを使用するゲームやテレワークをさせないためでは無いかと勘ぐってしまう。(回線業者側の都合か店側の都合か。でも電源完備の店ため、それは無いとは思うが)
ちなみにWindowsのリモートデスクトップは、UDP接続でも1300程度必要になる。
RDPで最近知ったこと - MTUと3-way UDP handshake
WindowsのRDPについて調べていて分かったことを記載しました。
VPNの最適MTUの算出
以下の計算機を使い、MTUからVPNに最適なMTUを算出する。
IPsecパケットのフォーマットと最適MTUの計算方法をまとめ、計算機を作成しました。最適MTUを設定することでVPNが快適になるかもしれません。
インターネット/回線の種類:手動入力/Custom
暗号化方式:お使いの物を選択(私はAES-GCM)
完全性アルゴリズム:お使いの物を選択(私はAES-GCM with a 16 octes ICV)
方式:お使いの物を選択(私はIKEv2のため、Remote Access Client)
NAT traversal:NATの内側にいるためチェック
インターネット回線/WAN MTU:1118
Calculateボタンを押す
私の場合は、最適 (Optimal) MTUが、1054となった。
VPNインターフェースMTUの変更
WindowsのVPNインターフェースのMTUを最適MTUに変更する。
- VPN接続をする(VPNインターフェースを出すため)
- 管理者権限でコマンドプロンプトを立ち上げる
- 以下を実行し、VPNのIdxを確認(名前は環境により変わります)
> netsh interface ipv4 show interface Idx Met MTU 状態 名前 --- ---------- ---------- ------------ --------------------------- 51 35 1400 connected VPN 1 75 4294967295 connected Loopback Pseudo-Interface 1 14 50 1500 connected Wi-Fi 2
- 対象のVPNインターフェースに最適MTUを設定
> netsh interface ipv4 set interface 51 mtu=1054 OK
- 反映を確認
> netsh interface ipv4 show interface Idx Met MTU 状態 名前 --- ---------- ---------- ------------ --------------------------- 51 35 1054 connected VPN 1 75 4294967295 connected Loopback Pseudo-Interface 1 14 50 1500 connected Wi-Fi 2
- 念のためVPNを接続し直す
これで設定したMTU以下で通信が行われ、VPN接続先に通信ができるようなった。
iPhoneやAndroidの場合は、MTUを指定できないため、途中経路のルータやVPNサーバのiptables/nftables等でTCPのMSSを書き換える必要がある。
VPNでMTUとMSSを指定するにはどうすれば良いかを書いています。
CentOS 8 でnftablesを設定しました。日本(国内)からのトラフィックのみを許可、VPNのMTU/MSS最適化もしてみました。