WSL 安裝 ssh 並更改 port 設置自動啟動
預設狀態是不會自動啟動的而且 port 可能與主機端有衝突,視情況可以自行改成 2222 口這樣可以避開 Windows 本身如果也有 ssh 的話。
教學用的環境是 Win11 24H3 上安裝的 WSL2 虛擬機運行 Ubuntu 24 版本。版本不同可能會些許的差異。
安裝並配置 OpenSSH
首先,確保已安裝 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
在 Windows 命令提示字元或 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
這一步看不懂不用做繼續往下做
打開 PowerShell 創建私鑰:
ssh-keygen -t ed25519
預設會詢問是否要保存到使用者底下直接按下 Enter 同意即可
再來會詢問你密碼,空白密碼也是直接 按下 Enter 兩次即可
至此私鑰就創建好了,再來需要把公鑰上傳到WSL中
回到 PowerShell 中,執行下面的代碼上傳:
$publicKey = Get-Content -Path "$env:USERPROFILE\.ssh\id_ed25519.pub"
$remoteCommand = 'echo "$publicKey" >> ~/.ssh/authorized_keys'
# 使用 SSH 連接到 Linux 伺服器並執行命令
ssh username@localhost $remoteCommand
接下來會提示要你輸入密碼,輸入WSL密碼即可自動上傳
再來就可以使用簡單的方式登入了
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
沒有留言:
張貼留言