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

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

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

host 10.1.*
    proxycommand ssh -q bastion -W %h:%p

这非常有效,但是当我添加一些不完全适合点符号的范围时该怎么办?

# 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

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

答案1

与 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?.*,除了匹配的主机之外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?.*"

答案2

你可以使用非常强大的Match指示grepcidr工具:

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

工作原理:

  • %h在命令行中扩展为主机名(参见代币
  • <(echo %h)将其包装到临时“文件”中
  • <(dig +short %h)如果使用主机名,也许可以使用
  • 然后使用grepcidr匹配主机名%habcd/e
  • &>/dev/null因为我们只关心返回代码,而不是输出。

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

答案3

关注http://bugzilla.mindrot.org/show_bug.cgi?id=1169最终可能会为此提供一种机制。

相关内容