Windows-WSL2上Linux間通信について調べてみた

2026年8月31日

 

WindowsとWSL2上のLinuxはどうやって通信するんだろう。ファイルアクセスはできる?プロトコル通信は?

 

1. ファイルアクセス

まず、Linuxのホームディレクトリは?

minyaneko@Ubuntu:$ cd
minyaneko@Ubuntu:$ pwd
/home/minyaneko

通常のLinuxと同じ、/home/ユーザ名 に設定されています。

Windowsのディレクトリは見える?

実は、Windowsは/mnt/cにマウントされているんですね。

Windowsをマウントしてるディレクトリに移動して、Windows側にあるファイルも見てみましょう。

minyaneko@Ubuntu:/mnt/c/tmp$ ls -la

total 1543560
drwxrwxrwx 1 minyaneko minyaneko 4096 Aug 27 13:46 .
drwxrwxrwx 1 minyaneko minyaneko 4096 Aug 25 12:24 ..
drwxrwxrwx 1 minyaneko minyaneko 4096 Aug 6 13:51 WSL
-rwxrwxrwx 1 minyaneko minyaneko 22 Aug 27 13:46 test.txt
-rwxrwxrwx 1 minyaneko minyaneko 1580605440 Aug 6 13:26 ubuntu.tar

minyaneko@Ubuntu:/mnt/c/tmp$ cat test.txt

Windowsのファイルminyaneko@Ubuntu:/mnt/c/tmp$

ディレクトリ配下のファイル一覧も、ファイルの中身も見ることができました。

今度はWindows側からLinuxのファイルを見てみましょう。

Windowsからは、\\wsl.localhost\ディストリビューション名 でアクセスできます。

rootディレクトリが見えてます・・・。

 

ファイルの中身も見られます。

複数人で使っている場合はアクセス制限をかけることを検討した方がいいやつですね。

 

2. ネットワークモード

ところでネットワークはどうなっているの?IPアドレスは共用?それとも別ネットワークにあるの?

以下のサイトを参考にすると、
https://learn.microsoft.com/en-us/windows/wsl/networking
https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config

「Linux用Windowsサブシステム設定」の「ネットワークモード」で設定できるようになっているらしい。

ネットワークモードにはNone、NAT、Mirrored、Virtio Proxyの4つのモードがあります。それぞれの動作は以下のとおり。

 None・・・ネットワークを使わない
 NAT・・・WindowsとLinuxの間にNATがある、つまりIPアドレス変換が行われるイメージ
 Mirrored・・・WindowsとLinuxが同じネットワークになる
 VirtioProxy・・・Windowsのユーザモードを利用する

VirtioProxyというのはまあまあ特殊なモードで、Windows側のプロキシを利用するもので、NATでうまく動作しない時にも使ったりするらしい。

なので、とりあえず、NATとMirroredを比較検証してみます。

 

2-1. NATモード

デフォルトはNATモードになっているようです。

まずはWindowsのIPアドレスを確認。

PS C:\windows\System32> ipconfig

イーサネット アダプター vEthernet (WSL (Hyper-V firewall)):
IPv4 アドレス . . . . . . . . . . . .: 172.22.224.1
サブネット マスク . . . . . . . . . .: 255.255.240.0
Wireless LAN adapter Wi-Fi:
IPv4 アドレス . . . . . . . . . . . .: 192.168.1.7
サブネット マスク . . . . . . . . . .: 255.255.255.0

インターネット側のLANのIPアドレスが192.168.1.0/24のネットワークに、WSL側のIPアドレスが172.22.224.0/20のネットワークにあります。

次にLinux側のIPアドレスを確認します。

minyaneko@Ubuntu:~$ ip addr

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 172.22.227.104/20 brd 172.22.239.255 scope global eth0

これも172.22.224.0/20のネットワークにあります。

WindowsとLinux両者が共通のネットワークにあるんですね。ちなみにLinux側はインターネットに直接アクセスするインターフェースは持っていませんでした。

図にするとこんな感じです。

 

WindowsからLinuxへpingは通るでしょうか。

PS C:\windows\System32> ping 172.22.227.104

172.22.227.104 に ping を送信しています 32 バイトのデータ:
172.22.227.104 からの応答: バイト数 =32 時間 <1ms TTL=64
172.22.227.104 からの応答: バイト数 =32 時間 <1ms TTL=64
172.22.227.104 からの応答: バイト数 =32 時間 <1ms TTL=64
172.22.227.104 からの応答: バイト数 =32 時間 =1ms TTL=64

172.22.227.104 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 1ms、平均 = 0ms

通りました。

次はLinuxからWindowsへのpingを試します。

minyaneko@Ubuntu:~$ ping 172.22.224.1
PING 172.22.224.1 (172.22.224.1) 56(84) bytes of data.
^C
--- 172.22.224.1 ping statistics ---
129 packets transmitted, 0 received, 100% packet loss, time 131068ms

通りません。

Windows Defenderファイアウォールでの設定を見たら、ICMPv4の受信が無効になっていたので、有効にして通信を許可しました。

minyaneko@Ubuntu:~$ ping 172.22.224.1
PING 172.22.224.1 (172.22.224.1) 56(84) bytes of data.
64 bytes from 172.22.224.1: icmp_seq=1 ttl=128 time=0.395 ms
64 bytes from 172.22.224.1: icmp_seq=2 ttl=128 time=0.698 ms
64 bytes from 172.22.224.1: icmp_seq=3 ttl=128 time=0.681 ms
64 bytes from 172.22.224.1: icmp_seq=4 ttl=128 time=0.571 ms

今度は通りました。

NATというからには、NAT変換テーブルがあるはずです。これを見てみましょう。

PS C:\windows\System32> Get-NetNatSession
Get-NetNatSession : 無効なクラスです
発生場所 行:1 文字:1
+ Get-NetNatSession
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (MSFT_NetNatSession:root/StandardCimv2/MSFT_NetNatSession) [Get-NetNatSession],
CimException
+ FullyQualifiedErrorId : HRESULT 0x80041010,Get-NetNatSession

PS C:\windows\System32> Get-NetNat
Get-NetNat : 無効なクラスです
発生場所 行:1 文字:1
+ Get-NetNat
+ ~~~~~~~~~~
+ CategoryInfo : MetadataError: (MSFT_NetNat:root/StandardCimv2/MSFT_NetNat) [Get-NetNat], CimException
+ FullyQualifiedErrorId : HRESULT 0x80041010,Get-NetNat

ここで指定したクラスが登録されていないんですね。そして、実際に動いているNATのクラスは別にあるのかも・・・。

では、Linuxからcurlでインターネットに接続してWindowsで送信元アドレスを見てみます。

 

送信元アドレスがWindowsのアドレスに変換されてインターネットに通信していることが分かります。

 

2-2. Mirroredモード

次は、ネットワークモードをMirroredにしてみます。

Linux側のアドレスを確認してみると

minyaneko@Ubuntu:~$ ip addr

inet 192.168.1.7/24 brd 192.168.1.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever

Windowsの、インターネットに接続しているLAN側のアドレスと同じになりました。

図にするとこんな感じです。

 

MirroredはWindowsとLinuxを直接アクセスさせる必要があるときは便利かもしれませんが、NATの方がどちらかというと安全そうですね。

 

3. SSH接続

では、SSH接続は?

LinuxがWSL2上にある限り、WindowsからLinuxへSSHで接続する必要はあまりないのですが、SSHの動作を確認したい時などに使うことがあるかもしれません。一応見てみましょう。

SSHサービスが動いているか?

minyaneko@Ubuntu:~$ sudo systemctl status ssh

Unit ssh.service could not be found.

サービスが無いようです。
ではSSHのTCP22番ポートはリッスンしているか?

minyaneko@Ubuntu:~$ sudo ss -lntp | grep :22

出力が無いので、リッスンしていないようです。
では、そもそもOpenSSHがインストールされているか?

minyaneko@Ubuntu:~$ dpkg -l | grep openssh-server

これも出力が無いので、元々OpenSSHが入ってないんですね。使うなら入れないといけないようです。