如何匹配 SSH 配置主机条目的 CIDR 范围?

faz*_*azy 33 ssh

我正在寻找一种方法来使用特定的 CIDR 块来匹配 SSH 客户端配置中的主机(通常是~/.ssh/config)。例如,如果 IP 落在某个范围内,我有一个条目可以通过堡垒主机转发所有流量,让我们说10.1.0.0/16

host 10.1.*
    proxycommand ssh -q bastion -W %h:%p
Run Code Online (Sandbox Code Playgroud)

这很有效,但是当我添加一些不完全符合点表示法的范围时呢?

# doesn't work, unfortunately
host 10.2.0.0/18
    proxycommand ssh -q bastion-foo -W %h:%p
host 10.2.64.0/18
    proxycommand ssh -q bastion-bar -W %h:%p
Run Code Online (Sandbox Code Playgroud)

手册中是否有我遗漏的内容,或者可以匹配这些主机 IP 范围的巧妙脚本技巧?

Jen*_*y D 29

与 ssh_config 文件中的模式匹配是作为基本模式匹配完成的,而不是网络/CIDR 匹配。所以使用 CIDR 表示法是行不通的。

手册页解释说:

模式由零个或多个非空白字符*(匹配零个或多个字符?的通配符)或(恰好匹配一个字符的通配符)组成。

您能做的最好的事情是使用包含多个模式的列表。再次,从手册页:

模式列表是以逗号分隔的模式列表。模式列表中的模式可以通过在它们前面加上感叹号 ( !)来否定。

因此,要覆盖您的两个 /18 网,您需要列出:

  • 所有主机匹配10.2.?.*(即 10.2.0.0–10.2.9.255)
  • 所有主机匹配10.2.??.*(即 10.2.10.0–10.2.99.255)
  • 所有主机匹配10.2.10?.*(即 10.2.100.0–10.2.109.255)
  • 所有主机匹配10.2.11?.*(即 10.2.110.0–10.2.119.255)
  • 所有主机匹配10.2.12?.*EXCEPT 匹配10.2.128.*和的主机10.12.129.*(并记住排除必须先出现!)

您的模式列表应如下所示:

Host "10.2.?.*","10.2.??.*", "10.2.10?.*","10.2.11?.*","!10.2.128.*","!10.2.129.*","10.2.12?.*"
Run Code Online (Sandbox Code Playgroud)

  • 准确地说,这不是正则表达式,而是通配符。 (4认同)
  • 感谢您的回答,它几乎对我有用,但我实际上需要用单独的“主机”条目来区分这两个范围。它还需要单独引用每一项(ssh/Mac)。我能找到的最短的:`host "10.2.?.*", "10.2.??.*", "!10.2.64*", "!10.2.65*", "!10.2.66*", "! 10.2.67*", "!10.2.68*", "!10.2.69*", "!10.2.7*", "!10.2.8*", "!10.2.9*"` 和 `host " 10.2.??.*", "10.2.10?.*", "10.2.11?.*", "10.2.12?.*", "!10.2.1?.*", "!10.2.2 ?.*", "!10.2.3?.*", "!10.2.4?.*", "!10.2.5?.*", "!10.2.60.*", "!10.2.61. *", "!10.2.62.*", "!10.2.63.*", "!10.2.128.*", "!10.2.129.*"` (2认同)

Ale*_*ies 9

您可以将非常强大的Match指令grepcidr工具一起使用:

Match exec "grepcidr 10.2.0.0/18 <(echo %h) &>/dev/null"
   Proxycommand ssh -q bastion-foo -W %h:%p
Run Code Online (Sandbox Code Playgroud)

这是如何运作的:

  • %h命令行中的内容扩展为主机名(请参阅令牌
  • <(echo %h)将其包装到临时“文件”中
  • <(dig +short %h)如果使用主机名,可能会使用
  • 然后使用abcd/e 来grepcidr匹配主机名%h
  • &>/dev/null因为我们只关心返回码,而不关心输出。

这需要额外的小grepcidr 包,它应该存在于您的包管理器中。