前書き

某公衆Wi-Fiにて。Windows 11 を実行しているノートパソコンでWireguardを接続したところ、いくつかのホストにおいてWebサイトが表示できなくなった。IPv6専用ホストをいくつか持てる私は、VPNがないと接続できないので、非常に困った。

今回は、これをMTUの調整にて解決できたので、記事にしときます。

環境

  • OpenWRTで実行しているWireguard (正確ではないが、いわゆるサーバー側)
  • IPv4シングルスタック公衆Wi-Fi
  • OpenWRT内はIPv6シングルスタック(DNS64+NAT64)
  • Windows 11 上で実行しているWireguard (正確ではないが、いわゆるクライアント側)

手順

公衆Wi-FiのMTU測定

pingコマンドを使う方法もあるが、面倒なので下記で調べることができる。

Firefoxで測定できた。

https://www.speedguide.net/analyzer.php

測定が完了すると、「MTU = 1460」などと表示される。この1460がMTUの測定結果となります。

Wireguard内部で使えるMTUの計算

Wireguardで必要となる追加のヘッダー長は、次の通り。

Internet protocol Byte length
IPv6 80
IPv4 60

[WireGuard] Header / MTU sizes for Wireguard

Windows 11 の場合、IPv6とIPv4それぞれMTUを設定できるので、パフォーマンスを最大化したい場合は、異なる値に設定することが可能。

公衆Wi-FiのMTUが1460の場合、Wireguardの内側は、IPv6の場合「1380」、IPv4の場合「1400」となる。

今回、Wireguardの内部はIPv6シングルスタックなので、IPv6のみ設定する。

MTUの設定

Windows 11 で、PowerShellやコマンドプロンプトを管理者権限で起動します。

Wireguardのネットワークインターフェースインデックスを調べます。

netsh interface ipv6 show interface

名前の欄に「wg0」とあるインターフェースの「Idx」を知ることができます。

Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 30           0        1420  connected     wg0
 20          45        1500  connected     Wi-Fi
 10           5        1500  disconnected  イーサネット
  6          65        1500  disconnected  Bluetooth ネットワーク接続

調べたidxと計算したMTUを含めて、下記のようにコマンドを作成して実行します。

netsh interface ipv6 set interface 30 mtu=1380

IPv4を設定される場合は、コマンド中の「ipv6」を「ipv4」に変更して実行します。