如何從 Windows 上用 SSH 連接到 Linux
在 Linux 世界中,安全外殼secure shell(SSH)協議是最為常用的、通過命令行控制遠程計算機的方式。SSH 是真正的 Linux 原創,但是它在 Windows 世界中也越來越流行。甚至有了一份官方的 ??Windows 的 SSH 文檔???,那篇文檔闡述了使用 ??OpenSSH?? 控制 Windows 的方法。
這篇文章展示了如何使用了流行的開源工具 ??PuTTY??,建立一個從 Windows 到 Fedora 33 Linux 系統的 SSH 連接。
使用 SSH 的方法
SSH 使用客戶端-服務器模式,即 SSH 客戶端會創建到 SSH 服務端的連接。SSH 服務器通常會作為守護進程Daemon運行,所以它常被稱為 SSHD。你很難找到一個不自帶 SSH 守護進程的 Linux 發行版。在 Fedora 33 中,已安裝了 SSH 守護進程,但是并未激活。
你可以使用 SSH 控制幾乎所有的 Linux 機器,無論它是作為虛擬機還是作為網絡上的物理設備運行。一個常見的用例是無頭headless配置的嵌入式設備,如樹莓派。SSH 也可以用做一個其它網絡服務的隧道。因為 SSH 連接是加密的,所以你可以使用 SSH 作為一個任何默認不提供加密的協議的傳輸層。
在這篇文章中,我將解釋使用 SSH 的四個方式:1、如何在 Linux 端配置 SSH 守護進程;2、如何設置遠程控制臺連接;3、如何通過網絡復制文件,4. 如何將 SSH 作為某些協議的隧道。
1、配置 SSHD
將 Linux 系統(文中是 Fedora 33)作為 SSH 服務器,允許 PuTTY SSH 客戶端進行連接。首先,檢查守護進程的 SSH 配置。配置文件放在 ??/etc/ssh/sshd_config?
?,它包含了許多選項,通過取消掉相關行的注釋就可以激活:
# $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 ::
沒有取消任何注釋的默認配置在這個示例中應該是可以工作的。要檢查 SSH 守護進程是否已經運行,輸入 ??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狀態,使用 ??systemctl start sshd?
? 命令啟動它。
2、設置遠程控制臺
在 Windows 下 ??下載 PuTTY 安裝程序??,然后安裝并打開它。你應看到一個像這樣的窗口:
PuTTY configuration screen
在“主機名(或 IP 地址)Host Name (or IP address)”輸入框,鍵入你的 Linux 系統的連接信息。本文設置了一個 Fedora 33 虛擬機,它使用橋接網絡適配器,使我可以由 IP 地址 ??192.168.1.60?
? 連接這個系統。點擊“打開Open”,應會如圖示的打開一個窗口:
PutTTY security alert
這是 SSH 的安全措施之一,是為了防止??中間人攻擊???man-in-the-middle attack。消息中的指紋應該匹配 Linux 系統中放在 ??/etc/ssh/ssh_host_ed25519_key.pub?
?? 的密鑰。PuTTY 將這個密鑰以 ??MD5 哈希值?? 的方式打印出來。要檢查它的真實性,切換到 Linux 系統并打開一個控制臺,然后輸入:
ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
輸出應該和 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)
點擊“是Yes”以確認 PuTTY 的安全提示。主機系統的指紋現在存儲在 PuTTY 的信任列表中,其位于 Windows 的注冊表中的:
HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys
輸入正確的登錄憑證,然后你應該進入控制臺了,位置在你的用戶主目錄。
Logged in to SSH
3、通過網絡復制文件
除了遠程控制臺,你同樣可以使用 PuTTY 通過 SSH 來傳輸文件。PuTTY 的安裝目錄在 ??C:\Program Files (x86)\PuTTY?
??,在該目錄下尋找 ??ppscp.exe?
?。你既可以使用它從 Linux 系統復制文件,也可以復制文件到 Linux 系統。
使用 ??Windows + R?
?? 然后輸入 ??cmd?
?? 來打開命令提示符,從你的 Linux 用戶主目錄復制 ??MYFile.txt?
? 到你的 Windows 主目錄,輸入:
C:\"Program Files (x86)"\PuTTY\pscp.exe stephan@192.168.1.60:/home/stephan/MyFile.txt .
要從 Windows 主目錄復制文件到 Linux 用戶主目錄,輸入:
C:\"Program Files (x86)"\PuTTY\pscp.exe MyFile.txt stephan@192.168.1.60:/home/stephan/
就像你也許已經發現的那樣,復制的命令通常構造為:
pscp.exe <source> <target>
4、隧道化一個協議
假設你擁有一個 Linux 機器,為某些特別的應用運行一個基于 HTTP 的服務。你想從你的 Windows 機器通過互聯網訪問這個 HTTP 服務。而且,你不能將相關的 TCP 端口暴露在公網,因為:
- 這個服務通過 HTTP 而非 HTTPS 運行
- 根本沒有用戶管理和登錄系統
乍一看,建立這種架構不產生可怕的漏洞似乎是不可能的。但是 SSH 可簡單的為這種情況建立一個安全的解決方案。
我將用我的軟件項目 ??Pythonic??? 來演示這個過程。在容器中運行。Pythonic 作為容器運行,開放兩個 TCP 端口:TCP 端口 7000(主要編輯器)和 TCP 端口 8000(??code-server?? 代碼編輯器)。
要在一個 Linux 機器上安裝 Pythonic ,運行:
podman pull pythonicautomation/pythonic
podman run -d -p 7000:7000 -p 8000:8000 pythonic
轉向你的 Windows 機器,打開 PuTTy,轉到 “連接Connection -> SSH -> 隧道Tunnels”。加入你要轉發的兩個 TCP 端口:
- 源:?
?7000?
?? / 目標:??localhost:7000?
? - 源:?
?8000?
?? / 目標:??localhost:8000?
?
Port forwarding in PuTTY
然后返回 “會話Session” 部分,并像之前那樣建立一個 SSH 鏈接。打開網頁瀏覽器,然后轉到 ??http://localhost:7000?
?;你應該看見像這樣的窗口:
Pythonic
你成功的設置了端口轉發!
警告: 如果你選擇在公網上暴露 TCP 端口 22 ,不要使用易于猜測的登錄憑證。你將接受來自全世界的登錄請求,它們使用常見的、標準的登錄憑證以嘗試登錄你的 Linux 機器。相反,只允許已知的用戶登錄。這種登錄限制可以通過 ??公鑰加密?? 來實現,它使用一個密鑰對,其中公鑰存儲在 SSH 主機上,而私鑰保留在客戶端。
調試
如果你難以連接你的 Linux 機器,你可以跟蹤你的 SSH 守護進程的處理過程:
journalctl -f -u sshd
這是一個普通的登錄進程,但是其日志級別為 DEBUG,它看起來是這樣的 :
LogLevel DEBUG output
了解更多
這篇文章幾乎沒有涉及到使用 SSH 的方法。如果你正在尋找一個特定用例的信息,你也許可以在互聯網中找到無數的教程。我在工作中使用 PuTTY ,因為它易于設置,在兩個操作系統間又具有良好的可操作性,使得它成為連接解決方案里的瑞士軍刀。
(文內圖片來自:Stephan Avenwedde,??CC BY-SA 4.0??)