從 Mac 透過 SSH 連線到 WSL 2:設定與疑難排解
若要從 Mac 透過 SSH 連進 WSL 2,需要在 Linux 發行版內安裝 SSH 伺服器,並建立 Mac 到該伺服器的網路路徑。只在 Windows 安裝 SSH,連到的是 Windows,而不是 WSL 開發環境。
本指南使用 Windows 電腦上的 Ubuntu,以及同一個區域網路中的 Mac。請將範例使用者名稱和位址換成自己的資料。伺服器端檢查清單請參閱 WSL SSH 伺服器疑難排解。
先選擇網路路徑
| Windows 設定 | 連線路徑 |
|---|---|
| 使用預設 NAT 網路的 WSL 2 | 將 Windows 區域網路連接埠轉送至 WSL 內的 SSH 連接埠 |
| 使用 mirrored networking 的受支援 Windows 11 安裝 | 測試直接區域網路連線,並設定適用的防火牆規則 |
Microsoft 說明了 NAT 和 mirrored networking。Windows 11 22H2 或更新版本提供 mirrored networking。不要假設所有 WSL 安裝都使用相同網路模式,也不要假設 mirrored networking 一定無法使用。
1. 在 Ubuntu 內安裝並啟動 SSH
請在 Ubuntu 而不是 PowerShell 中執行:
sudo apt update
sudo apt install openssh-server
sudo sshd -t
sudo service ssh start
ss -ltn | grep ':22'
設定檢查應在沒有錯誤的情況下完成。最後一個指令應顯示連接埠 22 正在監聽。如果 Ubuntu 使用 systemd,也可以執行 sudo systemctl status ssh 管理服務。Ubuntu 的 OpenSSH 文件說明了安裝和設定方式。
執行 whoami 查看 Linux 使用者名稱,SSH 連線時會用到這個帳戶。現在啟動伺服器,不代表 Windows 重新開機後服務會自動啟動;等連線正常後,再另外測試這件事。
2. 先測試 Windows → WSL,再加入 Mac
在 PowerShell 中列出發行版並查看位址:
wsl -l -v
wsl -d Ubuntu hostname -I
接著連到相關的 WSL 位址:
ssh your_linux_user@172.30.98.229
上方位址只是範例。如果 hostname -I 列出多個位址,請檢查 Ubuntu 的網路介面,使用打算轉送流量的那個網路位址。在此步驟連線失敗,代表 SSH 或 Windows 到 WSL 的路徑有問題;設定 Mac 不會修好這個問題。
3. NAT 模式:轉送專用的 Windows 連接埠
使用 ipconfig 找出 Windows 電腦的區域網路位址。以下範例使用 192.168.1.50,並開放連接埠 2222,保留 Windows 的 22 埠供另一個 Windows SSH 伺服器使用。
在系統管理員 PowerShell 中執行:
$WindowsLanIp = '192.168.1.50'
$WslIp = ((wsl -d Ubuntu hostname -I).Trim() -split '\s+')[0]
netsh interface portproxy add v4tov4 listenaddress=$WindowsLanIp listenport=2222 connectaddress=$WslIp connectport=22
New-NetFirewallRule -DisplayName 'WSL SSH LAN 2222' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 2222 -RemoteAddress LocalSubnet
netsh interface portproxy show all
執行轉送指令前,先確認選用的 WSL 位址。Microsoft 文件說明了 netsh interface portproxy,包括新增、顯示和刪除規則。
Windows 區域網路位址和 WSL NAT 位址都可能改變。如果重新啟動後連線失效,請將目前位址與轉送規則比對。更新規則即可,不要不斷新增已過期的規則。若此設定只供區域網路使用,不要在網際網路路由器上對外開放此連接埠。
4. 從 macOS 測試 SSH
在 Mac 上開啟終端機:
ssh -p 2222 your_linux_user@192.168.1.50
接受新的主機前,先確認伺服器的主機金鑰指紋。連線成功時應會開啟 Linux Shell。執行 uname -a 和 pwd,確認你連到預期的環境。
若要重複使用,將以下項目加入 Mac 的 SSH 設定檔:
Host windows-wsl
HostName 192.168.1.50
User your_linux_user
Port 2222
現在測試 ssh windows-wsl。停用密碼驗證前,先設定金鑰驗證;變更存取設定時,保留一個仍可使用的工作階段。
5. 將 VS Code 連到可用的 SSH 主機
安裝 Microsoft 的 Remote - SSH 擴充功能。執行 Remote-SSH: Connect to Host…,選取 windows-wsl,再開啟 Linux 發行版內的目錄。
VS Code 會在目標環境安裝遠端伺服器。先建立終端機連線,可以把網路問題和編輯器問題分開處理。先決條件和安裝失敗的解決方式,請參閱官方 Remote SSH 指南。
使用 mirrored networking 時有什麼不同?
在受支援的 mirrored 設定下,測試從 Mac 直接連至 Windows 電腦的區域網路位址和 Linux SSH 連接埠。Windows 和 Hyper-V 防火牆政策仍可能阻擋連入流量。請依 Microsoft 網路文件設定範圍明確的連入規則,不要為了測試連線而停用防火牆。
在 Windows 上連 localhost 成功,不能證明另一台電腦也能連到服務。請直接從 Mac 測試。
依失敗的環節排查
| 症狀 | 下一步檢查 |
|---|---|
| Connection refused | SSH 監聽狀態、目的位址、轉送規則和所選連接埠 |
| Connection timed out | 區域網路連線、Windows 防火牆、VPN 路由和網路隔離 |
| Permission denied | Linux 使用者名稱、驗證方式和 authorized key |
| 重新開機前可用 | WSL 服務狀態及 Windows/WSL 位址是否變更 |
| 終端機可用,VS Code 失敗 | 遠端伺服器先決條件和 VS Code 連線記錄 |
使用 ssh -vvv windows-wsl 診斷連線。Linux 服務和驗證檢查可接著參閱 WSL SSH 疑難排解指南。
常見問題
Mac 可以直接連到 WSL NAT 位址嗎?
在預設設定下,無法透過一般區域網路路徑直接連線。請使用可連到的 Windows 端點並設定轉送,或設定適合的替代網路路徑。
我也需要安裝 Windows OpenSSH Server 嗎?
上述轉送方式不需要:SSH 伺服器是在 Ubuntu 內執行。若你刻意採用透過 Windows 的 SSH 跳板主機設計,才需要另外安裝 Windows SSH 伺服器。
為什麼 WSL 位址會改變?
請將 NAT 位址視為動態位址。發行版重新啟動後查看目前位址,必要時更新轉送目的地。