在 ssh 配置中,“匹配规范全部”是什么意思?

在 ssh 配置中,“匹配规范全部”是什么意思?

我想CanonicalizeHostname在我的 ssh 配置中使用它,这样就可以添加和删除主机,而无需编辑文件。

Host bastion
    ProxyJump none

Match canonical
    ProxyJump bastion
    ForwardAgent yes

Host *
    ForwardAgent no
    CanonicalizeHostname always
    CanonicalDomains mydomain.co.uk
    CanonicalizeMaxDots 0
    CanonicalizeFallbackLocal yes

ssh-agent 没有被转发到我的任何服务器。如果我将ForwardAgent其更改Host *为“是”,那么它将被转发。因为ForwardAgent下面Match canonical没有被解析,所以我认为存在错误,并向 OpenSSH 做了报告(该报告已被删除)。

有人向我解释说它正在按预期工作:

启用主机名规范化后,配置将被解析两次。初始阶段收集选项,然后在主机名最终确定后进行第二阶段。大多数配置选项都是“首场比赛获胜”

所以这里发生的事情是,在第一次传递时,您的“Host *”块正在被解析,并且 ForwardAgent 选项被设置为“no”。在后续传递中,“Match canonical”块中的 ForwardAgent 指令将被忽略,因为它已经设置。

我能理解。我知道它被解析了两次并CanonicalizeHostname启用了,但我没有意识到这样做的结果。

我不明白的是避免这种情况的方法“仅在最后一次设置后备 ForwardAgent”:

Host bastion
    ProxyJump none

Match canonical
    ProxyJump bastion
    ForwardAgent yes

Match all
    CanonicalizeHostname always
    CanonicalDomains mydomain.co.uk
    CanonicalizeMaxDots 0
    CanonicalizeFallbackLocal yes

Match canonical all
    ForwardAgent no

我的问题:

  • 与有何Match All不同Host *

  • 这是什么Match canonical all意思?当已经以不同的方式为规范主机设置了该选项时,为什么会指示规范主机再次解析该选项?如果是的话,!canonical这对我来说会更有意义,尽管看起来是多余的,因为在这种情况下,它下面的单个指令已经被设置了。

我还有很多其他选项要添加,这些选项大部分都在下面Host *并且与 无关CanonicalizeHostname,所以我将它们遗漏了,但现在我不知道将它们放在哪里。

答案1

您可以创建仅适用于特定主机子集的配置块。 Match all 块匹配所有主机,相当于 Host *。

Match Canonical All 块适用于所有已进行规范化的主机。

使用 Match canonical all 而不是 Match !canonical 可确保配置选项仅应用于已进行规范化的主机,而不应用于已指定显式主机名的主机。

默认为全部匹配。如果您想在所有主机上应用选项,无论是否进行规范化,请选择该选项。如果您只想将其应用于进行规范化的主机,请在下面创建额外的匹配块,指定您的选项允许的内容

ssh 客户端连接到主机并确定第一个匹配的配置文件。如果有多个匹配文件,则第一个匹配的 Host 或 Match 块中的选项优先。

为了使 CanonicalizeHostname 选项正常工作,您必须启用双通解析模式。在每次解析过程中,都会针对配置文件中的每个主机名评估过滤器和匹配块。首先评估过滤器,然后评估匹配块。

您可以根据匹配块的预期范围向其添加选项。如果该选项适用于所有主机,请将其放置在全部匹配下。如果它仅适用于已进行规范化的主机,请使用这些选项创建一个新的 Match 块并相应地应用它们。

资料来源:

OpenSSH 中的主机名规范化

关于 OpenSSH 可选主机名规范化的一些注释

如何执行主机名规范化

主持人 将以下声明(直到下一个 Host 或 Match 关键字)限制为仅适用于与关键字后给定的模式之一匹配的主机。如果提供了多个模式,则应使用空格分隔它们。单个“*”作为模式可用于为所有主机提供全局默认值。主机通常是命令行上给出的主机名参数(有关例外情况,请参阅 CanonicalizeHostname 关键字)。可以通过在模式条目前加上感叹号(“!”)来否定模式条目。如果匹配否定条目,则忽略主机条目,无论该行上的任何其他模式是否匹配。因此,否定匹配对于提供通配符匹配的例外很有用。有关模式的更多信息,请参阅模式。

ssh_config(5) — Linux 手册页

例子:

# Match on hostname
Match Host example.com

# Match ip
Match Address 192.168.178.*

# Match on user
Match User alice

# Match based on group
Match Group admin

# Multiple criteria
Match Host example.com User alice

# Match multiple criteria, use this key for some hosts
Match canonical,Host host.domain.cocom,192.168.178.100
IdentityFile ~/.ssh/my_key

# Match multiple criteria, disable port forwarding for some hosts
Match canonical,Host *.domain.com,*.internal,192.168.178.*
ForwardAgent no
ForwardX11 no
CanonicalizeHostname yes
CanonicalDomains example.org example.com
CanonicalizeMaxDots 1
CanonicalizeFallbackLocal yes
CanonicalizePermittedCNAMEs *.redis.example.org:redis.example.com

Match All 与 Host * 有何不同?

Host * 匹配所有主机,因此后面的配置指令将应用于所有主机。主机名可以出现在您使用的模式中的任何位置(作为模式本身的一部分,或者出现在星号后面)。

“Match All”关键字用于对适用于特定主机的所有配置指令进行分组。当您使用“Match All”时,您不需要指定模式,因为它默认会匹配所有主机。

例子:

Host *
   <config directives>
Host *
   StrictHostKeyChecking no
Match All
   <config directives>
Match All
   Compression yes

匹配规范全部是什么意思?当已经以不同的方式为规范主机设置了该选项时,为什么会指示规范主机再次解析该选项?如果它是 !canonical,它对我来说会更有意义,尽管看起来是多余的,因为在这种情况下,它下面的单个指令已经被设置了。

Match canonical all 是一个配置选项,适用于所有规范主机,这些主机的名称可以通过 DNS 域名搜索算法完全限定。 SSH 中的“canonical”关键字意味着主机名必须是完全限定的,而不是主机名的别名或缩写版本。关于问题的第二部分,如果使用特定指令为主机设置配置选项,并且该主机与具有相同选项的“匹配”块相匹配

“Match canonical all”适用于所有规范主机,如果主机同时匹配特定指令和具有相同选项的“Match”块,则“Match”块优先。这 ”!” “!canonical”中的意思是“不规范”。因此,“Match !canonical”适用于无法通过 DNS 域名搜索算法完全限定的非规范主机

规范主机匹配选项可以在每个主机的基础上使用。如果主机在 DNS 区域文件中列出、具有使用 iproute2 配置的地址并在同一网络设备的接口之间路由数据包,则该主机匹配。如果主机不满足这些条件,则它不符合规范

在 SSH 中启用 CanonicalizeHostname 选项时,远程主机的主机名将被解析两次:第一次是在建立连接时,第二次是当 SSH 客户端应用具有 CanonicalizeHostname 指令的任何 Match 块时。如果您有一个包含适用于规范主机的 CanonicalizeHostname 指令的 Match 块,则该主机的名称将被解析两次,并且 Match 块中的配置选项将优先于之前设置的任何特定指令。

相关内容