2024年5月29日 星期三

WSL 安裝 ssh 並更改 port 設置自動啟動

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 伺服器應該會自動啟動並使用設定的端口。


回到 WSL 中執行以下命令確認 SSH 伺服器是否正在運行:
sudo service ssh status



從主機端以 SSH 連接 WSL

打開主機端的 PowerShell 嘗試從主機端連接 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





參考

沒有留言:

張貼留言