我正在寻找一种使用特定 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 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
匹配主机名%h
abcd/e &>/dev/null
因为我们只关心返回代码,而不是输出。
这需要额外的微小grepcidr 包,它应该存在于你的包管理器中。
答案3
关注http://bugzilla.mindrot.org/show_bug.cgi?id=1169最终可能会为此提供一种机制。