说到远程计算,SSH是最流行且最安全的协议之一。SSH 是一种加密网络协议,可与远程设备建立安全连接。连接到远程设备后,用户可以在远程 shell 上运行命令。SSH 在网络和系统管理员中最常见。
这份速查表风格的指南介绍了 SSH 的概述、一些常见的 SSH 连接方式以及各种 SSH 配置。
SSH 概述
SSH 是 Secure Shell 的缩写。有些人也将 SSH 称为 Secure Socket Shell。SSH 是访问远程服务器最常用的方式。使用 SSH 连接到远程系统时,您连接的是一个现有账户。连接后,您将可以访问 shell 会话。运行的所有命令都将在远程机器上执行,输出将打印在您的本地终端上。
SSH 连接遵循客户端-服务器模型。远程系统必须运行 SSH 守护进程才能接受远程 SSH 连接。SSH 守护进程监听特定端口,验证连接请求,并在满足条件时生成相应的环境。
在本指南中,我们配置了两台 Ubuntu 服务器。主服务器将被配置为连接 to 辅助服务器。辅助服务器将被配置为接受来自主服务器的 SSH 连接。这些服务器 IP 地址将在整个指南中使用:
-
主服务器:31.171.250.121
-
辅助服务器:31.171.250.130
首先,您可以查看我们关于如何在 Ubuntu 中使用 SSH 连接到远程服务器以及如何配置您的 Linux 服务器以使用基于 SSH 密钥的身份验证的详细指南。现在,让我们开始吧!
SSH 身份验证
SSH 身份验证主要有两种类型。传统方法是使用密码。它的安全性较低,强烈不推荐。第二种方法是 SSH 密钥。SSH 密钥提供了非常强大的安全性,因此强烈推荐。
虽然密码身份验证更容易理解和配置,但它很容易被利用。例如,自动机器人可以使用暴力破解来侵入系统。SSH 密钥是加密密钥。每个密钥包含两部分 – 私钥和公钥。公钥可以毫无顾虑地分享到任何地方。然而,私钥必须保持安全保护。
要使用 SSH 密钥作为身份验证方法,远程系统必须安装公钥的副本。本地系统上也应安装私钥和公钥的副本。默认情况下,公钥列在以下文件中。每个唯一用户都有该文件的唯一副本:
|
1 |
~/.ssh/authorized_keys |
以下是身份验证过程的工作原理:
-
客户端系统向远程系统发送连接请求。它还会发送要使用的 SSH 密钥。
-
远程系统检查公钥是否列在 authorized_keys 中。
-
如果密钥存在,则会生成一个随机字符串并使用公钥进行加密。加密后的消息只能使用私钥进行解密。
-
收到字符串后,客户端将解密该字符串。
-
结合该字符串和先前协商的会话 ID,生成一个 MD5 哈希值。客户端将该 MD5 哈希值发送给远程系统。
-
远程系统知道随机字符串和会话 ID。如果 MD5 哈希值匹配,则允许连接。
SSH 密钥
在本指南中,SSH 密钥将是身份验证的主要焦点。因此,本节将重点介绍如何使用 SSH 密钥。
-
生成 SSH 密钥对
默认情况下, Linux 系统没有安装 SSH 密钥。但是,系统可能包含以前生成/安装的 SSH 密钥。假设之前没有 SSH 密钥,我们需要生成新的 SSH 公钥和私钥对。SSH 支持许多用于生成 SSH 密钥的加密算法,例如 RSA、DSA、ECDSA 和 EdDSA。RSA 是默认且首选的算法。
-
生成普通的 RSA 密钥对
要生成 SSH 密钥对,请运行以下命令:
|
1 |
ssh-keygen |
提示将询问您要将密钥对保存在何处。如前所述,它将是一个 RSA 密钥对。如果未输入任何值,则 SSH 将其保存到默认位置 /home/demo/.ssh/id_rsa.
下一步是输入密码短语。建议使用密码短语。密码短语的长度是任意的。它增加了一层安全性。但是,SSH 允许生成没有任何密码短语的密钥。如果您想要不带密码短语的密钥,只需按 Enter 键即可。
最终输出提供了以下密钥信息:
-
私钥的位置( /root/.ssh/id_rsa)。绝不应该共享它。
-
公钥的位置( /root/.ssh/id_rsa.pub)。与任何人共享都是安全的。
-
密钥指纹。
-
密钥随机图像。其原理是,如果密钥遭到泄露,您可能会通过注意到密钥图像的任何变化来发现。
-
生成具有不同位数的 RSA 密钥对
默认情况下,SSH 密钥为 2048 位。出于安全考虑,这被认为是足够好的。但是,我们可以手动指定使用不同的位数。位数越高,密钥越强。
运行以下命令生成 4096 位的 SSH 密钥对。大多数服务器都支持 4096 位 SSH 密钥。如果密钥太大,出于 DDoS 防护的目的,它可能不会被接受:
|
1 |
ssh-keygen -b 4096 |
因为我们已经生成了密钥对,SSH 将询问是否覆盖前一个。其余过程与生成普通密钥对相同。
-
更改私钥密码短语
我们可以更改私钥的密码短语。该过程需要您知道当前的密码短语。要更改密码短语,请运行以下命令:
|
1 |
ssh-keygen -p |

该命令将提示您输入私钥的位置。如果密钥存储在默认位置,请按 Enter 键。输入当前的密码短语。如果被接受,则可以指定一个新的密码短语。
-
显示 SSH 密钥指纹
每个 SSH 密钥对都共享一个加密指纹。此指纹可用于识别唯一的密钥。它在许多情况下都很有用。运行以下命令来检查 SSH 密钥的指纹:
|
1 |
ssh-keygen -l |

输入密钥的位置。如果密钥存储在默认位置,请按 Enter 键。
复制公钥
SSH 密钥对已准备好用于保护远程连接。为了让远程系统接受 SSH 密钥进行身份验证,它需要有一份公钥的副本。有多种方法可以将公钥副本复制到远程服务器。
-
使用 ssh-copy-id
该 ssh-copy-id 是 OpenSSH 软件包的一部分。它是复制 SSH 公钥的默认方式。它简单且易于使用。运行以下命令来传输公钥的副本:
|
1 |
ssh-copy-id <username>@<secondary_server_ip> |

您需要远程用户帐户的密码才能完成此过程。如果成功,将显示成功消息。
-
使用 SSH 连接
如果使用 ssh-copy-id 工具不可用,但主服务器可以使用 SSH 连接到辅助服务器,那么我们可以使用不同的技巧来复制密钥。它是通过 SSH 命令将公钥的内容通过管道传输到远程端。请注意,如果目录 ~/.ssh 在远程系统上不存在,它可能无法工作:
|
1 |
cat ~/.ssh/id_rsa.pub | ssh <username>@<secondary_server_ip> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" |
-
手动复制
如果无法进行远程连接,剩下的唯一过程就是手动将公钥添加到远程服务器。首先,获取公钥的内容:
|
1 |
cat ~/.ssh/id_rsa.pub |
在远程服务器上,将密钥放置在合适的位置:
|
1 2 3 |
mkdir -pv ~/.ssh echo <public_key> >> ~/.ssh/authorized_keys |
使用 SSH
公钥设置完成后,我们就可以使用 SSH 进行远程连接了。
-
连接到远程系统
第一步是学习如何使用 SSH 连接到远程系统。这假设本地和远程系统都允许 SSH 流量。要连接到远程系统,请键入以下内容:
|
1 |
ssh <secondary_server_ip> |

要连接到远程服务器上的特定用户,请改用以下结构:
|
1 |
ssh <username>@<secondary_server_ip> |

如果是第一次连接到服务器,SSH 可能会显示警告。输入 yes 以继续连接。如果远程账户受密码保护,您必须输入密码。如果 SSH 密钥受密码短语保护,您还必须输入密码短语。
-
连接到不同的端口
默认情况下,SSH 运行在端口 22。SSH 客户端在连接到远程系统时将采用默认端口值。但是,如果远程系统监听不同的端口以获取 SSH 流量,则无法正常工作。在这种情况下,我们需要手动声明端口号。要声明特定端口,请使用 -p 标志:
|
1 |
ssh -p <port> <username>@<secondary_server_ip> |
每次都手动声明端口会适得其反。我们可以永久更改默认端口值。为此,请打开 SSH 配置文件。如果该文件不存在,以下命令将创建它:
|
1 |
nano ~/.ssh/config |
然后,添加以下行:
|
1 2 3 4 5 |
Host <remote_alias> HostName <remote_hostname> Port <port_value> |
-
在远程服务器上运行命令
连接建立后,您在本地终端上运行的任何命令都将发送到远程服务器。生成的任何输出都将发送到本地终端。
如果只需运行单个命令,我们可以在不进行完整 SSH 登录的情况下运行它。我们只需在 SSH 连接指令后声明该命令即可:
|
1 |
ssh <username>@<secondary_server_ip> <command_to_run> |
-
将密钥添加到 SSH 代理
如果 SSH 密钥有密码短语,那么每次连接到远程系统时,您都必须输入该密码短语。重复这样做会适得其反。我们可以让 SSH 代理来处理它。这是一个小工具,在您输入密码短语后存储私钥。在终端会话期间,私钥将一直可用。要启动 SSH 代理,请运行以下命令:
|
1 |
eval $(ssh-agent) |

该程序正在后台运行。您只需将私钥添加到代理中即可。运行以下命令:
|
1 |
ssh-add |

输入密码短语以完成操作。
-
转发 SSH 凭据
我们还可以配置 SSH,使其在无需密码的情况下从一台服务器连接到另一台服务器。这会非常高效,尤其是在处理大量远程服务器时。为了实现这一点,我们需要转发 SSH 凭据。转发 SSH 凭据需要将远程服务器配置为接受来自本地机器/服务器的连接。然后,您只需使用 -A 标志连接到第一台服务器。它会将您的凭据转发给当前会话的服务器:
|
1 |
ssh -A <username>@<secondary_server_ip> |
远程服务器配置
本节包含一些常见的服务器端配置,以帮助您提高服务器响应速度和连接安全性。
-
禁用密码身份验证
如果已配置 SSH 密钥且 SSH 连接正常工作,那么禁用密码身份验证是安全的。以下配置将在任何用户通过 SSH 连接时停止要求输入密码。在远程服务器上,打开 sshd_config 文件,使用 root/sudo 权限:
|
1 |
sudo nano /etc/ssh/sshd_config |
接下来,搜索条目 PasswordAuthentication。如果该行被注释了,取消注释。将值更改为 no:
|
1 |
PasswordAuthentication no |

保存文件并关闭编辑器。要使更改生效,请重启 SSH 服务:
|
1 |
sudo service ssh restart |
如果系统是 CentOS/Fedora,请改用以下命令:
|
1 |
sudo service sshd restart |
-
更改 SSH 端口
如前所述,SSH 使用端口 22 来交换 SSH 流量。然而,根据一些系统管理员的说法,最好为 SSH 分配一个不同的端口。这有助于防止自动机器人向该端口发送大量垃圾流量。要更改 SSH 监听的端口,请打开 sshd_config 文件:
|
1 |
sudo nano /etc/ssh/sshd_config |
搜索条目 Port。如果它被注释了,取消注释。然后,将值更改为其他值。端口值是一个无符号 16 位整数 (0-65535):
|
1 |
Port 1024 |

保存文件并关闭编辑器。要应用更改,请重启 SSH 守护进程:
|
1 |
sudo service ssh restart |
在 CentOS/Fedora 上,请改运行以下命令:
|
1 |
sudo service sshd restart |
-
用户限制
我们可以配置哪些用户帐户可以使用 SSH 进行连接。这也涉及调整 sshd_config 文件。使用 sudo/root 权限打开该文件:
|
1 |
sudo nano /etc/ssh/sshd_config |
搜索条目 AllowUsers。添加允许的用户:
|
1 |
AllowUsers <user_1> <user_2> |

保存文件并关闭编辑器。重启 SSH 守护进程以使更改生效:
|
1 |
sudo service ssh restart |
在 CentOS/Fedora 上,请改运行以下命令:
|
1 |
sudo service sshd restart |
-
用户组限制
与用户限制类似,我们也可以确定哪些用户组可以使用 SSH 连接到系统。打开 sshd_config 文件:
|
1 |
sudo nano /etc/ssh/sshd_config |
使用条目 AllowGroups 添加可以使用 SSH 的特定用户组:
|
1 |
AllowGroups <user_group> |

保存文件并关闭编辑器。重启 SSH 守护进程以使更改生效:
|
1 |
sudo service ssh restart |
对于 CentOS/Fedora,请改运行以下命令:
|
1 |
sudo service sshd restart |
请注意,如果从用户组中添加或删除了任何用户,则需要重启 SSH 守护进程。否则,组更改将不会生效。
-
禁用 root 登录
如果您可以访问具有 sudo 权限的用户,建议禁用通过 SSH 进行 root 登录。打开 sshd_config 文件:
|
1 |
sudo nano /etc/ssh/sshd_config |
更改条目 PermitRootLogin 的值为 no:
|
1 |
PermitRootLogin no |

保存文件并关闭编辑器。重启 SSH 守护进程以使更改生效:
|
1 |
sudo service ssh restart |
在 CentOS/Fedora 上,请改运行以下命令:
|
1 |
sudo service sshd restart |
-
转发 X 应用程序显示
SSH 守护进程还可以将 X 应用程序的显示从服务器转发到客户端。但是,要使其正常工作,远程系统必须配置有 X 窗口系统。该功能还必须在 SSH 配置中启用。打开 SSH 配置文件:
|
1 |
sudo nano /etc/ssh/sshd_config |
更改指令 X11Forwarding 的值为 yes:
|
1 |
X11Forwarding yes |

保存文件并关闭编辑器。重启 SSH 守护进程以使更改生效:
|
1 |
sudo service ssh restart |
在 CentOS/Fedora 上,请改运行以下命令:
|
1 |
sudo service sshd restart |
客户端配置
在本节中,我们将了解 SSH 客户端上的一些常用配置。
-
特定于服务器的连接信息
在本地系统上,我们可以定义远程连接的具体信息。所有信息都存储在位于以下路径的配置文件中: ~/.ssh/config:
|
1 |
nano ~/.ssh/config |
每个远程系统块都由关键字 Host 后跟一个别名来表示。所有特定于系统的指令都放在这里。连接到远程系统时,SSH 会自动应用它们。有关配置的完整、深入说明,请查看 man 手册页:
|
1 |
man ssh_config |

远程连接的条目将遵循以下结构:
|
1 2 3 |
Host <remote_hostname> <directive> <value> |
-
连接超时
您可能会发现,在准备执行任何操作之前,自己就已经断开了 SSH 会话。如果客户端没有向远程服务器发送任何数据包,那么一段时间后,连接就会超时。为了避免这种情况,我们可以配置本地客户端每隔一段时间发送一个数据包,以保持连接处于活动状态。
打开本地配置文件:
|
1 |
nano ~/.ssh/config |
在远程连接条目下,添加指令 ServerAliveInterval,后跟以秒为单位的数据包发送间隔:
|
1 |
ServerAliveInterval 120 |

保存文件并关闭编辑器。
-
禁用主机检查
默认情况下,每当尝试连接到新服务器时,SSH 客户端都会报告远程 SSH 守护进程的指纹。这是验证主机’真实性的一个有用功能。如果恶意攻击者试图欺骗远程主机,它将显示为新服务器。
禁用此功能可能会带来巨大的安全风险。通常,建议保持此选项开启。但在某些情况下,禁用主机检查可能会带来便利。打开配置文件:
|
1 |
nano ~/.ssh/config |
在远程主机部分下,添加以下指令:

|
1 2 3 |
StrictHostKeyChecking no UserKnownHostsFile /dev/null |
第一条指令将禁用自动将新主机添加到存储在 known_hosts 文件中的已知主机列表中。第二条指令是不对任何更改发出警告。保存文件并关闭编辑器。
-
在单个 TCP 连接上多路复用 SSH
有时,建立 TCP 连接可能需要相当长的时间。如果需要对同一台机器进行多次连接,那么您可以利用多路复用这一强大功能。SSH 多路复用允许在多个 SSH 会话中使用同一个 TCP 连接。它减少了建立新会话所需的一些工作量。限制连接数量也可能会有所帮助。
我们可以手动设置多路复用连接,或者让 SSH 在可用时自动使用它。在这里,我们将配置 SSH 采用第二种方式。打开 SSH 配置文件:
|
1 |
nano ~/.ssh/config |
在文件顶部添加通配符主机定义。这可以确保下一组指令将应用于所有远程连接。添加以下指令:
|
1 2 3 4 5 |
ControlMaster auto ControlPath ~/.ssh/multiplex/%r@%h:%p ControlPersist 1 |

第一条指令告诉 SSH 在可用时自动使用多路复用。第二条指令建立控制套接字的路径。该套接字将在建立第一个会话时创建。后续会话将遵循此套接字。
最后一个指令告诉 SSH 让初始主连接在后台运行。它还表示 TCP 连接将在最后一个 SSH 会话结束一秒后自动终止。接下来,创建我们在配置文件中声明的目录:
|
1 |
mkdir -pv ~/.ssh/multiplex |
最后,多路复用应该已经处于活动状态。
SSH 转义码
建立连接后,有多种方法可以使用转义码来控制连接行为。
-
强制断开连接
您是否卡在某个 SSH 会话中?SSH 会话通常由服务器管理。如果服务器出现问题,那么卡在已死掉的 SSH 会话中可能会令人沮丧。幸好,OpenSSH 提供了有用的控制功能,可以从客户端管理连接状态。
按几次 Enter 键。然后,输入以下命令:
|
1 |
~. |
![]()
这里, ~ 是控制字符。在客户端运行此命令后,连接应立即关闭。
-
SSH 后台会话
我们也可以将 SSH 会话放到后台。放到后台后,您将返回到普通的 shell 会话。工作完成后,您可以再次返回 SSH shell。请注意,您需要配置适当的超时,以避免 SSH 会话在后台时发生超时。要将 SSH 会话放到后台,请输入控制字符,后跟 Ctrl + Z:
|
1 |
~<Ctrl + Z> |

如果这是您最近的后台任务,则可以使用以下命令重新激活它:
|
1 |
fg |
如果有多个后台任务,那么我们可以从任务列表中确定:
|
1 |
jobs |

要将目标任务带到前台,请注意第一列中的任务值。然后,运行以下命令:
|
1 |
fg %<job_value> |
-
更改端口转发配置
利用控制机制,我们可以动态更改端口转发规则。连接建立后,我们可以创建或拆除端口转发规则。这是 SSH 命令行界面的一部分。
要访问 SSH 命令行界面,请运行以下命令:
|
1 |
~C |
![]()
要列出可用选项,请输入以下命令:
|
1 |
-h |
如果输出太少,请尝试使用以下控制命令增加详细程度:
|
1 |
~v |
现在,再次运行 -h 命令:
|
1 |
-h |

正如输出所解释的,通过简单的命令实现任何端口转发都非常简单。例如,也可以使用 kill 命令销毁隧道,在命令列表中由 K 表示。
结语
SSH 非常常见。这就是为什么学习 SSH 非常有用。我们全面的 SSH 概述涵盖了用户日常使用 SSH 所需了解的最重要的 SSH 配置。一旦掌握,您应该能够应对几乎所有的 SSH 服务器配置。
祝您使用愉快!
评论
暂无评论。发表第一条评论吧。