OpenSSH/Cookbook/客户端配置文件
客户端配置文件的使用,ssh_config(5),可能是最被低估和未被认识的功能,尽管它具有很大的实用性和灵活性。配置文件可用于通过应用指定设置来创建特定系统或场景的快捷方式。客户端,ssh(1),优先考虑作为运行时选项在命令行中应用的设置。然后应用用户自己的配置文件中的设置,通常是 ~/.ssh/config。最后,如果存在,将应用全局客户端设置,通常来自系统范围的配置文件 /etc/ssh/ssh_config。因此,正如在关于 客户端配置文件 的章节中提到的,优先级如下
- 通过 shell 的运行时参数
- 用户自己的配置
- 系统范围的配置
即使在用户的配置文件和系统的全局配置文件中,也是应用第一个匹配的配置。因此,特定配置必须始终位于文件开头,而更通用的设置则位于文件末尾。
配置文件中的每个节都以 Host 或 Match 指令开头。然后应用节中的指令(如果相关)。稍后将详细介绍 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 w
、ssh www
或 ssh 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
上面,根据使用哪个帐户,不同的密钥将应用于同一个远程主机。
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 创建隧道,而 PermitLocalCommand 和 LocalCommand 在隧道完成后将客户端连接到隧道。如果隧道失败,ExitOnForwareFailure 确保 SSH 会话结束,以便可以正确调查故障,而不是将客户端连接到空闲状态。
通过一层或多层 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。
ProxyCommand 和 ProxyJump 接受令牌 %%、%h、%n、%p 和 %r。
CertificateFile、ControlPath、IdentityAgent、IdentityFile、KnownHostsCommand、LocalForward、Match exec、RemoteCommand、RemoteForward、RevokedHostKeys 和 UserKnownHostsFile 接受令牌 %%、%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。
客户端令牌的描述如下,与服务器配置中使用的令牌有所不同
令牌 | 描述 |
---|---|
%% | 字面上的“%”。 |
%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 版本实际支持的功能。