🐧

【WSL2】外部からWSL2のサービスに接続する

2023/12/03に公開

こんにちは、$@(ダラ~っと)です(๑Ò﹃ Ó๑)ゝ

はじめに

Windows Subsystem for Linux2(WSL2)に立てたサービスに、他の端末からアクセスしたい時があったので、その時に行ったメモです。

何がわかる?

  • 外部からWSL2にアクセスする設定

環境

  • Windows 11

WSL2のネットワーク

WindowsとWSL2上のLinuxは、仮想ネットワークで接続された別ホストとして扱われます。
(WSL1の場合は、同一ネットワーク)

下図のように、WindowsからWSL2へはVirtual Networkを経由してアクセスします。(内部通信)
外部からは、WSL2のIPへ直接接続することが出来ません。そのため、ポートフォワード設定を行い、Windowsへの特定ポートへのアクセスを、内部ネットワークのWSL2に転送することで実現できます。(外部通信)

  • 上図では、外部から192.168.0.2:2222(Windows)にアクセスすると、172.29.160.170:22(WSL2のLinux)にアクセス出来ます。

ポートフォワード設定(コマンド実行)

Windowsでポートフォワード設定を行うには、netshコマンドを使用します。
上図の設定を行う場合は、下記のコマンドを実行すると設定できます。
実際は、設定する環境に応じて書き換えてください。
また、別途スクリプトを記事の下部に用意します。

  1. 管理者権限でコマンドプロンプトを起動して、下記コマンドを実行する。

    • Windowsキー + Rcmdを入力して Ctrl + Shift + Enter
  2. 登録
    netsh interface portproxy add コマンドを使用して、ポートプロキシ設定を行います。

    # 書式
    # netsh interface portproxy add v4tov4 listenaddress=<転送元IPアドレス> listenport=<転送元ポート番号> connectaddress=<転送先IPアドレス> connectport=<転送先ポート番号>
    netsh interface portproxy add v4tov4 listenaddress=localhost listenport=2222 connectaddress=172.29.160.170 connectport=22
    
    netsh interface portproxy addのヘルプ
    $ netsh interface portproxy add /?
    使用できるコマンドは次のとおりです:
    
    このコンテキストのコマンド:
    add v4tov4     - IPv4 をリッスンし、IPv4 経由でプロキシ接続するためにエントリを追加します。
    add v4tov6     - IPv4 をリッスンし、IPv6 経由でプロキシ接続するためにエントリを追加します。
    add v6tov4     - IPv6 をリッスンし、IPv4 経由でプロキシ接続するためにエントリを追加します。
    add v6tov6     - IPv6 をリッスンし、IPv6 経由でプロキシ接続するためにエントリを追加します。
    
  3. 確認
    netsh interface portproxy show コマンドを使用して、ポートプロキシ設定を確認します。

    netsh interface portproxy show all
    
    netsh interface portproxy showのヘルプ
    $ netsh interface portproxy show /?
    使用できるコマンドは次のとおりです:
    
    このコンテキストのコマンド:
    show all       - ポート プロキシ パラメーターをすべて表示します。
    show v4tov4    - IPv4 接続を別の IPv4 ポートへプロキシするパラメーターを表示します。
    show v4tov6    - IPv4 接続を IPv6 へプロキシするパラメーターを表示します。
    show v6tov4    - IPv6 接続を IPv4 へプロキシするパラメーターを表示します。
    show v6tov6    - IPv6 接続を別の IPv6 ポートへプロキシするパラメーターを表示します。
    
  4. 削除
    netsh interface portproxy delete コマンドを使用して、ポートプロキシ設定を削除します。
    ここでは、Windows側の情報のみ指定でOKです。
    Windowsを再起動すると、WSL2のIPアドレスが変わるため、過去のポートフォワード設定を削除しておくと良いと思います。

    # 書式
    # netsh interface portproxy delete v4tov4 listenaddress=<転送元IPアドレス> listenport=<転送元ポート番号>
    netsh interface portproxy delete v4tov4 listenaddress=localhost listenport=2222
    
    netsh interface portproxy deleteのヘルプ
    $ netsh interface portproxy delete /?
    使用できるコマンドは次のとおりです:
    
    このコンテキストのコマンド:
    delete v4tov4  - IPv4 をリッスンし、IPv4 経由でプロキシ接続するためにエントリを削除します。
    delete v4tov6  - IPv4 をリッスンし、IPv6 経由でプロキシ接続するためにエントリを削除します。
    delete v6tov4  - IPv6 をリッスンし、IPv4 経由でプロキシ接続するためにエントリを削除します。
    delete v6tov6  - IPv6 をリッスンし、IPv6 経由でプロキシ接続するためにエントリを削除します。
    

ポートフォワード設定(PowerShell実行)

Windowsを再起動すると、WSL2のIPアドレスが変わるため、毎回コマンドを実行するのが面倒なのでPowerShellのスクリプトを作成しました。
ポート番号の設定を変更して、右クリック -> PowerShell で実行 で実行してください。
エンコードがSJISのため、zenn上では文字化けしている模様。

https://github.com/spluslat/wsl/blob/main/cmd/wsl2portfowarding.ps1

Discussion