如何從 Windows 上用 SSH 連接到 Linux
在 Linux 世界中,安全外殼secure shell(SSH)協(xié)議是最為常用的、通過(guò)命令行控制遠(yuǎn)程計(jì)算機(jī)的方式。SSH 是真正的 Linux 原創(chuàng),但是它在 Windows 世界中也越來(lái)越流行。甚至有了一份官方的 ??Windows 的 SSH 文檔???,那篇文檔闡述了使用 ??OpenSSH?? 控制 Windows 的方法。
這篇文章展示了如何使用了流行的開(kāi)源工具 ??PuTTY??,建立一個(gè)從 Windows 到 Fedora 33 Linux 系統(tǒng)的 SSH 連接。
使用 SSH 的方法
SSH 使用客戶端-服務(wù)器模式,即 SSH 客戶端會(huì)創(chuàng)建到 SSH 服務(wù)端的連接。SSH 服務(wù)器通常會(huì)作為守護(hù)進(jìn)程Daemon運(yùn)行,所以它常被稱(chēng)為 SSHD。你很難找到一個(gè)不自帶 SSH 守護(hù)進(jìn)程的 Linux 發(fā)行版。在 Fedora 33 中,已安裝了 SSH 守護(hù)進(jìn)程,但是并未激活。
你可以使用 SSH 控制幾乎所有的 Linux 機(jī)器,無(wú)論它是作為虛擬機(jī)還是作為網(wǎng)絡(luò)上的物理設(shè)備運(yùn)行。一個(gè)常見(jiàn)的用例是無(wú)頭headless配置的嵌入式設(shè)備,如樹(shù)莓派。SSH 也可以用做一個(gè)其它網(wǎng)絡(luò)服務(wù)的隧道。因?yàn)?SSH 連接是加密的,所以你可以使用 SSH 作為一個(gè)任何默認(rèn)不提供加密的協(xié)議的傳輸層。
在這篇文章中,我將解釋使用 SSH 的四個(gè)方式:1、如何在 Linux 端配置 SSH 守護(hù)進(jìn)程;2、如何設(shè)置遠(yuǎn)程控制臺(tái)連接;3、如何通過(guò)網(wǎng)絡(luò)復(fù)制文件,4. 如何將 SSH 作為某些協(xié)議的隧道。
1、配置 SSHD
將 Linux 系統(tǒng)(文中是 Fedora 33)作為 SSH 服務(wù)器,允許 PuTTY SSH 客戶端進(jìn)行連接。首先,檢查守護(hù)進(jìn)程的 SSH 配置。配置文件放在 ??/etc/ssh/sshd_config?
?,它包含了許多選項(xiàng),通過(guò)取消掉相關(guān)行的注釋就可以激活:
# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
Include /etc/ssh/sshd_config.d/*.conf
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
沒(méi)有取消任何注釋的默認(rèn)配置在這個(gè)示例中應(yīng)該是可以工作的。要檢查 SSH 守護(hù)進(jìn)程是否已經(jīng)運(yùn)行,輸入 ??systemctl status sshd?
?:
$ systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-06-22 11:12:05 UTC; 2 years 11 months ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 577 (sshd)
Tasks: 1 (limit: 26213)
CGroup: /system.slice/sshd.service
└─577 /usr/sbin/sshd -D -oCiphers=[aes256-gcm@openssh.com][5],chacha20-[...]
如果它處于未激活inactive狀態(tài),使用 ??systemctl start sshd?
? 命令啟動(dòng)它。
2、設(shè)置遠(yuǎn)程控制臺(tái)
在 Windows 下 ??下載 PuTTY 安裝程序??,然后安裝并打開(kāi)它。你應(yīng)看到一個(gè)像這樣的窗口:
PuTTY configuration screen
在“主機(jī)名(或 IP 地址)Host Name (or IP address)”輸入框,鍵入你的 Linux 系統(tǒng)的連接信息。本文設(shè)置了一個(gè) Fedora 33 虛擬機(jī),它使用橋接網(wǎng)絡(luò)適配器,使我可以由 IP 地址 ??192.168.1.60?
? 連接這個(gè)系統(tǒng)。點(diǎn)擊“打開(kāi)Open”,應(yīng)會(huì)如圖示的打開(kāi)一個(gè)窗口:
PutTTY security alert
這是 SSH 的安全措施之一,是為了防止??中間人攻擊???man-in-the-middle attack。消息中的指紋應(yīng)該匹配 Linux 系統(tǒng)中放在 ??/etc/ssh/ssh_host_ed25519_key.pub?
?? 的密鑰。PuTTY 將這個(gè)密鑰以 ??MD5 哈希值?? 的方式打印出來(lái)。要檢查它的真實(shí)性,切換到 Linux 系統(tǒng)并打開(kāi)一個(gè)控制臺(tái),然后輸入:
ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
輸出應(yīng)該和 PuTTY 展示的指紋一致:
$ ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
256 MD5:E4:5F:01:05:D0:F7:DC:A6:32 no comment (ED25519)
點(diǎn)擊“是Yes”以確認(rèn) PuTTY 的安全提示。主機(jī)系統(tǒng)的指紋現(xiàn)在存儲(chǔ)在 PuTTY 的信任列表中,其位于 Windows 的注冊(cè)表中的:
HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys
輸入正確的登錄憑證,然后你應(yīng)該進(jìn)入控制臺(tái)了,位置在你的用戶主目錄。
Logged in to SSH
3、通過(guò)網(wǎng)絡(luò)復(fù)制文件
除了遠(yuǎn)程控制臺(tái),你同樣可以使用 PuTTY 通過(guò) SSH 來(lái)傳輸文件。PuTTY 的安裝目錄在 ??C:\Program Files (x86)\PuTTY?
??,在該目錄下尋找 ??ppscp.exe?
?。你既可以使用它從 Linux 系統(tǒng)復(fù)制文件,也可以復(fù)制文件到 Linux 系統(tǒng)。
使用 ??Windows + R?
?? 然后輸入 ??cmd?
?? 來(lái)打開(kāi)命令提示符,從你的 Linux 用戶主目錄復(fù)制 ??MYFile.txt?
? 到你的 Windows 主目錄,輸入:
C:\"Program Files (x86)"\PuTTY\pscp.exe stephan@192.168.1.60:/home/stephan/MyFile.txt .
要從 Windows 主目錄復(fù)制文件到 Linux 用戶主目錄,輸入:
C:\"Program Files (x86)"\PuTTY\pscp.exe MyFile.txt stephan@192.168.1.60:/home/stephan/
就像你也許已經(jīng)發(fā)現(xiàn)的那樣,復(fù)制的命令通常構(gòu)造為:
pscp.exe <source> <target>
4、隧道化一個(gè)協(xié)議
假設(shè)你擁有一個(gè) Linux 機(jī)器,為某些特別的應(yīng)用運(yùn)行一個(gè)基于 HTTP 的服務(wù)。你想從你的 Windows 機(jī)器通過(guò)互聯(lián)網(wǎng)訪問(wèn)這個(gè) HTTP 服務(wù)。而且,你不能將相關(guān)的 TCP 端口暴露在公網(wǎng),因?yàn)椋?/p>
- 這個(gè)服務(wù)通過(guò) HTTP 而非 HTTPS 運(yùn)行
- 根本沒(méi)有用戶管理和登錄系統(tǒng)
乍一看,建立這種架構(gòu)不產(chǎn)生可怕的漏洞似乎是不可能的。但是 SSH 可簡(jiǎn)單的為這種情況建立一個(gè)安全的解決方案。
我將用我的軟件項(xiàng)目 ??Pythonic??? 來(lái)演示這個(gè)過(guò)程。在容器中運(yùn)行。Pythonic 作為容器運(yùn)行,開(kāi)放兩個(gè) TCP 端口:TCP 端口 7000(主要編輯器)和 TCP 端口 8000(??code-server?? 代碼編輯器)。
要在一個(gè) Linux 機(jī)器上安裝 Pythonic ,運(yùn)行:
podman pull pythonicautomation/pythonic
podman run -d -p 7000:7000 -p 8000:8000 pythonic
轉(zhuǎn)向你的 Windows 機(jī)器,打開(kāi) PuTTy,轉(zhuǎn)到 “連接Connection -> SSH -> 隧道Tunnels”。加入你要轉(zhuǎn)發(fā)的兩個(gè) TCP 端口:
- 源:?
?7000?
?? / 目標(biāo):??localhost:7000?
? - 源:?
?8000?
?? / 目標(biāo):??localhost:8000?
?
Port forwarding in PuTTY
然后返回 “會(huì)話Session” 部分,并像之前那樣建立一個(gè) SSH 鏈接。打開(kāi)網(wǎng)頁(yè)瀏覽器,然后轉(zhuǎn)到 ??http://localhost:7000?
?;你應(yīng)該看見(jiàn)像這樣的窗口:
Pythonic
你成功的設(shè)置了端口轉(zhuǎn)發(fā)!
警告: 如果你選擇在公網(wǎng)上暴露 TCP 端口 22 ,不要使用易于猜測(cè)的登錄憑證。你將接受來(lái)自全世界的登錄請(qǐng)求,它們使用常見(jiàn)的、標(biāo)準(zhǔn)的登錄憑證以嘗試登錄你的 Linux 機(jī)器。相反,只允許已知的用戶登錄。這種登錄限制可以通過(guò) ??公鑰加密?? 來(lái)實(shí)現(xiàn),它使用一個(gè)密鑰對(duì),其中公鑰存儲(chǔ)在 SSH 主機(jī)上,而私鑰保留在客戶端。
調(diào)試
如果你難以連接你的 Linux 機(jī)器,你可以跟蹤你的 SSH 守護(hù)進(jìn)程的處理過(guò)程:
journalctl -f -u sshd
這是一個(gè)普通的登錄進(jìn)程,但是其日志級(jí)別為 DEBUG,它看起來(lái)是這樣的 :
LogLevel DEBUG output
了解更多
這篇文章幾乎沒(méi)有涉及到使用 SSH 的方法。如果你正在尋找一個(gè)特定用例的信息,你也許可以在互聯(lián)網(wǎng)中找到無(wú)數(shù)的教程。我在工作中使用 PuTTY ,因?yàn)樗子谠O(shè)置,在兩個(gè)操作系統(tǒng)間又具有良好的可操作性,使得它成為連接解決方案里的瑞士軍刀。
(文內(nèi)圖片來(lái)自:Stephan Avenwedde,??CC BY-SA 4.0??)