wsl2 mirroredネットワーク、WindowsとLinuxの良いとこどり！

本記事は「 [TTDC Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ttdc) 」4日目の記事です。
# 概要
 wsl2にてシステムを構築する際、WindowsとLinuxで同じネットワークを使いたい場面が発生しました.
 ![システム構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474702/864b6323-13ed-b6af-e871-08cbab6f7a00.png)

 ネットワーク設定を間違えると、深みにはまってしまい貴重な時間を無駄にしてしまうので、mirroredネットワーク設定とデバッグ方法を簡単に紹介します．

# wsl2 mirroredネットワークとは
Windows（Windows11 22H2 以降）にあるネットワーク インターフェイスを wsl2 にミラーリングすることで、同じipアドレスを使うことができるようになります．

# 作業環境
**Windowsホスト環境**

　プロセッサ：13th Gen Intel(R) Core(TM) i7-1355U   1.70 GHz 
　メモリ：32.0 GB 
　エディション：Windows 11 professional 
　バージョン：22H2 
 
　WSL バージョン: 2.3.26.0 
　カーネル バージョン: 5.15.153.1-2 

**wsl2 Linux 仮想環境** 
　ディストリビューション：Ubuntu 22.04 LTS

# 前準備
wsl2のバージョンが古いとmirroredネットワークが動作しないので、Windows PowerShellを使ってwsl2をアップデートします．

  - Windows PowerShellを 「管理者として実行する」 で選択、起動します．

  - wsl2 をアップデートします．
      ```　bash
      wsl --update
      ```
  - wsl2 の設定を更新するため、wsl2をシャットダウンします．
      ```　bash
      wsl --shutdown
      ```

# 設定手順
- **新規で.wslconfigファイル作成する場合**
  Windows PowerShellにて下記コマンド実行します．(不要な設定も入っているのでカスタマイズしてください)
  ``` bash
  # %UserProfile%\.wslconfig
  # example C:\Users\【Windowsログインユーザ名】
  cd ~
  echo "[wsl2]
  memory=8GB        # examle 8GB (must be an integer)
  swap=0            # swap off:0, swap MB is manual, examole 500MB
  networkingMode=mirrored  # ここがポイント
  # エンコーディングを指定して保存（UTF-8にしないと動作しない）
  " | %{ $_+"`n" } | ForEach-Object{ [Text.Encoding]::UTF8.GetBytes($_) } | Set-Content -Encoding Byte -Path .wslconfig
  ``` 
  <br>  
- **.wslconfigファイルが既にある場合**
  Windowsホスト側で.wslconfigファイルメモ帳で直接編集し、「networkingMode=mirrored」を設定します．
　.wslconfigファイルは、C:\Users\【Windowsログインユーザ名】の直下にあります．
  ![wslconfigイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474702/7eb264a0-387a-63f5-f5a1-6087d38954c2.png)

# 確認方法
  wsl2を再起動してWindowsと同じipアドレスが設定されているか確認します．
 - Windowsホスト側:ipconfigコマンド
 - wsl2側:ifconfigコマンド 
 
![上段:Windowsホスト側,下段:wsl2側](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474702/dc6be14d-3496-07f3-965a-94bc6d8163a6.png)
 Windowsホスト側とwsl2側で同じipアドレスが設定されていることを確認できます．

# デバッグ方法
wsl2のパケットはWindows側には転送されないため、wsl2にてパケットキャプチャーして動作確認します．私は、パケットキャプチャーにWiresharkを使用しているため、インストールコマンドと起動方法を記載します．
  ``` bash
  # install 
  sudo apt update
  sudo apt upgrade
  sudo apt install wireshark
  ```
  ``` bash
  # load wireshark
  sudo wireshark
  ```
<br>
wsl2側のパケットキャプチャーに通信パケットが表示されます． 

![wsl2側 wiresharkイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474702/8c5352d3-7d4d-df2b-ff7e-d7f690460361.png)
※想定パケットをキャプチャできない場合は、システム構成を見直してください．

# まとめ
Windows11（Windows11 22H2 以降）に、WSL2を使い mirroredネットワークの設定を行い簡単にデバッグする方法を記載しました．
開発環境構築のお役に立てると幸いです．

# 
最後まで読んでいただき、ありがとうございました！  
今後も機械学習の活用を始め、開発環境やシミュレーションなど幅広く技術情報発信をしていく予定です！  

最後になりますが、本記事の内容に誤りなどあれば、コメントにてご教授お願いいたします．

# Reference
- [WSL を使用したネットワーク アプリケーションへのアクセス](https://learn.microsoft.com/ja-jp/windows/wsl/networking)
- [WSL 2.0.0 で導入されたミラーモードは万能薬なのか？](https://qiita.com/shigeokamoto/items/bad3ce237f0b19aea147)
- [WSL を使用して Windows に Linux をインストールする方法](https://learn.microsoft.com/ja-jp/windows/wsl/install)
- [WSL での詳細設定の構成](https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config)
- [Powershellによるファイル操作のまとめ](https://qiita.com/mima_ita/items/ae31f3a19389e69b307f)
- [WindowsPowerShellでUTF8-BOMLessでLFなファイルを出力する](https://qiita.com/SAITO_Keita/items/120e1286727fb680a699#)