Oracle VirtualBoxでMTU値を自動で設定する

# 1. TryHackMeでラボマシンのWebページが表示されない
現在，私は[TtryHackMe](https://tryhackme.com/, "TryHackMe")でサイバーセキュリティに関する勉強をしているのですが，ラボマシンのWebページが表示されないという問題が起きていました．

この問題について解決する方法を検索していたとき，MTU値が異なることで通信に問題が起きていることがわかりました．

本稿では，これを解決する方法を提示します．

https://tryhackme.com/

## 1.1 環境構成
ホストOS : Windows 11 Pro 24H2
仮想環境：Oracle VirtualBox 7.1.6
ゲストOS：Kali Linux 2025.1

# 2. 最適なMTU値を探る
## 2.1 現在のMTU値を調べる
コマンドプロンプトで以下のコードを実行する．
なおeth0とはイーサネットのことで，ETHernetの０番のことです．

```bash:bash
$ ip link show
````

私の使用環境では，使用しているイーサネットであるeth0のMTU値がデフォルトで1500でした．
恐らく分割したパケットが大きすぎて，通信に問題が生じていたものと思われます．

## 2.2 最適MTU値を調べる
ここから最適なMTU値を調べます．
これを調べるためには，コマンドプロンプトで実行したときに実際に通信を確立する必要がありますので，ここでは[Google](https://www.google.com/, "Google")を通信用に設定することにします．

以下に最適MTU値を調べる方法を2つ提示しますが，方法1は何度も繰り返す必要があって大変なので方法2をお勧めします．

## 方法1：地道に繰り返す
次の内容をコマンドプロンプトで実行します．

```bash:bash
$ ping -c 1 -M do -s 1500 google.com
````

帰ってきた応答に応じて，MTU値を1500から少しずつ小さくして繰り返し実行します．

## 方法2：最適MTU値を自動的に算出する
ここでは最適なMTU値を自動で検出する方法を提示します．

### 手順1：MTUを自動で検出するスクリプトを保存する．
次に示すスクリプトはMTU値を自動で算出するスクリプトです．nanoコマンドを使用するなどして，このスクリプトをターミナルからホームディレクトリに保存してください．

```bash:bash
#!/bin/bash

HOST="google.com"
LOW=1200
HIGH=1472
BEST=0

echo "Finding maximum MTU for $HOST..."

while [ $LOW -le $HIGH ]; do
    MID=$(( (LOW + HIGH) / 2 ))
    echo -n "Trying size $MID... "
    ping -c 1 -M do -s $MID $HOST > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "Success"
        BEST=$MID
        LOW=$((MID + 1))
    else
        echo "Fail"
        HIGH=$((MID - 1))
    fi
done

MTU=$((BEST + 28))
echo "==> Maximum payload size without fragmentation: $BEST bytes"
echo "==> Recommended MTU: $MTU bytes"
````

### 手順2：実行権限をつけて実行する
ホームディレクトリに先ほどのスク　リプトを保存したら，次のコマンドを実行します．

```bash:bash
chmod +x find_mtu.sh      # 実行権限を追加
./find_mtu.sh             # スクリプトを実行
````

これを実行すると，最適なMTU値が判明します．
判明したMTU値を変更するには次のコマンドを実行します．

```bash:bash
$ sudo ip link set dev eth0 mtu <最適MTU値>
````

ただしこの変更は一時的なもので，マシンを再起動させた時，デフォルト値に置き換わってしまいます．

# 3. MTU値を永続化させる
マシンを再起動させてもMTU値がデフォルトに戻らないよう設定する方法を3通り示します．

ただし，一つの方法のみを行ってみてもうまくいかない場合は残りの二つの方法をやってみてください．
（というのも，方法１で変更を試みても，方法２と方法３で変更を試みてないためにデフォルト値が設定されており，MTU値設定が競合している可能性があるためです．）

## 方法1：コマンドプロンプトから設定
### 手順1：現在使用しているインターフェースを再確認してください．
```bash:bash
$ ip link
````
### 手順2：設定ファイルの編集
```bash:bash
$ sudo nano /etc/network/interfaces
````

### 手順3：対象のインターフェースにmtuを追記する
```text:text
auto eth0
iface eth0 inet dhcp
    mtu 1500            # 1500とある部分を最適MTU値に設定
````

### 手順4：再起動する
マシンを再起動します．
再起動してからMTU値がデフォルトから変更されているのか確認してください．

## 方法2：systemd-networkd から設定
### 手順1：設定ファイルの作成
```bash:bash
sudo nano /etc/systemd/network/10-eth0.network
````
### 手順2：以下のように修正
```ini:ini
[Match]
Name=eth0 　# 使用しているインターフェースに応じて変更

[Network]
DHCP=yes

[Link]
MTUBytes=<最適MTU値>

````

### 手順3：再起動する
マシンを再起動します．
再起動してからMTU値がデフォルトから変更されているのか確認してください．

## 方法3：GUIから変更（NetwprkManagerが有効である時）
### 手順1：GUIの操作
・メニュー → ネットワーク設定 → 有線接続を編集
・「MTU」タブに移動
・最適MTU値を入力して保存
### 手順2：CLIで設定(nmcli)
```bash:bash
nmcli connection show
# 接続名を確認してから
nmcli connection modify "接続名" 802-3-ethernet.mtu 1400
nmcli connection up "接続名"

````
### 手順3：マシンを再起動
マシンを再起動します．
再起動してからMTU値がデフォルトから変更されているのか確認してください．

# 4. 最後に
この問題が発覚してから修正するのに半日以上を使い果たしました．
同様の問題が発生している方の手助けになれば嬉しい限りです．