我正在寻找一种方法来使用特定的 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)
您可以将非常强大的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)
如果使用主机名,可能会使用grepcidr
匹配主机名%h
&>/dev/null
因为我们只关心返回码,而不关心输出。这需要额外的小grepcidr 包,它应该存在于您的包管理器中。