跳转到内容

OpenSSH/Cookbook/客户端配置文件

100% developed
来自维基教科书,开放世界中的开放书籍

 

SSH 客户端配置文件

[编辑 | 编辑源代码]

客户端配置文件的使用,ssh_config(5),可能是最被低估和未被认识的功能,尽管它具有很大的实用性和灵活性。配置文件可用于通过应用指定设置来创建特定系统或场景的快捷方式。客户端,ssh(1),优先考虑作为运行时选项在命令行中应用的设置。然后应用用户自己的配置文件中的设置,通常是 ~/.ssh/config。最后,如果存在,将应用全局客户端设置,通常来自系统范围的配置文件 /etc/ssh/ssh_config。因此,正如在关于 客户端配置文件 的章节中提到的,优先级如下

  1. 通过 shell 的运行时参数
  2. 用户自己的配置
  3. 系统范围的配置

即使在用户的配置文件和系统的全局配置文件中,也是应用第一个匹配的配置。因此,特定配置必须始终位于文件开头,而更通用的设置则位于文件末尾。

SSH 客户端配置基础

[编辑 | 编辑源代码]

配置文件中的每个节都以 HostMatch 指令开头。然后应用节中的指令(如果相关)。稍后将详细介绍 Match。下面两个主机都使用基本的 Host 指令设置了各自的快捷方式。两个主机的设置之后是两个更通用的节,适用于两个完整的域。最后是一个应用 IdentitiesOnly 到所有传出连接的节。

Host www
        HostName www.example.org
        User fred
        IdentityFile %d/.ssh/fred.www.key

Host git
        HostName git.example.org
        User paz
        IdentityFile %d/.ssh/paz.git.key

Host *.example.org
        ConnectTimeout 2
        AddKeysToAgent yes

Host *.example.com
        ConnectTimeout 5
        Port 2022

Host *
        IdentitiesOnly yes

特定配置首先出现,并变得越来越通用,直到最后应用 IdentitiesOnly 到所有传出会话。example.org 域中的主机使用默认的 SSH 端口 22,而 example.com 域中的主机使用端口 2022 覆盖了默认端口。使用 example.org 域时,密钥会自动添加到代理,而使用 example.com 域时则不会。

可以使用 ssh www 访问第一个主机,使用 ssh git 访问第二个主机。一般来说,最好设置 IdentitiesOnly,以便在身份验证时只尝试指定的密钥。否则,密钥将按其在代理中发现的顺序尝试,这可能是不可预测的。如果没有 IdentitiesOnly,结果可能是连接因尝试登录次数过多而被阻止,甚至在尝试正确的密钥之前就被阻止。


多个快捷方式

[编辑 | 编辑源代码]

每个节都可以有多个快捷方式。

Host w www www.example.org
        HostName www.example.org
        User fred
        IdentityFile %d/.ssh/example.org-fred.ed25519

上面,可以使用 ssh wssh wwwssh www.example.org 访问同一个主机。

同一系统上不同帐户的不同密钥

[编辑 | 编辑源代码]

有时需要访问同一远程系统上的多个帐户,每个帐户都有一个单独的密钥。Match 块在 ssh_config(5) 中可以将每个帐户与其对应的密钥配对。

Match host www.example.org user git
        IdentityFile %d/.ssh/example.org-git.ed25519

Match host www.example.org user fred
        IdentityFile %d/.ssh/example.org-fred.ed25519

Match host www.example.org user backup
        IdentityFile %d/.ssh/example.org-backup.ed25519

Host www.example.org
        IdentitiesOnly yes
        AddKeysToAgent yes

上面,根据使用哪个帐户,不同的密钥将应用于同一个远程主机。

建立隧道后自动启动本地 VNC

[编辑 | 编辑源代码]

LocalCommand 指令可以在身份验证成功后启动本地程序。如果将其与其他指令结合使用,则有很多可能性。这里,一旦 VNC 隧道建立,客户端就会连接到它。

Host make-tunnel tunnel
        Hostname 198.51.100.120
        User tunneler
        IdentitiesOnly yes
        IdentityFile %d/.ssh/tunneler-vnc-tunnel
        LocalForward 5900 localhost:5900
        ExitOnForwardFailure yes
        PermitLocalCommand yes
        LocalCommand remmina -c vnc://127.0.0.1:0

LocalForward 创建隧道,而 PermitLocalCommandLocalCommand 在隧道完成后将客户端连接到隧道。如果隧道失败,ExitOnForwareFailure 确保 SSH 会话结束,以便可以正确调查故障,而不是将客户端连接到空闲状态。

通过共同可访问的外部主机进行 VNC - 方法一

[编辑 | 编辑源代码]

通过一层或多层 NAT 进行网络连接可能是一个问题。尤其是在越来越多的服务提供商提供的传统 IPv4 网络中,载波级 NAT 变得越来越普遍的情况下。可以通过公共可访问的第三台机器在公共区域连接两个端点。如果有三台机器 A、B 和 C,其中 A 需要连接到 C,A 和 C 都无法直接连接到对方,但两者都可以访问主机 B,那么如果 A 和 C 都可以访问 B,就可以通过 B 建立隧道。A 和 C 都需要在 C 上拥有有效的帐户,即使只是为了转发。不需要完整的 shell 访问权限。

在主机 B 上,需要为 C 和 A 创建帐户。

在主机 C 上

Host hostc
        HostName server.example.com
        IdentityFile %d/.ssh/test-fw6b
        AddKeysToAgent yes
        RemoteForward 7900 localhost:5900
        RemoteForward 7901 localhost:5901

启动 VNC 服务器,然后让系统使用 ssh hostc 建立到主机 B 的 SSH 连接。主机 B 的配置实际上不需要修改,除非需要锁定隧道的密钥或其他限制。

在主机 A 上

Host tunnel
        LocalForward 5900 localhost:7900
        LocalForward 5901 localhost:7901
        PermitLocalCommand yes
        LocalCommand remmina -c vnc://127.0.0.1:0
        ExitOnForwardFailure yes

通过输入 ssh tunnel 启动 SSH 连接,Remmina 将通过主机 C 上的隧道自动连接到主机 C。

系统范围的客户端默认值

[编辑 | 编辑源代码]

系统范围的客户端配置文件 /etc/ssh/sshd_config 是一种提供实际上是新的本地默认设置的便捷方法。正如多次提到的,配置选项是根据第一个匹配的优先级应用的,因此任何系统范围的全局选项都应尽可能通用。当自定义本地环境时,系统范围的默认设置非常有用,包括通过 Kerberos 身份验证或甚至 基于主机的身份验证 等方式进行 LAN 访问,后者将在其自己的章节中介绍。

Host 172.16.4.*
        HostKeyAlias a.pool.example.org
        ConnectTimeout 4

Host 172.16.5.*
        HostKeyAlias b.pool.example.org
        ConnectTimeout 2

Host 172.16.*
        HostbasedAuthentication yes

Host *
        IdentitiesOnly yes

上面允许对特定子网进行基于主机的身份验证。它还全局设置 IdentitiesOnly

Host *.pool.example.org
        VerifyHostKeyDNS no
        GSSAPIAuthentication yes
        GSSAPIKeyExchange yes
        GSSPITrustDNS yes
        GSSAPIRenewalForcesRekey yes
        GSSAPIDelegateCredentials yes

上面为 pool.example.org 域中的所有系统设置了系统范围的选项,以便可以使用 Kerberos 身份验证。

有关 ssh_config(5) 的手册页有一个关于“令牌”的部分,这些令牌可以在节中用于代替系统信息,例如远程主机名、远程帐户名或本地帐户名等等。当在 /etc/ssh/ssh_config/etc/ssh/ssh_config.d/* 中为所有本地帐户设置系统范围的客户端配置文件时,这些令牌非常有用。

一些客户端配置指令可以使用令牌来代替某些值,这些值是在运行时确定的。

LocalCommand 接受所有令牌。

Hostname 接受令牌 %% 和 %h。

ProxyCommandProxyJump 接受令牌 %%、%h、%n、%p 和 %r。

CertificateFileControlPathIdentityAgentIdentityFileKnownHostsCommandLocalForwardMatch execRemoteCommandRemoteForwardRevokedHostKeysUserKnownHostsFile 接受令牌 %%、%C、%d、%h、%i、%j、%k、%L、%l、%n、%p、%r 和 %u。

KnownHostsCommand 还接受令牌 %%、%C、%d、%f、%H、%h、%I、%i、%j、%K、%k、%L、%l、%n、%p、%r、%t 和 %u。

客户端令牌的描述如下,与服务器配置中使用的令牌有所不同

OpenSSH 客户端配置令牌查找表
令牌 描述
%% 字面上的“%”。
%C %l%h%p%r%j 的哈希值。
%d 本地帐户的主目录。
%f 远程服务器主机密钥的指纹。
%H 搜索的known_hosts主机名或地址。
%h 远程主机名。
%I KnownHostsCommand执行的原因:当通过地址查找主机时为 ADDRESS(仅当CheckHostIP启用时),通过主机名搜索时为 HOSTNAME,或者准备用于目标主机的密钥算法偏好列表时为 ORDER。
%i 本地帐户的 UID。
%j ProxyJump 选项的内容,如果此选项未设置,则为空字符串。
%K 远程服务器主机密钥的 base64 编码。
%k 如果指定了主机密钥别名,则为别名,否则为命令行上给出的原始远程主机名。
%L 本地主机名。
%l 本地主机名,包括域名。
%n 原始远程主机名,如命令行中所给。
%p 远程端口。
%r 远程帐户名。
%T 如果请求了隧道转发,则分配的本地 tun(4)tap(4) 网络接口,否则为“NONE”。
%t 服务器主机密钥的类型,例如 ssh-ed25519。
%u 本地帐户名。

如往常一样,请查看所讨论系统上的 ssh_config(5),以了解已安装的 OpenSSH 版本实际支持的功能。

 

华夏公益教科书