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 服務管理器:
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)。
4. 重啟 WSL
在 PowerShell 中執行:
wsl --shutdown
然後再次打開 WSL 後,SSH 伺服器應該會自動啟動並使用設定的端口。
sudo service ssh status
從主機端以 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 = Get-Content -Path "$env:USERPROFILE\.ssh\id_ed25519.pub"
# 使用 SSH 連接到 Linux 伺服器並執行命令
ssh username@localhost "echo ""$publicKey"" >> ~/.ssh/authorized_keys"
接下來會提示要你輸入密碼,輸入WSL密碼即可自動上傳
再來就可以在 PowerShell 中使用簡單的方式登入了
ssh username@localhost
[番外篇2] 從 Windows 轉發 wsl2 的連接埠
在預設情況下 wsl 是掛在另一個張虛擬網卡上的另一個網段裡的,外部電腦是無法直接連接的,要連的話最簡單的辦法是設置虛擬伺服器。
分兩個部分首先在 WSL 中你需要先得到他的ip是多少,在 wsl 中執行
ip addr show eth0
找一下其中 inet 172.25.69.52/20 這個是你的 wsl ip
然後再來是 windows 這個你打開工作管理員,效能頁面中找到乙太網路,這個頁面裡面有寫IP地址
然後添加一下路由表,以管理員模式執行 PowerShell ,然後執行
netsh interface portproxy add v4tov4 `
listenaddress=192.168.3.13 listenport=22 `
connectaddress=172.25.69.52 connectport=22
把 192.168.3.13 映射到你的 wsl ip,下面代碼可以確認
netsh interface portproxy show all
然後在執行下面指令打通防火牆
New-NetFirewallRule -DisplayName "WSL2_SSH" -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow
下面代碼可以確認
Get-NetFirewallRule -DisplayName "WSL2_SSH"
[番外篇3] 指定SSH連接使用者與遠端伺服器
在預設情況下當你輸入
ssh 192.168.3.13
預設會使用當前主機使用者名稱連接目標電腦,但如果有設置的話這邊是可以自訂名稱的
例如在以下
notepad $env:USERPROFILE\.ssh\config
文件中輸入
Host MyWSL
HostName 192.168.3.13
User chg
就可以使用以下方式登入了
ssh MyWSL
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
沒有留言:
張貼留言