2021年12月25日土曜日

PowerShellでMTUを計測する

先日WireGuardを使って、外部からインターネット回線経由で自宅にVPN接続できるよう構成した。

しかし、インターネット回線で接続する際に、ファイル共有やSSHによる接続は問題なくできるが、リモートデスクトップ接続が黒い画面で接続・切断を繰り返すという事象が発生し悩まされた。

結論としては、MTUの問題であった。自宅のv6プラスのインターネット回線 (ドコモ光) は最大MTUサイズが1460byteであり、WireGuardのヘッダーサイズを考慮して、MTUサイズを小さくしなければ、フラグメント禁止フラグ (DFフラグ; Don’t Fragmentフラグ) が設定されたパケットが通過できず通信が不安定になっていたのだ。

具体的にWireGuardで必要となるヘッダーサイズは以下の通り。

項目 ヘッダーサイズ (byte)
IPヘッダー 20 (IPv4の場合)、40 (IPv6の場合)
UDPヘッダー 8
WireGuardで必要なヘッダーサイズ 32
合計 60 (IPv4の場合)、80 (IPv6の場合)

上記の通りとなるため、回線の最大MTUサイズから60または80byteを引いた値をWireGuardのサーバ側のMTU設定にて指定する必要がある。

今回は、このような状況を想定して、通過可能なMTUサイズをPowerShellを使って測定するコマンドを記載する。

MTUを計測用PowerShellコマンド

1. PowerShellコマンド

MTUサイズを1500から1ずつ下げながら、DFフラグを付けたpingを実行し、成功した際のMTUサイズを表示するコマンドとなる。ping先はwww.yahoo.co.jpとさせてもらった。

for($mtu = 1500; $mtu -ge 1420; $mtu--){
  ping -f -l ${mtu} -n 1 www.yahoo.co.jp > $null
  if($? -eq $true){
    Write-Host "回線のMTUは"($mtu + 28)"です。"
    break
  }
}

実際の実行結果を以降に示す。

2. ドコモ・AUをテザリングで使用した場合の測定結果

ドコモ・AUをテザリングで利用した際のMTUサイズは1500byteのようだ。

PS C:\> for($mtu = 1500; $mtu -ge 1420; $mtu--){
>>   ping -f -l ${mtu} -n 1 www.yahoo.co.jp > $null
>>   if($? -eq $true){
>>     Write-Host "回線のMTUは"($mtu + 28)"です。"
>>     break
>>   }
>> }
回線のMTUは 1500 です。

3. v6プラスのインターネット回線 (ドコモ光) の測定結果

v6プラスのインターネット回線 (ドコモ光) のMTUサイズは1460byteのようだ。

PS C:\> for($mtu = 1500; $mtu -ge 1420; $mtu--){
>>   ping -f -l ${mtu} -n 1 www.yahoo.co.jp > $null
>>   if($? -eq $true){
>>     Write-Host "回線のMTUは"($mtu + 28)"です。"
>>     break
>>   }
>> }
回線のMTUは 1460 です。

参考

0 件のコメント:

コメントを投稿

人気の投稿