WSL 安裝 ssh 並更改 port 設置自動啟動
預設狀態是不會自動啟動的而且 port 可能與主機端有衝突,視情況可以自行改成 2222 口這樣可以避開 Windows 本身如果也有 ssh 的話。
教學用的環境是 Win11 24H3 上安裝的 WSL2 虛擬機運行 Ubuntu 24 版本。版本不同可能會些許的差異。
安裝並配置 OpenSSH
首先,確保 WSL 中已安裝 OpenSSH 伺服器:
sudo apt update
sudo apt install openssh-server
1. 設定 SSH 端口與密碼登入 (選用)
編輯 SSH 設定檔:
sudo nano /etc/ssh/sshd_config
在此可以修改你要的設定如果你不知道要改什麼跳過這個步驟即可。
2. 設定 SSH 伺服器開機自動啟動
設置 systemd 服務管理器:(必須要wsl2才支援)
sudo systemctl enable ssh
必須開著 WSL 視窗才會生效(這服務 systemctl 其實是由 wsl.conf 文件間接啟動的)
如果是舊版的 wsl 1 不支持 systemctl 請這裡編輯 /etc/wsl.conf 文件:
sudo nano /etc/wsl.conf
在文件末尾添加以下內容:
command="service ssh start"
保存文件(按 Ctrl + O),然後退出編輯器(按 Ctrl + X)。
3. 重啟 WSL
在 PowerShell 中執行:
wsl --shutdown
然後再次打開 WSL 後,SSH 伺服器應該會自動啟動並使用設定的端口。
sudo service ssh status
沒有的話手動啟動 (這也表示 步驟2 應該沒設置成功)
sudo service ssh start
從主機端以 SSH 連接 WSL
ssh -p 22 your_username@localhost
這裡 -p 的選項預設值就是 22,如果沒有改 port 可以省略不打
至此SSH設置完成可以利用 localhost 由本機登連接了,但還無法給外部電腦連結。
如果沒有要給外部電腦使用,做到這邊就可以了。
[番外篇1] 在 WSL 中添加允許的公鑰
在 WSL 中創建 .ssh
目錄並設置適當的權限:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
接著可以手動將你想要使用的公鑰添加到 authorized_keys
文件中:
nano ~/.ssh/authorized_keys
這一步不知道輸入什麼先不用管,確保文件已經被創建可以打開即可
接著按下 Ctrl+X 離開編輯頁面接著繼續做
回到 PowerShell 創建私鑰:
ssh-keygen -t ed25519
預設會詢問是否要保存到使用者底下直接按下 Enter 同意即可
再來會詢問你密碼,空白密碼也是直接 按下 Enter 兩次即可
至此私鑰就創建好了,再來需要把公鑰上傳到WSL中
在 PowerShell 中,執行下面的代碼上傳:
獲取本機 publicKey 公鑰
# 獲取本機 publicKey 公鑰
$publicKey = Get-Content -Path "$env:USERPROFILE\.ssh\id_ed25519.pub"
# 使用 SSH 連接到 Linux 伺服器並執行命令
ssh username@localhost "echo ""$publicKey"" >> ~/.ssh/authorized_keys"
從私鑰獲取可以參考這個指令 ssh-keygen -y -f $env:USERPROFILE/.ssh/id_ed25519
接下來會提示要你輸入密碼,輸入WSL密碼即可自動上傳
再來就可以在 PowerShell 中使用簡單的方式登入了
ssh username@localhost
[番外篇2] 從 Windows 轉發 wsl2 的連接埠
在預設情況下 wsl 是掛虛擬網卡的NAT網段裡,本機可直連該網段但外部電腦是連不到的,需要設置虛擬伺服器。
分兩個部分首先在 WSL 中你需要先得到他的ip是多少,在 wsl 中執行
ip addr show eth0
找一下其中 inet 172.25.69.52/20 這個是你的 wsl ip
再來是 Windows 的 IP,打開工作管理員在效能頁面中找到乙太網路,裡面有寫IP地址
以管理員模式執行 PowerShell ,然後依序執行下面指令
1. 添加路由表
設置路由表 (用來穿透WSL的NAT)
netsh interface portproxy add v4tov4 `
listenaddress=192.168.3.13 listenport=22 `
connectaddress=172.25.69.52 connectport=22
重啟監聽服務
net stop iphlpsvc && net start iphlpsvc
把 192.168.3.13 映射到你的 wsl ip,下面代碼可以確認
netsh interface portproxy show all
你應該要能看到下面這樣
PS C:\Users\chg> netsh interface portproxy show all
接聽 ipv4: 連線到 ipv4:
位址 連接埠 位址 連接埠
--------------- ---------- --------------- ----------
192.168.3.12 22 172.17.55.208 22
2. 防火牆
打通行火牆讓外部的電腦可以連接
New-NetFirewallRule -DisplayName "WSL2_SSH" -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow
確認防火牆是否設置成功
Get-NetFirewallRule -DisplayName "WSL2_SSH"
至此就可以從外部電腦連接了
2024-11-12 重啟後失效的問題
發現已經設置好的伺服器重新啟動後路由雖然還在但是會失效
下面是刪除路由重建的指令,重建可以修好暫時不知道原因
# 刪除路由
netsh interface portproxy delete v4tov4 `
listenaddress=192.168.3.13 listenport=22
# 重建路由
netsh interface portproxy add v4tov4 `
listenaddress=192.168.3.13 listenport=22 `
connectaddress=172.25.69.52 connectport=22
[番外篇3] 指定SSH連接使用者與遠端伺服器
在預設情況下當你輸入
ssh 192.168.3.13
預設會使用當前主機使用者名稱連接目標電腦,但如果有設置的話這邊是可以自訂名稱的
例如在以下
notepad $env:USERPROFILE\.ssh\config
文件中輸入
Host wsl
HostName 192.168.3.13
User chg
就可以使用以下方式登入了
ssh wsl
ssh會自動去讀取 wsl 中的資訊,使用指定的使用者連接到指定伺服器
沒有留言:
張貼留言