SSH基本知識:與SSH伺服器、客戶端和金鑰的工作

介紹

SSH 是一種安全協議,通常用作遠程連接到 Linux 伺服器的主要手段。它通過產生一個遠程 shell 提供基於文本的介面。連接後,您在本地終端中輸入的所有命令都將被發送到遠程伺服器並在那裡執行。

在這份速查表式指南中,我們將介紹一些常見的 SSH 連接方式,以實現您的目標。這可以作為您需要了解如何以不同方式連接或配置伺服器時的快速參考。

使用DigitalOcean 應用平台從 GitHub 部署您的前端應用。讓 DigitalOcean 專注於擴展您的應用程式。

如何使用本指南

  • 如果您對 SSH 不熟悉,或者剛開始使用,請首先閱讀SSH 概述部分
  • 根據您想要實現的目標使用後續各部分。大多數部分都不依賴於其他部分,因此您可以獨立使用以下示例。
  • 使用此页面左侧的目录菜单(在宽屏宽度下)或浏览器的查找功能来定位所需的部分。
  • 复制并粘贴给出的命令行示例,并用您自己的值替换突出显示的值。

SSH 概述

连接到远程 Linux 服务器的最常见方法是通过 SSH。 SSH 代表 Secure Shell,提供了一种安全的方式来远程执行命令、进行更改和配置服务。 当您通过 SSH 连接时,您会使用存在于远程服务器上的帐户登录。

SSH 的工作原理

当您通过 SSH 连接时,您将被放置到一个 shell 会话中,这是一个基于文本的界面,您可以与服务器进行交互。 在您的 SSH 会话期间,您在本地终端中键入的任何命令都会通过加密的 SSH 隧道发送并在服务器上执行。

SSH 连接是使用客户端-服务器模型实现的。这意味着要建立 SSH 连接,远程机器必须运行一个名为 SSH 守护程序的软件。该软件在特定网络端口上监听连接请求,对连接请求进行身份验证,并在用户提供正确凭据时生成适当的环境。

用户的计算机必须安装 SSH 客户端。这是一种软件,它知道如何使用 SSH 协议进行通信,并可以提供有关要连接的远程主机、要使用的用户名以及应传递用于身份验证的凭据的信息。客户端还可以指定他们希望建立的连接类型的某些细节。

SSH 如何对用户进行身份验证

客户端通常使用密码(较不安全且不推荐)或 SSH 密钥进行身份验证,后者非常安全。

密码登录是加密的,并且易于新用户理解。然而,自动化机器人和恶意用户通常会反复尝试对允许基于密码登录的帐户进行身份验证,这可能导致安全妥协。因此,我们建议对大多数配置始终设置基于 SSH 密钥的身份验证。

SSH 密鑰是一組配對的加密金鑰,可用於身份驗證。每組包含一個公鑰和一個私鑰。公鑰可以自由共享,而私鑰必須嚴加保護,絕不可外洩給任何人。

要使用 SSH 密鑰進行身份驗證,使用者必須在其本地計算機上擁有一對 SSH 密鑰。在遠程伺服器上,必須將公鑰複製到使用者家目錄下的文件中:~/.ssh/authorized_keys。該文件包含了一個授權登錄到該帳戶的公鑰列表,每行一個。

當客戶端連接到主機並希望使用 SSH 密鑰進行身份驗證時,它將告知服務器此意圖,並告知服務器使用哪個公鑰。然後,服務器會檢查其 authorized_keys 文件以查找公鑰,生成一個隨機字符串並使用公鑰加密它。此加密消息只能使用相應的私鑰解密。服務器將此加密消息發送給客戶端以測試其是否實際擁有相應的私鑰。

在收到此消息後,客戶端將使用私鑰解密它,將揭示的隨機字符串與之前協商的會話 ID 結合。然後,它生成此值的 MD5 哈希並將其傳回給服務器。服務器已經擁有原始消息和會話 ID,因此它可以比較由這些值生成的 MD5 哈希並確定客戶端必須擁有私鑰。

現在您知道 SSH 如何工作,我們可以開始討論一些示例,以演示不同的 SSH 工作方式。

生成和使用SSH密钥

本节将介绍如何在客户端机器上生成SSH密钥,并将公钥分发到应该使用它们的服务器上。如果您以前没有生成过密钥,由于增加了未来连接的安全性,这是一个很好的开始部分。

生成SSH密钥对

在本地计算机上生成新的SSH公钥和私钥对是远程服务器身份验证的第一步,而无需密码。除非有充分的理由不这样做,否则您应该始终使用SSH密钥进行身份验证。

A number of cryptographic algorithms can be used to generate SSH keys, including RSA, DSA, and ECDSA. RSA keys are generally preferred and are the default key type.

要在本地计算机上生成RSA密钥对,请键入:

  1. ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):

此提示允许您选择存储RSA私钥的位置。按 ENTER 保留默认设置,将其存储在您用户主目录中的 .ssh 隐藏目录中。保留默认位置选项将使您的SSH客户端自动找到密钥。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

下一个提示允许您输入任意长度的密码来保护您的私钥。默认情况下,每次使用私钥时,您都必须输入在此处设置的任何密码,作为额外的安全措施。如果您不想设置密码,请随意按 ENTER 键留空。但请记住,这将允许任何控制您的私钥的人登录到您的服务器。

如果您选择输入密码,当您输入时不会显示任何内容。这是一项安全预防措施。

Output
Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here The key's randomart image is: +--[ RSA 2048]----+ | | | | | | | + | | o S . | | o . * + | | o + = O . | | + = = + | | ....Eo+ | +-----------------+

此过程生成了一个RSA SSH密钥对,位于您用户主目录中的.ssh隐藏目录中。这些文件是:

  • ~/.ssh/id_rsa:私钥。绝对不要分享此文件!
  • ~/.ssh/id_rsa.pub:相关的公钥。可以自由共享,没有任何后果。

使用更多比特生成SSH密钥对

默认情况下,SSH密钥为2048比特。这通常被认为对于安全性来说已经足够了,但您可以指定更多比特以获得更加强化的密钥。

要实现这一点,请在所需的位数后面加上-b参数。大多数服务器支持长度至少为4096比特的密钥。出于DDOS保护目的,可能不接受更长的密钥:

  1. ssh-keygen -b 4096

如果您之前创建了不同的密钥,系统会询问您是否要覆盖之前的密钥:

Overwrite (y/n)?

如果您选择“是”,您之前的密钥将被覆盖,您将无法再使用该密钥登录服务器。因此,请谨慎覆盖密钥。

删除或更改私钥的密码

如果您为您的私钥生成了密码并希望更改或删除它,您可以轻松地这样做。

注意: 要更改或删除密码,您必须知道原始密码。如果您忘记了密钥的密码,则无法恢复,您必须生成新的密钥对。

要更改或删除密码,只需输入:

  1. ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa):

您可以输入要修改的密钥位置,或按 ENTER 接受默认值:

Enter old passphrase:

输入要更改的旧密码。然后,系统会提示您输入新密码:

Enter new passphrase (empty for no passphrase):
Enter same passphrase again:

在这里,输入您的新密码,或按 ENTER 删除密码。

显示 SSH 密钥指纹

每個SSH密鑰對都共享一個可以用來唯一識別這些密鑰的加密“指紋”。這在各種情況下都可能很有用。

要找出SSH密鑰的指紋,請輸入:

  1. ssh-keygen -l
Enter file in which the key is (/root/.ssh/id_rsa):

如果該位置正確,您可以按ENTER,否則請輸入修改後的位置。然後您將收到一個包含密鑰的位元長度、指紋、帳戶和主機以及使用的算法的字串:

Output
4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e demo@test (RSA)

使用SSH-Copy-ID將您的公共SSH密鑰複製到伺服器

要將您的公鑰複製到伺服器,以允許您無需密碼進行身份驗證,可以採用多種方法。

如果您目前已經配置了基於密碼的SSH訪問權限到您的伺服器,並且您已經安裝了ssh-copy-id工具,這是一個簡單的過程。許多Linux發行版的OpenSSH套件中都包括了ssh-copy-id工具,因此很可能是默認安裝的。

如果您有此選項,您可以輕鬆地通過輸入以下命令來傳輸您的公鑰:

  1. ssh-copy-id username@remote_host

這將提示您輸入遠程系統上用戶帳戶的密碼:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:

在輸入密碼後,您的~/.ssh/id_rsa.pub密鑰的內容將附加到用戶帳戶的~/.ssh/authorized_keys文件的末尾:

Output
Number of key(s) added: 1 Now try logging into the machine, with: "ssh '[email protected]'" and check to make sure that only the key(s) you wanted were added.

您現在可以無需密碼登錄該帳戶:

  1. ssh username@remote_host

將您的公共 SSH 金鑰複製到一台沒有 SSH-Copy-ID 的伺服器

如果您沒有可用的ssh-copy-id工具,但仍然可以通過基於密碼的 SSH 訪問遠程伺服器,則可以以不同的方式複製您公鑰的內容。

您可以輸出金鑰的內容並將其管道化到ssh命令中。在遠程端,您可以確保~/.ssh目錄存在,然後將管道化的內容附加到~/.ssh/authorized_keys文件中:

  1. cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

您將被要求提供遠程帳戶的密碼:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
[email protected]'s password:

輸入密碼後,您的金鑰將被複製,允許您無需密碼登錄:

  1. ssh username@remote_IP_host

手動將您的公共 SSH 金鑰複製到一台伺服器

如果您沒有可用的基於密碼的 SSH 訪問,則必須手動將您的公共金鑰添加到遠程伺服器。

在您的本地計算機上,您可以通過輸入以下內容找到您公共金鑰文件的內容:

  1. cat ~/.ssh/id_rsa.pub
Output
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

您可以複製此值,並手動將其粘貼到遠程服務器的適當位置。您將不得不通過其他方式(如 DigitalOcean Web 控制台)登錄到遠程服務器。

在遠程服務器上,如果尚不存在,創建 ~/.ssh 目錄:

  1. mkdir -p ~/.ssh

之後,您可以通過輸入以下命令創建或追加 ~/.ssh/authorized_keys 檔案:

  1. echo public_key_string >> ~/.ssh/authorized_keys

現在,您應該可以無需密碼登錄到遠程服務器。

基本連接說明

以下部分將介紹一些有關如何使用 SSH 連接到服務器的基本知識。

連接到遠程服務器

要連接到遠程服務器並在其中打開 shell 會話,您可以使用 ssh 命令。

最簡單的形式假設您在本地機器上的用戶名與遠程服務器上的用戶名相同。如果是這樣,您可以使用以下命令進行連接:

  1. ssh remote_host

如果您在遠程服務器上的用戶名不同,您需要像這樣傳遞遠程用戶的名稱:

  1. ssh username@remote_host

第一次連接到新主機時,您將看到類似於此的消息:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

輸入以接受遠程主機的真實性。

如果您正在使用密碼驗證,您將在此處收到對遠程帳戶密碼的提示。 如果您正在使用SSH金鑰,如果設置了私鑰密碼,您將收到對私鑰密碼的提示,否則將自動登錄。

在遠程服務器上運行單個命令

要在遠程服務器上運行單個命令,而不是生成一個shell會話,您可以在連接信息之後添加命令,如下所示:

  1. ssh username@remote_host command_to_run

這將連接到遠程主機,使用您的憑據進行身份驗證,並執行您指定的命令。 連接將立即在之後關閉。

使用不同端口登錄服務器

默認情況下,服務器上的SSH守護程序運行在端口22上。 您的SSH客戶端將在嘗試連接時假定這是正確的情況。 如果您的SSH服務器正在監聽非標準端口(這在稍後的部分中演示),則必須在使用客戶端連接時指定新的端口號。

你可以使用-p选项指定端口号:

  1. ssh -p port_num username@remote_host

为了避免每次登录远程服务器都需要这样做,你可以在本地计算机的家目录下的~/.ssh目录中创建或编辑一个配置文件。

现在通过输入以下命令来编辑或创建文件:

  1. nano ~/.ssh/config

在这里,你可以设置主机特定的配置选项。要指定新端口,可以使用以下格式:

~/.ssh/config
Host remote_alias
    HostName remote_host
    Port port_num

这将允许你在命令行中登录而无需指定特定的端口号。

将您的SSH密钥添加到SSH代理以避免输入密码

如果您的私有SSH密钥有密码,每次使用它连接到远程主机时都会提示您输入密码。

为了避免反复这样做,您可以运行一个SSH代理。这个小工具会在您第一次输入密码后存储您的私钥。它将在您的终端会话期间可用,允许您在将来连接而无需重新输入密码。

如果您需要转发您的SSH凭据(稍后显示),这也很重要。

要启动SSH代理,请在本地终端会话中键入以下内容:

  1. eval $(ssh-agent)
Output
Agent pid 10891

這將啟動代理程序並將其置於後台運行。現在,您需要將您的私鑰添加到代理程序中,以便它可以管理您的金鑰:

  1. ssh-add
Enter passphrase for /home/demo/.ssh/id_rsa:
Identity added: /home/demo/.ssh/id_rsa (/home/demo/.ssh/id_rsa)

您將需要輸入您的密碼(如果設置了密碼)。之後,您的身份文件將被添加到代理中,允許您使用您的金鑰進行登錄,而無需再次輸入密碼。

將您的SSH憑證轉發到用於伺服器的用途

如果您希望能夠從另一台伺服器內部無需密碼連接到一台伺服器,則需要轉發您的SSH金鑰信息。這將允許您通過您所連接的服務器對另一台服務器進行身份驗證,使用本地計算機上的憑證。

首先,您必須啟動您的SSH代理程序並將您的SSH金鑰添加到代理中(參見前文)。完成此操作後,您需要使用-A選項連接到第一台服務器。這將將您的憑證轉發到該會話的服務器:

  1. ssh -A username@remote_host

從這裡,您可以SSH連接到您的SSH金鑰被授權訪問的任何其他主機。您將連接,就好像您的私人SSH金鑰位於此服務器上。

伺服器端配置選項

這部分包含一些常見的伺服器端配置選項,可以調整伺服器的回應方式以及允許的連線類型。

停用密碼驗證

如果您已經配置、測試並且 SSH 金鑰運作正常,那麼關閉密碼驗證可能是個不錯的主意。這將防止任何使用者使用密碼登錄 SSH。

要這樣做,請連線到您的遠端伺服器,以 root 或 sudo 權限打開 /etc/ssh/sshd_config 檔案:

  1. sudo nano /etc/ssh/sshd_config

在檔案中,尋找 PasswordAuthentication 指令。如果被註解掉了,取消註解。將其設置為 no 以禁用密碼登錄:

/etc/ssh/sshd_config
PasswordAuthentication no

完成更改後,儲存並關閉檔案。要實施更改,您應該重新啟動 SSH 服務。

在 Ubuntu/Debian 上:

  1. sudo service ssh restart

在 CentOS/Fedora 上:

  1. sudo service sshd restart

現在,系統上的所有帳戶都將無法使用密碼登錄 SSH。

更改 SSH Daemon 運行的端口

有些管理員建議您更改 SSH 運行的默認端口。這可以幫助減少您的服務器所受到的自動化機器人身份驗證嘗試次數。

要更改 SSH 守護進程聆聽的端口,您需要登錄到遠程服務器。使用根權限在遠程系統上打開 sshd_config 文件,可以通過該用戶登錄或使用 sudo

  1. sudo nano /etc/ssh/sshd_config

進入後,您可以通過查找 Port 22 規範並將其修改為您希望使用的端口來更改 SSH 運行的端口。例如,將端口更改為 4444,請將此內容添加到您的文件中:

/etc/ssh/sshd_config
#Port 22
Port 4444

完成後保存並關閉文件。要實施更改,您必須重新啟動 SSH 守護進程。

在 Ubuntu/Debian 上:

  1. sudo service ssh restart

在 CentOS/Fedora 上:

  1. sudo service sshd restart

守護進程重新啟動後,您需要通過指定端口號進行身份驗證(在早期部分進行了演示)。

限制能夠通過 SSH 連接的用戶

要明確限制能夠通過 SSH 登錄的用戶帳戶,您可以採取一些不同的方法,每種方法都涉及編輯 SSH 守護進程配置文件。

在您的遠程服務器上,現在使用根或 sudo 權限打開此文件。

  1. sudo nano /etc/ssh/sshd_config

第一種指定允許登錄的帳戶的方法是使用 AllowUsers 指令。在文件中搜索 AllowUsers 指令。如果不存在,請隨意創建。在指令之後,列出應該允許通過 SSH 登錄的用戶帳戶:

/etc/ssh/sshd_config
AllowUsers user1 user2

保存並關閉文件。重新啟動守護程序以實施您的更改。

在 Ubuntu/Debian 上:

  1. sudo service ssh restart

在 CentOS/Fedora 上:

  1. sudo service sshd restart

如果您更熟悉組管理,可以改用 AllowGroups 指令。如果是這種情況,只需添加一個應該允許 SSH 訪問的組(我們將立即創建此組並添加成員):

/etc/ssh/sshd_config
AllowGroups sshmembers

保存並關閉文件。

現在,您可以通過鍵入創建與您指定的組匹配的系統組(無家目錄):

  1. sudo groupadd -r sshmembers

確保將您需要的任何用戶帳戶添加到此組。這可以通過鍵入:

  1. sudo usermod -a -G sshmembers user1
  2. sudo usermod -a -G sshmembers user2

現在,重新啟動 SSH 守護程序以實施您的更改。

在 Ubuntu/Debian 上:

  1. sudo service ssh restart

在 CentOS/Fedora 上:

  1. sudo service sshd restart

禁用 Root 登錄

在設置具有 sudo 權限的 SSH 用戶帳戶後,通常建議完全禁用通過 SSH 登錄 Root。

要做到這一點,在遠程服務器上使用 root 或 sudo 打開 SSH 守護程序配置文件。

  1. sudo nano /etc/ssh/sshd_config

在內部,搜尋一個名為 PermitRootLogin 的指示。如果被註解了,請取消註解。將值改為 “no”:

/etc/ssh/sshd_config
PermitRootLogin no

保存並關閉文件。要實施您的更改,請重新啟動 SSH 守護程序。

在 Ubuntu/Debian 上:

  1. sudo service ssh restart

在 CentOS/Fedora 上:

  1. sudo service sshd restart

允許特定命令的 root 訪問權限

有些情況下,您可能希望通常禁用 root 訪問權限,但又希望啟用它以使某些應用程序正常運行。一個例子是備份例程。

這可以通過 root 用戶的 authorized_keys 文件來實現,該文件包含被授權使用該帳戶的 SSH 金鑰。

將您希望用於此過程的本地計算機上的金鑰(我們建議為每個自動流程創建一個新金鑰)添加到服務器上 root 用戶的 authorized_keys 文件中。我們在此將使用 ssh-copy-id 命令進行演示,但您可以使用我們在其他部分討論的任何複製金鑰的方法:

  1. ssh-copy-id root@remote_host

現在,登錄到遠程服務器。我們需要調整 authorized_keys 文件中的項目,因此以 root 或 sudo 訪問權限打開它:

  1. sudo nano /root/.ssh/authorized_keys

在您上傳的金鑰行的開頭,添加一個command=列,定義此金鑰有效的命令。這應該包括可執行文件的完整路徑,以及任何參數:

/root/.ssh/authorized_keys
command="/path/to/command arg1 arg2" ssh-rsa ...

完成後保存並關閉文件。

現在,以 root 或 sudo 權限打開sshd_config文件:

  1. sudo nano /etc/ssh/sshd_config

找到指令PermitRootLogin,並將值更改為forced-commands-only。這將僅允許使用 SSH 金鑰登錄時指定金鑰時使用 root:

/etc/ssh/sshd_config
PermitRootLogin forced-commands-only

保存並關閉文件。重新啟動 SSH 守護進程以實施更改。

在 Ubuntu/Debian 上:

  1. sudo service ssh restart

在 CentOS/Fedora 上:

  1. sudo service sshd restart

將 X 應用程序顯示轉發到客戶端

可以配置 SSH 守護進程,將服務器上 X 應用程序的顯示自動轉發到客戶端機器。為了使此功能正常運作,客戶端必須配置並啟用 X 窗口系統。

為了啟用此功能,請以 root 或帶有 sudo 權限的身份登錄到遠程服務器並編輯sshd_config文件:

  1. sudo nano /etc/ssh/sshd_config

搜索X11Forwarding指令。如果被註釋掉,請取消註釋它。如果需要,請創建並將值設置為“yes”:

/etc/ssh/sshd_config
X11Forwarding yes

保存並關閉文件。重新啟動SSH守護程序以實現這些更改。

在Ubuntu/Debian上:

  1. sudo service ssh restart

在CentOS/Fedora上:

  1. sudo service sshd restart

要連接到服務器並轉發應用程序的顯示,您必須在客戶端連接時傳遞-X選項:

  1. ssh -X username@remote_host

通過此會話在服務器上啟動的圖形應用程序應該顯示在本地計算機上。性能可能會有些慢,但在緊要關頭非常有幫助。

客戶端配置選項

在接下來的部分中,我們將專注於您可以在連接的客戶端端進行的一些調整。

定義特定於服務器的連接信息

在您的本地計算機上,您可以為您連接到的一些或所有服務器定義單獨的配置。這些可以存儲在~/.ssh/config文件中,每次呼叫SSH客戶端時都會讀取該文件。

在您的本地計算機上用文本編輯器創建或打開此文件:

  1. nano ~/.ssh/config

在內部,您可以通過引入每個別名後跟一個Host關鍵詞來定義個別配置選項。在這之下並縮進,您可以定義在ssh_config手冊頁中找到的任何指令:

  1. man ssh_config

一個示例配置會是:

~/.ssh/config
Host testhost
    HostName your_domain
    Port 4444
    User demo

您可以通過簡單地輸入以下內容來連接到端口4444上的your_domain,使用用戶名demo

  1. ssh testhost

您也可以使用通配符來匹配多個主機。請注意,後續匹配可以覆蓋前面的匹配。因此,您應該將最一般的匹配放在頂部。例如,您可以將所有連接默認為不允許X轉發,並將your_domain的覆蓋設置在文件中:

~/.ssh/config
Host *
    ForwardX11 no

Host testhost
    HostName your_domain
    ForwardX11 yes
    Port 4444
    User demo

完成後保存並關閉文件。

保持連接以避免超時

如果您發現自己在準備好之前就被SSH會話中斷了,那麼可能是您的連接超時了。

您可以配置客戶端定期向服務器發送一個封包,以避免這種情況:

在您的本地計算機上,您可以通過編輯您的~/.ssh/config文件為每個連接配置此選項。立即打開它:

  1. nano ~/.ssh/config

如果尚不存在,請在文件頂部定義一個將匹配所有主機的部分。將ServerAliveInterval設置為“120”以每兩分鐘向服務器發送一個封包。這應該足以通知服務器不要關閉連接:

~/.ssh/config
Host *
    ServerAliveInterval 120

完成後保存並關閉文件。

禁用主機檢查

默認情況下,每次連接到新服務器時,都會顯示遠程SSH守護程序的主機密鑰指紋。

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

這是配置的,以便您可以驗證您嘗試連接的主機的真實性,並發現可能有惡意用戶試圖冒充遠程主機的情況。

在某些情況下,您可能希望禁用此功能。注意:這可能是一個很大的安全風險,因此,如果您將系統設置為這樣,請確保您知道自己在做什麼。

要進行更改,打開您本地計算機上的~/.ssh/config文件:

  1. nano ~/.ssh/config

如果尚不存在,請在文件頂部定義一個將匹配所有主機的部分。將StrictHostKeyChecking指令設置為no以自動將新主機添加到known_hosts文件中。將UserKnownHostsFile設置為/dev/null以在新主機或更改的主機上不警告:

~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

您可以按需对每个主机启用检查,通过反转其他主机的选项。 StrictHostKeyChecking 的默认值是 ask

~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Host testhost
    HostName your_domain
    StrictHostKeyChecking ask
    UserKnownHostsFile /home/demo/.ssh/known_hosts

在单个TCP连接上多路复用SSH

有些情况下,建立新的TCP连接可能会花费比您想要的时间更长。如果您要对同一台机器进行多次连接,可以利用多路复用。

SSH多路复用会重复使用同一条TCP连接进行多个SSH会话。这样做可以减少建立新会话所需的一些工作,可能会加快速度。限制连接数量也可能有助于其他方面。

要设置多路复用,您可以手动设置连接,或者在可用时配置客户端自动使用多路复用。我们将在这里演示第二种选项。

要配置多路复用,请编辑您本地机器上SSH客户端的配置文件:

  1. nano ~/.ssh/config

如果您的文件顶部尚未有通配符主机定义,请立即添加一个(如 Host *)。我们将设置 ControlMasterControlPathControlPersist 值来建立我们的多路复用配置。

ControlMaster 应设置为“auto”,以便在可能的情况下自动允许复用。 ControlPath 将建立控制套接字的路径。 第一个会话将创建此套接字,并且后续会话将能够找到它,因为它由用户名、主机和端口标记。

ControlPersist 选项设置为 1 将允许初始主连接后台运行。 1 指定TCP连接应在最后一个SSH会话关闭一秒钟后自动终止:

/.ssh/config
Host *
    ControlMaster auto
    ControlPath ~/.ssh/multiplex/%r@%h:%p
    ControlPersist 1

完成后保存并关闭文件。 现在,我们需要实际创建控制路径中指定的目录:

  1. mkdir ~/.ssh/multiplex

现在,与同一台机器建立的任何会话都将尝试使用现有的套接字和TCP连接。 当最后一个会话存在时,连接将在一秒钟后被拆除。

如果由于某种原因您需要暂时绕过复用配置,则可以通过传递 -S 标志和 none 来执行:

  1. ssh -S none username@remote_host

设置SSH隧道

通过安全的SSH隧道将其他流量进行隧道传输是绕过限制性防火墙设置的绝佳方式。 这也是加密其他未加密网络流量的好方法。

配置本地隧道到服务器

SSH连接可用于将本地主机上的端口流量隧道传输到远程主机上的端口。

A local connection is a way of accessing a network location from your local computer through your remote host. First, an SSH connection is established to your remote host. On the remote server, a connection is made to an external (or internal) network address provided by the user and traffic to this location is tunneled to your local computer on a specified port.

这经常用于通过绕过防火墙来隧道到较不受限制的网络环境。另一个常见用途是从远程位置访问“仅本地主机”网页界面。

要建立到远程服务器的本地隧道,您需要在连接时使用-L参数,并且必须提供三个额外信息:

  • 您希望访问隧道连接的本地端口。
  • 您希望您的远程主机连接到的主机。
  • 您希望您的远程主机连接的端口。

这些信息以以上顺序(由冒号分隔)作为-L标志的参数给出。我们还将使用-f标志,它会导致SSH在执行之前进入后台,并使用-N标志,它不会在远程端打开shell或执行程序。

例如,要连接到远程主机上端口80的your_domain,并将连接在本地主机上的端口8888上提供,您可以键入:

  1. ssh -f -N -L 8888:your_domain:80 username@remote_host

现在,如果您将本地网络浏览器指向127.0.0.1:8888,您应该看到端口80your_domain上的任何内容。

A more general guide to the syntax is:

  1. ssh -L your_port:site_or_IP_to_access:site_port username@host

由於連線是在後台執行,您需要找到其 PID 以將其終止。您可以通過搜索您轉發的端口來找到它:

  1. ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -L 8888:your_domain:80 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888

然後,您可以通過針對 PID(即與您的 SSH 命令匹配的行的第二列中的數字)來終止該進程:

  1. kill 5965

另一個選擇是啟動連線時不使用 -f 標誌。這將使連線保持在前景,防止您在轉發期間使用終端窗口。這樣做的好處是您可以輕鬆通過輸入 CTRL-C 來終止隧道。

配置到服務器的遠程隧道

SSH 連線可用於將本地主機上的端口的流量隧道到遠程主機上的端口。

在遠程隧道中,會建立到遠程主機的連線。在隧道創建期間,指定了一個遠程端口。然後,此端口在遠程主機上將被隧道連接到從本地計算機連接的主機和端口組合。這將允許遠程計算機通過您的本地計算機訪問主機。

如果您需要允許訪問被封鎖以外連接的內部網絡,這可能很有用。如果防火牆允許從網絡外部進行連接,這將允許您連接到遠程計算機並從該計算機將流量隧道到內部網絡上的位置。

要建立到您的遠程伺服器的遠端隧道,您需要在連接時使用-R參數,並且您必須提供三個額外的資訊:

  • 遠程主機可以訪問隧道連接的端口。
  • 您希望本地電腦連接到的主機。
  • 您希望本地電腦連接到的端口。

這些資訊按照上述順序(以冒號分隔)作為-R標誌的參數給出。我們還將使用-f標誌,這導致SSH在執行之前進入後台,以及-N標誌,它不在遠程端開啟shell或執行程式。

例如,要連接到我們本地電腦上端口80的your_domain,使連接在我們遠程主機上的端口8888可用,您可以輸入:

  1. ssh -f -N -R 8888:your_domain:80 username@remote_host

現在,在遠程主機上,開啟一個網頁瀏覽器到127.0.0.1:8888將允許您查看位於your_domain上端口80的任何內容。

A more general guide to the syntax is:

  1. ssh -R remote_port:site_or_IP_to_access:site_port username@host

由於連接在後台運行,您將需要查找其PID來終止它。您可以通過搜索您轉發的端口來進行:

  1. ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -R 8888:your_domain:80 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888

然後,您可以通過定位匹配您SSH命令的行的第二列中的PID,即數字,來終止該進程。

  1. kill 5965

另一個選擇是在不使用-f標誌的情況下開始連接。這將保持連接在前台運行,防止您在轉發期間使用終端窗口。這樣做的好處是您可以輕鬆通過輸入CTRL-C結束隧道。

配置到遠程服務器的動態隧道

SSH連接可用於從本地主機的端口將流量隧道到遠程主機的端口。

A dynamic tunnel is similar to a local tunnel in that it allows the local computer to connect to other resources through a remote host. A dynamic tunnel does this by simply specifying a single local port. Applications that wish to take advantage of this port for tunneling must be able to communicate using the SOCKS protocol so that the packets can be correctly redirected at the other side of the tunnel.

通過此本地端口傳送的流量將被發送到遠程主機。從那裡,SOCKS協議將被解釋以建立與所需終點位置的連接。此設置允許支持SOCKS的應用程序通過遠程服務器連接到任意數量的位置,而無需多個靜態隧道。

要建立連接,我們將傳遞-D標誌以及我們希望訪問隧道的本地端口。我們還將使用-f標誌,這導致SSH在執行之前進入後台,以及-N標誌,它不在遠程端打開shell或執行程序。

例如,要在端口7777上建立一個隧道,您可以輸入:

  1. ssh -f -N -D 7777 username@remote_host

從這裡,您可以開始將您的支持SOCKS的應用程序(如Web瀏覽器)指向您選擇的端口。應用程序將其信息發送到與該端口關聯的套接字。

根據應用程序不同,將流量導向SOCKS端口的方法會有所不同。例如,在Firefox中,通常位置是 首選項 > 進階 > 設定 > 手動代理設置。在Chrome中,您可以啟動應用程序並設置--proxy-server=標誌。您將希望使用本地主機界面和您轉發的端口。

由於連接在後台運行,您需要查找其PID來終止它。您可以通過搜索您轉發的端口來執行此操作:

  1. ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -D 7777 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888

然後,您可以通過鎖定與您的SSH命令匹配的行的第二列中的PID(即數字)來終止該進程:

  1. kill 5965

另一個選擇是在不使用-f標誌的情況下開始連接。這將使連接保持在前台,防止您在轉發期間使用終端窗口。這樣做的好處是您可以輕鬆通過鍵入CTRL-C來終止隧道。

使用SSH逃脫碼來控制連接

即使在建立SSH會話之後,也可以從終端內部對連接進行控制。我們可以使用一種稱為SSH逃脫碼的東西來做到這一點,這使我們能夠在會話中與我們的本地SSH軟件進行交互。

從客戶端強制斷開連線(如何退出卡住或凍結的會話)

OpenSSH中最有用但常被忽視的功能之一是能夠從內部控制會話的某些方面。

這些命令可以在SSH會話中使用以~控制字符開頭來執行。只有在按下ENTER鍵一兩次後輸入它們,控制命令才會被解釋,因此請務必這樣做。

最有用的控制之一是從客戶端啟動斷開連接的能力。SSH連接通常由服務器關閉,但如果服務器遇到問題或連接已中斷,這可能會成為問題。通過使用客戶端斷開,可以從客戶端清潔地關閉連接。

要從客戶端關閉連接,請使用控制字符(~)和一個句點。如果您的連接出現問題,您可能會處於看似卡住的終端會話中。盡管缺少反饋,但請輸入命令以執行客戶端斷開:

  1. [ENTER]
  2. ~.

連接應立即關閉,將您返回到本地的Shell會話。

將SSH會話置於背景中

OpenSSH中最有用但往往被忽視的功能之一是能夠從連接內部控制會話的某些方面。

這些命令可以在SSH連接中使用~控制字符開始執行。 只有在按下ENTER一到兩次後,控制命令才會被解釋,因此請始終在使用之前按下ENTER

這提供的一個功能是將SSH會話放入背景中。 要做到這一點,我們需要提供控制字符(~),然後執行將任務放入背景的常規鍵盤快捷方式(CTRL-z):

  1. [ENTER]
  2. ~[CTRL-z]

這將會將連接放入背景,將您返回到本地shell會話。 要返回到您的SSH會話,您可以使用常規作業控制機制。

您可以通過輸入以下命令立即重新啟動最近放入背景的任務:

  1. fg

如果您有多個背景任務,可以通過輸入以下命令查看可用的任務:

  1. jobs
Output
[1]+ Stopped ssh username@some_host [2] Stopped ssh username@another_host

然後,您可以使用第一列中的索引與百分比符號將任何任務帶到前景:

  1. fg %2

在现有的SSH连接上更改端口转发选项

OpenSSH中最实用但常被忽视的功能之一是能够从连接内部控制会话的某些方面。

这些命令可以从SSH连接内部以~控制字符开头执行。只有在按下换行键后第一次输入时才会解释控制命令,因此在使用之前请始终按下ENTER键一到两次。

其中一件事是允许用户在连接已建立后更改端口转发配置。这使您能够即时创建或撤销端口转发规则。

这些功能是SSH命令行界面的一部分,可以通过使用控制字符(~)和“C”在会话期间访问:

  1. [ENTER]
  2. ~C
ssh>

您将获得一个SSH命令提示符,其中只有一组非常有限的有效命令。要查看可用选项,您可以从此提示符中键入-h。如果未返回任何内容,则可能需要通过几次使用~v来增加SSH输出的详细程度:

  1. [ENTER]
  2. ~v
  3. ~v
  4. ~v
  5. ~C
  6. -h
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward

正如您所看到的,您可以使用相应的选项轻松实现任何转发选项(有关更多信息,请参阅转发部分)。您还可以使用相关的“kill”命令销毁隧道,该命令在转发类型字母之前指定了“K”。例如,要终止本地转发(-L),您可以使用-KL命令。您只需要提供端口。

因此,要设置本地端口转发,您可以键入:

  1. [ENTER]
  2. ~C
  3. -L 8888:127.0.0.1:80

您本地计算机上的端口8888现在可以与您正在连接的主机上的Web服务器通信。完成后,您可以通过键入以下内容撤消该转发:

  1. [ENTER]
  2. ~C
  3. -KL 8888

结论

上述说明应涵盖大多数用户在日常基础上所需的SSH信息。如果您有其他提示或想要分享您喜欢的配置和方法,请随时在下面的评论中使用。

Source:
https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys