SSH 基础知识:使用 SSH 服务器、客户端和密钥

介绍

SSH是一个安全的协议,作为连接到Linux服务器的主要途径,它提供了基于文本的界面,通过生成远程壳。连接后,您在本地终端中输入的所有命令都发送到远程服务器并在那里执行。

在这个欺骗页面风格的指南中,我们将涵盖一些常见的方式连接到SSH以实现您的目标,这可以用作快速参考,当您需要知道如何以不同的方式连接或配置您的服务器时。

如何使用此指南

  • 若您对 SSH 一般不熟悉或刚刚开始使用,请先阅读 SSH 概览部分,如果您不熟悉 SSH 或刚刚开始使用
  • 使用随后的部分适用于您正在尝试实现的内容。 大多数部分没有预先定义,因此您可以独立使用以下示例
  • 使用本页面左侧的内容菜单(在页面宽度)或浏览器的搜索功能来查找所需的部分
  • 复制并粘贴所提供的命令行示例,以自己的值替换突出的值

SSH 概览

连接到远程Linux服务器的最常见方式是通过SSH。SSH是Secure Shell的缩写,提供了一个安全和安全的方式来执行命令,进行更改和远程配置服务。

SSH如何工作

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

SSH连接是使用客户端服务器模型实现的,这意味着要建立一个SSH连接,远程机器必须运行一个名为SSH DAEMON的软件,该软件会听取特定网络端口上的连接,验证连接请求,并生成适当的环境,如果用户提供正确的凭证。

用户的计算机必须有一个SSH客户端,这是一个知道如何使用SSH协议进行通信的软件,可以提供有关要连接的远程主机的信息,使用的用户名,以及应该传递的身份验证凭证。

SSH如何验证用户身份

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

密码登录是加密的,对新用户很容易理解,但是,自动机器人和恶意用户经常会反复尝试对允许基于密码登录的帐户进行身份验证,这可能会导致安全问题。

SSH密钥是一组可用于身份验证的加密密钥,每个密钥都包含一个公共密钥和一个私钥,公共密钥可以免费共享,而私钥必须谨慎保密,永不暴露给任何人。

要使用 SSH 密钥进行身份验证,用户必须在本地计算机上拥有 SSH 密钥对。在远程服务器上,公共密钥必须被复制到用户主目录中的一个文件中,在 ~/.ssh/authorized_keys

当客户端连接到主机,希望使用SSH密钥身份验证时,它会告知服务器此意图,并告诉服务器使用哪个公共密钥。服务器然后检查其autorized_keys文件对公共密钥,生成随机字符串,并使用公共密钥加密。

接收此消息后,客户端将使用私钥解密,并将被揭示的随机字符串与先前谈判的会话ID相结合,然后生成此值的 MD5 哈希,并将其发送回服务器。

现在你已经知道 SSH 是如何工作的,我们可以开始讨论一些示例来展示与 SSH 合作的不同方式。

生成和使用SSH密钥

本节将涵盖如何在客户端机器上生成SSH密钥,并将公共密钥分发到应该使用的服务器上。

创建 SSH 密钥对

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

可以使用多种加密算法来生成SSH密钥,包括RSA、DSA和ECDDSA。

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

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

此提示允许您选择存储您的 RSA 私钥的位置。 按ENTER,以将其保留为默认值,将其存储在用户主目录中的.ssh隐藏目录中。

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

下一个提示允许您输入任意长度的密码,以确保您的私钥。默认情况下,您将不得不输入您在这里设置的任何密码,每次您使用私钥,作为额外的安全措施。 请轻松点击输入,如果您不希望使用密码,请留下这个空格。 请记住,这将允许任何获得您私钥的控制权的人登录到您的服务器。

如果您选择输入密码,则在输入时不会显示任何内容,这是一个安全措施。

 1[secondary_label Output]
 2Your identification has been saved in /root/.ssh/id_rsa.
 3Your public key has been saved in /root/.ssh/id_rsa.pub.
 4The key fingerprint is:
 58c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
 6The key's randomart image is:
 7+--[ RSA 2048]----+
 8|                 |
 9|                 |
10|                 |
11|       +         |
12|      o S   .    |
13|     o   . * +   |
14|      o + = O .  |
15|       + = = +   |
16|      ....Eo+    |
17+-----------------+

此程序生成了一对 RSA SSH 密钥对,位于用户主目录中的.ssh隐藏目录中。

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

生成一对具有较大的位数的 SSH 密钥对

SSH 密钥的默认值为 2048 位,这通常被认为是足够的安全性,但您可以为更硬化的密钥指定更多的位数。

要做到这一点,请将 -b 参数包含在您想要的位数中。大多数服务器支持长度至少为 4096 位的密钥。

1ssh-keygen -b 4096

如果您以前创建了不同的密钥,您将被问及是否要重写以前的密钥:

1Overwrite (y/n)?

如果您选择,您的以前的密钥将被重写,您将不再能够使用该密钥登录服务器。

删除或更改私钥上的密码

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

<$>[注] :要更改或删除密码,您必须知道原始密码。如果您丢失了密码的密码,则没有回复,您将需要生成新密码对

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

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

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

1Enter old passphrase:

输入您想要更改的旧密码,然后您将被提示使用新的密码:

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

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

SSH密钥指纹显示

每个SSH密钥对共享一个单一的加密指纹,可以用来独特地识别密钥,这可以在各种情况下是有用的。

要查找 SSH 密钥的指纹,键入:

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

您可以按ENTER,如果这是密钥的正确位置,否则输入修订的位置. 您将收到包含密钥的位长、指纹、其创建的帐户和主机以及使用的算法的字符串:

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

将您的公共 SSH 密钥复制到使用 SSH-Copy-ID 的服务器

要将您的公共密钥复制到服务器上,允许您在没有密码的情况下进行身份验证,可以采取若干方法。

如果您目前对服务器配置了基于密码的SSH访问,并且安装了ssh-copy-id实用程序,则这是一个简单的过程。

如果你有这个选项,你可以轻松地输入你的公共密钥:

1ssh-copy-id username@remote_host

这将提示您在远程系统上的用户帐户密码:

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

在输入密码后,您的 ~/.ssh/id_rsa.pub 密钥的内容将附加到用户帐户的 ~/.ssh/authorized_keys 文件的末尾:

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

您现在可以登录该帐户而没有密码:

1ssh username@remote_host

将公共 SSH 密钥复制到没有 SSH 复制 ID 的服务器

如果您没有可用的ssh-copy-id实用程序,但仍然可以使用基于密码的 SSH 访问远程服务器,您可以以不同的方式复制公共密钥的内容。

您可以输出密钥的内容并将其输入到ssh命令中. 在远程侧,您可以确保~/.ssh目录存在,然后将输入的内容附加到~/.ssh/authorized_keys文件中:

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

您将被要求提供远程帐户的密码:

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

输入密码后,您的密钥将被复制,允许您在没有密码的情况下登录:

1ssh username@remote_IP_host

手动将公共 SSH 密钥复制到服务器

如果您没有基于密码的 SSH 访问,则必须手动将公共密钥添加到远程服务器中。

在本地计算机上,您可以通过键入查找公共密钥文件的内容:

1cat ~/.ssh/id_rsa.pub
1[secondary_label Output]
2ssh-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 网页控制台)。

在远程服务器上,创建~/.ssh目录,如果它还不存在:

1mkdir -p ~/.ssh

之后,您可以创建或附加到 ~/.ssh/authorized_keys 文件,键入:

1echo public_key_string >> ~/.ssh/authorized_keys

您现在应该能够在没有密码的情况下登录远程服务器。

基本连接指南

下面的部分将涵盖有关如何使用 SSH 连接到服务器的一些基本知识。

连接到远程服务器

要连接到远程服务器并在那里打开壳会话,您可以使用ssh命令。

最简单的形式假定您在本地机器上的用户名与远程服务器上的用户名相同。

1ssh remote_host

如果您的用户名在远程服务器上不同,则需要这样传输远程用户名:

1ssh username@remote_host

第一次连接到新主机时,你会看到一个看起来像这样的消息:

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

输入以接受远程主机的真实性。

如果您正在使用密码身份验证,您将被提示为远程帐户的密码在这里. 如果您正在使用SSH密钥,您将被要求为您的私钥的密码句如果设置,否则您将自动登录。

在远程服务器上运行单一命令

若要在远程服务器上运行单个命令,而不是生成壳会话,则可以将命令添加到连接信息后,如下:

1ssh username@remote_host command_to_run

这将连接到远程主机,使用您的凭证进行身份验证,并执行您指定的命令。

登录到具有不同端口的服务器

默认情况下,服务器上的 SSH 驱动器在端口 `22′ 上运行. 您的 SSH 客户端将假设在尝试连接时是这样。

您可以通过-p选项来指定端口号:

1ssh -p port_num username@remote_host

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

通过键入编辑或创建现在的文件:

1nano ~/.ssh/config

在这里,您可以设置主机特定的配置选项. 若要指定新端口,请使用如下格式:

1[label ~/.ssh/config]
2Host remote_alias
3    HostName remote_host
4    Port port_num

这将允许您在命令行上没有指定特定端口号的登录。

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

如果您在私人 SSH 密钥上有密码,您将被要求每次使用密码连接到远程主机时输入密码。

为了避免重复这样做,您可以运行一个SSH代理程序. 此小型实用程序在您第一次输入密码后存储您的私钥. 它将可用于终端会话的持续时间,允许您在未来连接,而无需重新输入密码。

如果您需要转发您的 SSH 凭证(稍后显示)。

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

1eval $(ssh-agent)
1[secondary_label Output]
2Agent pid 10891

这将启动代理程序并将其放置在背景中,现在,您需要将您的私钥添加到代理程序中,以便它可以管理您的密钥:

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

之后,你的身份文件被添加到代理,允许你使用你的密钥登录,而无需再次输入密码。

将您的 SSH 凭证传输到服务器上使用

如果您希望能够在没有密码的情况下连接到另一个服务器中的一个服务器,则需要传输您的SSH密钥信息,这将允许您通过您连接的服务器通过本地计算机上的凭证来验证到另一个服务器。

要开始,您必须启动您的 SSH 代理,并将您的 SSH 密钥添加到代理(见前面)。完成后,您需要使用 -A 选项连接到您的第一个服务器。

1ssh -A username@remote_host

从这里,您可以 SSH 到您的 SSH 密钥授权访问的任何其他主机. 您将连接,仿佛您的私人 SSH 密钥位于该服务器上。

服务器侧配置选项

本节包含一些常见的服务器端配置选项,可以塑造服务器响应的方式以及允许哪些类型的连接。

禁用密码身份验证

如果您的 SSH 密钥已配置、测试并正常工作,则可能有必要禁用密码身份验证,从而防止任何用户使用密码登录 SSH。

要做到这一点,请连接到远程服务器,并打开带 root 或 sudo 特权的 /etc/ssh/sshd_config 文件:

1sudo nano /etc/ssh/sshd_config

在文件内部,搜索PasswordAuthentication指令. 如果它被评论了,请放弃评论。 将其设置为,以禁用密码登录:

1[label /etc/ssh/sshd_config]
2PasswordAuthentication no

完成更改后,保存并关闭文件. 要执行更改,您应该重新启动 SSH 服务。

在 Ubuntu/Debian 上:

1sudo service ssh restart

关于CentOS/Fedora:

1sudo service sshd restart

现在,系统上的所有帐户都无法使用 SSH 登录使用密码。

更改 SSH Daemon 运行的端口

一些管理员建议您更改SSH运行的默认端口,这可以帮助减少您的服务器通过自动机器人进行的身份验证尝试数量。

要更改 SSH 示威者倾听的端口,您需要登录您的远程服务器。在远程系统上打开sshd_config文件,使用 root 权限,通过登录该用户或使用sudo:

1sudo nano /etc/ssh/sshd_config

一旦你在里面,你可以通过找到Port 22规格来更改SSH所运行的端口,并修改它以反映你想要使用的端口。

1[label /etc/ssh/sshd_config]
2#Port 22
3Port 4444

完成后保存并关闭文件. 要执行更改,您必须重新启动 SSH DAEMON。

在 Ubuntu/Debian 上:

1sudo service ssh restart

关于CentOS/Fedora:

1sudo service sshd restart

戴蒙重新启动后,您需要通过指定端口号进行身份验证(在早期部分中展示)。

限制可以通过SSH连接的用户数量

要明确限制能够通过 SSH 登录的用户帐户,您可以采取几个不同的方法,每个方法都涉及编辑 SSH daemon config 文件。

在您的远程服务器上,现在用 root 或 sudo 特权打开此文件:

1sudo nano /etc/ssh/sshd_config

指定允许登录的帐户的第一种方法是使用允许用户指令,在文件中搜索允许用户指令,如果一个不存在的话,在任何地方创建它,然后列出允许通过SSH登录的用户帐户:

1[label /etc/ssh/sshd_config]
2AllowUsers user1 user2

保存并关闭文件. 重新启动 DAEMON 来执行您的更改。

在 Ubuntu/Debian 上:

1sudo service ssh restart

关于CentOS/Fedora:

1sudo service sshd restart

如果您对组管理更满意,您可以使用AllowGroups指令,如果是这样的情况,只需添加一个应该允许SSH访问的组(我们会创建这个组并暂时添加会员):

1[label /etc/ssh/sshd_config]
2AllowGroups sshmembers

保存并关闭文件。

现在,您可以创建一个系统组(没有主目录),通过键入匹配您指定的组:

1sudo groupadd -r sshmembers

请确保您将所需的用户帐户添加到该组中。

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

现在,重新启动SSH DAEMON来实现您的更改。

在 Ubuntu/Debian 上:

1sudo service ssh restart

关于CentOS/Fedora:

1sudo service sshd restart

关闭 root 登录

通常建议在设置具有sudo特权的SSH用户帐户后,通过SSH完全禁用根登录。

要做到这一点,请在远程服务器上打开root 或 sudo 的 SSH daemon 配置文件。

1sudo nano /etc/ssh/sshd_config

内部,搜索一个名为PermitRootLogin的指令. 如果它被评论,不要评论它. 改变值为:

1[label /etc/ssh/sshd_config]
2PermitRootLogin no

保存并关闭文件. 若要执行更改,请重新启动 SSH 示范器。

在 Ubuntu/Debian 上:

1sudo service ssh restart

关于CentOS/Fedora:

1sudo service sshd restart

允许特定命令的根访问

有某些情况下,您可能希望在一般情况下禁用 root 访问,但要允许某些应用程序正确运行,请启用它。

这可以通过 root 用户的 'authorized_keys' 文件来完成,该文件包含授权使用帐户的 SSH 密钥。

添加您想要用于此过程的本地计算机的密钥(我们建议为每个自动过程创建一个新的密钥)到根用户在服务器上的authorized_keys文件中。

1ssh-copy-id root@remote_host

现在,登录远程服务器,我们需要调整在autorized_keys文件中的输入,所以用 root 或 sudo 访问打开它:

1sudo nano /root/.ssh/authorized_keys

在上传的密钥的行开始时,添加一个command=列表,该列表定义了该密钥有效的命令。

1[label /root/.ssh/authorized_keys]
2command="/path/to/command arg1 arg2" ssh-rsa ...

保存并关闭文件,当你完成。

现在,打开使用 root 或 sudo 特权的 sshd_config 文件:

1sudo nano /etc/ssh/sshd_config

查找PermitRootLogin指令,然后将值更改为仅强迫命令

1[label /etc/ssh/sshd_config]
2PermitRootLogin forced-commands-only

保存并关闭文件. 重新启动 SSH 示范器来执行您的更改。

在 Ubuntu/Debian 上:

1sudo service ssh restart

关于CentOS/Fedora:

1sudo service sshd restart

将应用程序X显示给客户

SSH DAEMON 可以配置为自动将服务器上的 X 应用程序的显示转发到客户端机器,以便此操作正确,客户端必须配置并启用 X 窗口系统。

要启用此功能,请登录您的远程服务器并以 root 或 sudo 特权编辑 sshd_config 文件:

1sudo nano /etc/ssh/sshd_config

寻找X11Forwarding指令. 如果它被评论了,请删除评论. 如果需要,创建它并将值设置为:

1[label /etc/ssh/sshd_config]
2X11Forwarding yes

保存并关闭文件. 重新启动您的 SSH 示威器以实现这些更改。

在 Ubuntu/Debian 上:

1sudo service ssh restart

关于CentOS/Fedora:

1sudo service sshd restart

要连接到服务器并传递应用程序的显示,您必须在连接时通过客户端的-X选项:

1ssh -X username@remote_host

通过此会话在服务器上启动的图形应用程序应显示在本地计算机上。性能可能有点慢,但在点击时非常有用。

客户端配置选项

在下一节中,我们将专注于您可以在连接的客户端进行的一些调整。

定义服务器特定的连接信息

在本地计算机上,您可以为您连接的某些或所有服务器定义个别配置,这些配置可以存储在 ~/.ssh/config 文件中,您的 SSH 客户端每次呼叫时都会读取。

在本地计算机上的文本编辑器中创建或打开此文件:

1nano ~/.ssh/config

在内部,您可以通过输入每个具有主机的关键字来定义个别配置选项,然后是名称。

1man ssh_config

一个例子配置将是:

1[label ~/.ssh/config]
2Host testhost
3    HostName your_domain
4    Port 4444
5    User demo

然后,您可以使用用户名demo在端口4444上连接到your_domain,简单地键入:

1ssh testhost

您也可以使用野牌来匹配多个主机. 请记住,后续的比赛可能会超过以前的比赛. 因此,您应该把最一般的比赛放在顶部. 例如,您可以默认设置所有连接以防止 X 转发,并将your_domain转移到您的文件中:

1[label ~/.ssh/config]
2Host *
3    ForwardX11 no
4
5Host testhost
6    HostName your_domain
7    ForwardX11 yes
8    Port 4444
9    User demo

保存并关闭文件,当你完成。

保持连接活跃以避免时间流逝

如果您在准备之前发现自己已经从 SSH 会话中断开连接,那么您的连接可能已经过时。

您可以配置您的客户端每一次发送一个包到服务器,以避免这种情况:

在本地计算机上,您可以通过编辑您的 ~/.ssh/config 文件对每个连接进行配置。

1nano ~/.ssh/config

如果一个已经不存在,在文件的顶部,定义一个将匹配所有主机的部分. 将ServerAliveInterval设置为120以每两分钟发送一个包到服务器。

1[label ~/.ssh/config]
2Host *
3    ServerAliveInterval 120

保存并关闭文件,当你完成。

主持人 检查

默认情况下,每次连接到新服务器时,都会显示远程 SSH DAEMON 主机密钥的指纹。

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

此配置以便您可以验证您正在尝试连接的主机的真实性,并发现恶意用户可能试图伪装为远程主机的实例。

在某些情况下,您可能希望禁用此功能。 ** 注意**:这可能是一个很大的安全风险,所以请确保您知道如果将系统设置为此,您正在做什么。

要进行更改,请在本地计算机上打开 ~/.ssh/config 文件:

1nano ~/.ssh/config

如果一个已经不存在,在文件的顶部,定义一个将匹配所有主机的部分。设置StrictHostKeyChecking指令为,自动将新主机添加到已知_hosts文件中。

1[label ~/.ssh/config]
2Host *
3    StrictHostKeyChecking no
4    UserKnownHostsFile /dev/null

您可以通过逆转其他主机的这些选项以个案为基础启用检查,因此StrictHostKeyChecking的默认设置为Ask:

1[label ~/.ssh/config]
2Host *
3    StrictHostKeyChecking no
4    UserKnownHostsFile /dev/null
5
6Host testhost
7    HostName your_domain
8    StrictHostKeyChecking ask
9    UserKnownHostsFile /home/demo/.ssh/known_hosts

通过单个 TCP 连接进行 SSH 多重复合

有些情况下,建立新的 TCP 连接可能比您想要的更长时间. 如果您正在对同一台机器进行多个连接,您可以利用重叠。

SSH 重复使用相同的 TCP 连接用于多个 SSH 会话. 这消除了建立新会话所需的一些工作,可能加速事情。

要设置重叠,您可以手动设置连接,或者您可以配置客户端在可用时自动使用重叠。

要配置重叠,请在本地计算机上编辑 SSH 客户端的配置文件:

1nano ~/.ssh/config

如果您尚未在文件的顶部有一个 wildcard 主机定义,请现在添加一个(作为主机 *)我们将设置ControlMaster,ControlPathControlPersist值来建立我们的重叠配置。

ControlMaster应设置为自动,以便在可能的情况下自动允许重叠。 ControlPath将确定控制接口的路径。第一个会话将创建这个接口,后来的会话将能够找到它,因为它被标记为用户名、主机和端口。

ControlPersist选项设置为1将允许初始主连接进行背景化。1规定,在最后一个SSH会话关闭后,TCP连接应自动终止一秒:

1[label /.ssh/config]
2Host *
3    ControlMaster auto
4    ControlPath ~/.ssh/multiplex/%r@%h:%p
5    ControlPersist 1

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

1mkdir ~/.ssh/multiplex

现在,在同一台机器上建立的任何会话都将尝试使用现有的接口和TCP连接。

如果出于某种原因,您需要暂时绕过重叠配置,您可以通过通过-S标志通过:

1ssh -S none username@remote_host

设置SSH隧道

通过安全的SSH隧道隧道隧道其他流量是处理限制性防火墙设置的好方法,也是加密其他未加密的网络流量的好方法。

将本地隧道配置到服务器

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

局部连接是通过远程主机从本地计算机访问网络位置的一种方式. 首先,建立了 SSH 连接到远程主机. 在远程服务器上,连接到用户提供的外部(或内部)网络地址,并将该位置的流量隧道到您的本地计算机在指定端口。

这通常被用来通过绕过防火墙来隧道到一个不太受限制的网络环境,另一种常见的用途是从远程位置访问一个本地主机的网页接口。

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

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

我们还将使用-f旗,导致SSH在执行之前进入背景,以及-N旗,不会打开壳或在远端执行程序。

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

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

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

更一般的语法指南是:

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

由于连接处于后台,您将不得不找到它的PID来杀死它. 您可以通过搜索您转发的端口来做到这一点:

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

然后,您可以通过瞄准 PID 来杀死该过程,这是与 SSH 命令匹配的行第二列中的数字:

1kill 5965

另一种选择是启动连接 without the -f flag. 这将使连接保持在前沿,阻止您在转发期间使用终端窗口. 此项的好处是您可以通过键入 CTRL-C轻松杀死隧道。

将远程隧道配置到服务器

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

在远程隧道中,连接到远程主机。在创建隧道时,指定一个 remote 端口. 在远程主机上,该端口将被隧道到由本地计算机连接的主机和端口组合。

如果防火墙允许网络连接 out,这将允许您将连接到远程机器和隧道流量从该机器到内部网络的位置。

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

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

我们还将使用-f旗,使SSH在执行之前进入背景,以及-N旗,不会打开壳或在远端执行程序。

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

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

现在,在远程主机上,打开一个网页浏览器到127.0.0.1:8888将允许您在端口80上查看任何内容。

更一般的语法指南是:

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

由于连接处于后台,您将不得不找到它的PID来杀死它. 您可以通过搜索您转发的端口来做到这一点:

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

然后,您可以通过瞄准与您的 SSH 命令匹配的行中的 PID,即第二列中的数字来杀死该过程:

1kill 5965

另一种选择是启动连接 without the -f flag. 这将使连接保持在前沿,阻止您在转发期间使用终端窗口. 此项的好处是您可以通过键入 CTRL-C轻松杀死隧道。

将动态隧道配置到远程服务器

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

一个动态隧道与一个本地隧道相似,因为它允许本地计算机通过远程主机连接到其他资源。一个动态隧道通过简单地指定一个本地端口来做到这一点。

传送到本地端口的流量将发送到远程主机,从那里,SOCKS协议将被解释为建立连接到所需的终端位置,此设置允许SOCKS功能的应用程序通过远程服务器连接到任何数量的位置,而无需多个静态隧道。

为了建立连接,我们将通过-D旗和我们想要进入隧道的当地端口,我们还将使用-f旗,这会导致SSH在执行之前进入背景,以及-N旗,这不会打开壳或在远程执行程序。

例如,要在端口「7777」建立隧道,您可以键入:

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

从这里,您可以开始将 SOCKS-aware 应用程序(如 Web 浏览器)指向您选择的端口,该应用程序将其信息发送到与端口相关的接口中。

将流量导向到 SOCKS 端口的方法取决于应用程序。例如,在 Firefox 中,一般的位置是 Preferences > Advanced > Settings > Manual proxy configurations. 在 Chrome 中,您可以使用 --proxy-server= 旗帜设置启动应用程序。

由于连接处于后台,您将不得不找到它的PID来杀死它. 您可以通过搜索您转发的端口来做到这一点:

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

然后,您可以通过瞄准与您的 SSH 命令匹配的行中的 PID,即第二列中的数字来杀死该过程:

1kill 5965

另一种选择是启动连接 without the -f flag. 这将使连接保持在前沿,阻止您在转发期间使用终端窗口. 此项的好处是您可以通过键入 CTRL-C轻松杀死隧道。

使用SSH逃避代码来控制连接

即使在建立 SSH 会话后,也可以从终端内部对连接进行控制,我们也可以使用所谓的 SSH 逃避代码来控制连接,这些代码允许我们在会话中与本地 SSH 软件进行交互。

强制脱离客户端(如何退出僵局或冻结会话)

OpenSSH中最有用的功能之一,在很大程度上没有被注意到,是能够从内部控制会话的某些方面。

这些命令可以从 SSH 会话中的~控制字符开始执行,如果它们是新行后输入的第一件事,则只能解释控制命令,因此在使用新行之前始终按 Enter 一个或两次。

最有用的控制方法之一是启动从客户端断开连接的能力. SSH 连接通常被服务器关闭,但如果服务器出现问题或连接被打破,这可能是一个问题。

若要关闭来自客户端的连接,请使用控制字符(~),用点点。如果您的连接出现问题,您很可能会处于看似被困的终端会话中。

1[ENTER]
2~.

连接应立即关闭,将您返回本地壳会话。

将 SSH 会话放入背景

OpenSSH中最有用的功能之一,在很大程度上没有被注意到,是能够从连接内部控制会话的某些方面。

这些命令可以从 SSH 连接中执行,从~控制字符开始执行,如果它们是新行后输入的第一件事,则只能解释控制命令,因此在使用新行之前始终按ENTER一两次。

要做到这一点,我们需要提供控制字符(~),然后执行传统的键盘快捷键来背景一个任务(CTRL-z):

1[ENTER]
2~[CTRL-z]

这将将连接放入背景,将您返回本地壳会话. 要返回 SSH 会话,您可以使用传统的任务控制机制。

您可以通过键入以下方式立即重新激活最近的背景任务:

1fg

如果您有多个背景任务,您可以通过键入查看可用的工作:

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

然后,您可以将任意任务带到前台,使用第一个列中的指数以百分比符号:

1fg %2

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

OpenSSH中最有用的功能之一,在很大程度上没有被注意到,是能够从连接内部控制会话的某些方面。

这些命令可以从 SSH 连接中执行,从~ 控制字符开始执行,如果它们是新行后输入的第一件事,则只能解释控制命令,因此在使用新行之前始终按 Enter 一个或两次。

这允许用户在连接已经建立后更改端口转发配置,这允许您在飞行中创建或拆除端口转发规则。

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

1[ENTER]
2~C
1ssh>

您将收到一个SSH命令提示,该命令具有非常有限的有效命令组. 要查看可用的选项,您可以从这个提示键入 -h。 如果没有返回,您可能需要通过使用 ~v`几次来增加您的SSH输出的语音性:

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

正如您所看到的,您可以轻松地使用相应的选项实现任何的转发选项(参见转发部分以获取更多信息)。您还可以使用与转发类型字母前的K指定的相关杀死命令来摧毁隧道。

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

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

您的本地计算机上的端口8888现在将能够与您正在连接的主机上的 Web 服务器进行通信。

1[ENTER]
2~C
3-KL 8888

结论

上面的指示应该涵盖大多数用户每天需要的有关SSH的信息. 如果您有其他提示或希望分享您最喜欢的配置和方法,请自由使用下面的评论。

Published At
Categories with 技术
comments powered by Disqus