NISHIO Hirokazu[Translate]
WSL2-2025-10-28
nishioWindowsでWSL2でsshdを有効化し、MacのVSCodeから接続したい
(3年前の記事: WSL2にMacからSSHする)

繋がるようになった感想
うまくいかないことを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が邪魔

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' を実行してインストールできます。
詳細については、https://aka.ms/wslinstall にアクセスしてください

任意のキーを押して 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 を有効化
:
sudo tee /etc/wsl.conf <<'EOF' [boot] systemd=true EOF

nishio リモートの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

:
$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


"Engineer's way of creating knowledge" the English version of my book is now available on [Engineer's way of creating knowledge]

(C)NISHIO Hirokazu / Converted from [Scrapbox] at [Edit]