WSL2-2025-10-28
nishio.iconWindowsでWSL2でsshdを有効化し、MacのVSCodeから接続したい
繋がるようになった感想
うまくいかないことをAIに聞いて解決するとここに書くのに適したログが残らない
メモ:
WSLを再起動すると WSL IP が変わるので、そのたびに delete→add の2行だけ再実行すれば復活します
再起動したらつながらなくなった
だいぶ混乱したが結論
WSLが“mirrored”ネットワークで、Windows本体と同じIPを使っています。
この状態で portproxy(0.0.0.0:2222→192.168.1.42:2222) を置くと自己転送になって RST が出ます。
前回、何かの再起動が適切でなくてmirroredの設定のまま、mirroredではない状態で起動していた
再起動によって正しくmirroredになったが、そうなるとportproxyが邪魔
code:powershell(admin).bat
$Distro="Ubuntu-24.04"; $Listen=2222
wsl -d $Distro -- true | Out-Null
$WslIp = (wsl -d $Distro hostname -I).Trim().Split()0 $HostIps = (Get-NetIPAddress -AddressFamily IPv4 | Where-Object {$_.IPAddress -notmatch '^169\.254\.'}).IPAddress
$IsMirrored = $HostIps -contains $WslIp
if ($IsMirrored) {
# mirrored: portproxy不要
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=$Listen 2>$null
netsh interface portproxy delete v6tov4 listenaddress=:: listenport=$Listen 2>$null
if (-not (Get-NetFirewallRule -DisplayName "WSL SSH $Listen (mirrored)" -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName "WSL SSH $Listen (mirrored)" -Direction Inbound -Action Allow -Protocol TCP -LocalPort $Listen -Profile Any | Out-Null
}
} else {
# NAT: portproxy必要
Set-Service iphlpsvc -StartupType Automatic; Start-Service iphlpsvc
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=$Listen 2>$null
netsh interface portproxy delete v6tov4 listenaddress=:: listenport=$Listen 2>$null
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=$Listen connectaddress=$WslIp connectport=$Listen
netsh interface portproxy add v6tov4 listenaddress=:: listenport=$Listen connectaddress=$WslIp connectport=$Listen
if (-not (Get-NetFirewallRule -DisplayName "WSL SSH $Listen (NAT)" -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName "WSL SSH $Listen (NAT)" -Direction Inbound -Protocol TCP -LocalPort $Listen -Profile Any | Out-Null
}
}
"Mode=" + ($(if ($IsMirrored){"mirrored"}else{"nat"})) + " WSL_IP=$WslIp Listen=$Listen"
Test-NetConnection -ComputerName $WslIp -Port $Listen
Test-NetConnection -ComputerName 127.0.0.1 -Port $Listen
---
log
Windowsにリモートデスクトップしている環境
PowerShellを管理者モードで起動
wsl --version
PS C:\Windows\system32> wsl --version
Linux 用 Windows サブシステムがインストールされていません。'wsl.exe --install' を実行してインストールできます。
任意のキーを押して Linux 用 Windows サブシステムをインストールします。
キャンセルするには、Ctrl + C キーを押すか、このウィンドウを閉じます。
このプロンプトは 60 秒後にタイムアウトします。
再起動
wsl -l -v
PS C:\Windows\system32> wsl -l -v
Linux 用 Windows サブシステムにインストールされているディストリビューションはありません。
この問題を解決するには、以下の手順に従ってディストリビューションをインストールしてください:
'wsl.exe --list --online' を使用して利用可能な配布を一覧表示する
および 'wsl.exe --install <Distro>' を使用してインストールしてください。
wsl --install -d Ubuntu-24.04
...
ディストリビューションが正常にインストールされました。'wsl.exe -d Ubuntu-24.04' を使用して起動できます
Ubuntu-24.04 を起動しています...
...
Linuxユーザー名とパスワードを作成
# 2-1) systemd を有効化
code::
sudo tee /etc/wsl.conf <<'EOF'
systemd=true
EOF
nishio.icon リモートのPowerShellでUbuntuが動いている状態だと貼り付けがしにくいw
nanoで開いてみたが元々systemd=trueだった
/etc/ssh/sshd_config.d/wsl-port.conf
いったんパスワードを許可(鍵転送が終わったら無効化します)
printf 'PasswordAuthentication yes\nPubkeyAuthentication yes\n'
| sudo tee /etc/ssh/sshd_config.d/wsl-auth-temp.conf
起動&自動起動
sudo systemctl enable --now ssh
code::
$Distro="Ubuntu-24.04"; $Port=2222
$WslIp = (wsl -d $Distro hostname -I).Trim().Split(' ')0 "WSL IP: $WslIp"
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=$Port 2>$null
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=$Port connectaddress=$WslIp connectport=$Port
if (-not (Get-NetFirewallRule -DisplayName "WSL SSH $Port" -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName "WSL SSH $Port" -Direction Inbound -Protocol TCP -LocalPort $Port -Action Allow -Profile Any | Out-Null
} else {
Set-NetFirewallRule -DisplayName "WSL SSH $Port" -Profile Any | Out-Null
}
# 疎通テスト(どちらも True が理想)
Test-NetConnection -ComputerName $WslIp -Port $Port
Test-NetConnection -ComputerName 127.0.0.1 -Port $Port