Skip to content

暫)wslネットワーク

最終更新日時: 2025年08月25日 12:57

  • nothing
  • wsl配下の全てのディストリビューションはアドレスを共有している
  • それゆえそれらのディストリビューションをhttpdやsshd等を同時に動かすことはポートを変えないとできない
  • wsl内部のローカルアドレス127.0.0.1は実は直接PCのlocalhostではない。
  • ubuntu.wsl.localhost等になっている
  • wsl2のディストロでubuntu.wsl.localhost:4321でwebサーバが動いた場合自動でwindows上のlocalhostにポートフォワードされるので、localhost:4321でもアクセスできる

こんな風にエラーが出る

[03/09 2:03] ~ %sudo service --status-all
[ - ] apparmor
[ - ] apport
[ - ] console-setup.sh
[ + ] cron
[ + ] dbus
[ - ] keyboard-setup.sh
[ + ] kmod
[ - ] postfix
[ + ] procps
[ - ] rsync
[ - ] ssh
[ + ] unattended-upgrades
[ - ] uuidd
[ - ] x11-common
[03/09 2:03] ~ %sudo service ssh start
Job for ssh.service failed because the control process exited with error code.
See "systemctl status ssh.service" and "journalctl -xeu ssh.service" for details.
[03/09 2:03] ~ %systemctl status ssh.service
× ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
Active: failed (Result: exit-code) since Sun 2025-03-09 02:03:40 JST; 22s ago
TriggeredBy: × ssh.socket
Docs: man:sshd(8)
man:sshd_config(5)
Process: 8448 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Process: 8449 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=255/EXCEPTION)
Main PID: 8449 (code=exited, status=255/EXCEPTION)
Tasks: 1 (limit: 4596)
Memory: 9.6M ()
CGroup: /system.slice/ssh.service
Mar 09 02:03:40 pasokon systemd[1]: Starting ssh.service - OpenBSD Secure Shell server...
Mar 09 02:03:40 pasokon sshd[8449]: error: Bind to port 22 on 0.0.0.0 failed: Address already in use.
Mar 09 02:03:40 pasokon sshd[8449]: error: Bind to port 22 on :: failed: Address already in use.
Mar 09 02:03:40 pasokon systemd[1]: ssh.service: Main process exited, code=exited, status=255/EXCEPTION
Mar 09 02:03:40 pasokon sshd[8449]: fatal: Cannot bind any address.
Mar 09 02:03:40 pasokon systemd[1]: ssh.service: Failed with result 'exit-code'.
Mar 09 02:03:40 pasokon systemd[1]: Failed to start ssh.service - OpenBSD Secure Shell server.
  • WSL2の全ディストリビューションは同じ仮想ネットワークアダプタを共有

    • 同一MACアドレスとIPアドレスが全ディストリビューションに割り当てられる
    • 各ディストリビューションでip addr show eth0を実行すると同じ結果が表示される
    • サブネットマスクは通常/20(255.255.240.0)形式
  • Windowsホスト側のネットワーク構成

    • vEthernet (WSL (Hyper-V firewall))という仮想アダプタが作成される
    • このアダプタにはWSLサブネットの先頭側IPアドレス(例:172.20.160.1)が割り当てられる
    • WSL2インスタンスにはサブネット内の別アドレス(例:172.20.172.143)が割り当てられる

ディストリビューション識別と接続方法

Section titled “ディストリビューション識別と接続方法”
  • 複数ディストリビューション間で同じIPを持つのに通信が可能な理由

    • プロセスやSSHサーバーは各ディストリビューションで個別に動作
    • scpsshでのアクセスは個別のSSHデーモンに接続するため機能する
  • ディストリビューション情報の確認方法

    • 名前やバージョンの取得:
      Terminal window
      grep -oP '(?<=^NAME=")[^"]+' /etc/os-release
      sed -n 's/^VERSION="\([^ ]*\).*/\1/p' /etc/os-release
    • プロンプトに表示する設定例:
      Terminal window
      DISTRO_VERSION=$(sed -n 's/^VERSION="\([^ ]*\).*/\1/p' /etc/os-release)
      PS1="\u@\h [$DISTRO_VERSION] \W$ "
  • 通信パターン

    • WSL2からWindowsホストへ: 172.20.160.1(vEthernetアダプタのIP)を使用
    • WindowsからWSL2へ: 複数の方法が存在
  • WSL2からWindowsホスト(172.20.160.1)へのアクセス用途

    • Webサーバー連携
      • Windows上で動作するWebサーバーへのアクセス
      • ローカルホスト転送
    • 開発環境統合
      • ファイル共有アクセス
      • データベース接続
      • Docker間通信
      • デバッグポート接続
    • その他
      • X Window Systemディスプレイ転送
      • プロキシサーバー設定
      • ネットワーク診断
  • 自動ポート転送機能

    • WSL2でリッスンしているポートは自動的にWindowsホスト側にマッピングされる
    • Windowsブラウザからlocalhost:ポート番号で直接アクセス可能
    • 明示的な設定なしでWSL2アプリケーションにアクセスできる
  • WSL.localhostドメイン機能

    • Windows 11で導入された機能
    • 形式: <ディストリビューション名>.wsl.localhost
    • 複数ディストリビューションを区別してアクセス可能
    • 使用例:
      • ubuntu.wsl.localhost:3000 - Ubuntu上のWebサーバー
      • debian.wsl.localhost:5432 - Debian上のPostgreSQLサーバー
    • 複数の同名ディストリビューション(例:Ubuntu 20.04とUbuntu 22.04)がある場合は正確な登録名を使用する必要がある
      • 例: ubuntu-20.04.wsl.localhost
[03/09 1:40 ]@(22.04.5) ~ %ip address show
ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:ad:68:36 brd ff:ff:ff:ff:ff:ff
inet 172.20.172.143/20 brd 172.20.175.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fead:6836/64 scope link
valid_lft forever preferred_lft forever
  • 172.20.172.143がアドレスみたいだ
[03/09 1:26] ~ %ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:ad:68:36 brd ff:ff:ff:ff:ff:ff
inet 172.20.172.143/20 brd 172.20.175.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fead:6836/64 scope link
valid_lft forever preferred_lft forever
[03/09 1:42] ~ %
  • 172.20.172.143がアドレスみたいだ同じ?!
  • CIDR (Classless Inter-Domain Routing)

    • IPアドレスの割り当て方式
    • /20のような表記でサブネットマスクを表現
    • 例: /20は255.255.240.0に相当し、20ビットがネットワーク部分
  • サブネットマスク

    • IPアドレスをネットワーク部とホスト部に分ける境界を定義
    • /20の場合、使用可能なIPアドレス数は約4,094個
  • vEthernet アダプタ

    • Hyper-V仮想化技術の一部としてWindowsに作成される仮想ネットワークアダプタ
    • WSL2インスタンスとホストWindows間の通信を可能にする