Como posso combinar um intervalo CIDR para uma entrada do host de configuração SSH?


22

Estou procurando uma maneira de usar blocos CIDR específicos para corresponder aos hosts na configuração do cliente SSH (geralmente ~/.ssh/config). Por exemplo, eu tenho uma entrada para encaminhar todo o tráfego através de um host bastião, se o IP cair em um determinado intervalo, digamos 10.1.0.0/16:

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

Isso funciona muito bem, mas e quando adiciono alguns intervalos que não se encaixam exatamente na notação de ponto?

# 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

Há algo no manual que eu perdi ou um truque inteligente de script que permitiria corresponder esses intervalos de IP do host?

Respostas:


24

A correspondência com os padrões no arquivo ssh_config é feita como correspondência básica de padrões, não como correspondência de rede / CIDR. Portanto, o uso da notação CIDR não funcionará.

A página do manual explica que:

Um padrão consiste em zero ou mais caracteres que não sejam espaços em branco *(um curinga que corresponde a zero ou mais caracteres) ou ?(um curinga que corresponde exatamente a um caractere).

O melhor que você pode fazer é usar uma lista de mais de um padrão. Novamente, na página do manual:

Uma lista de padrões é uma lista de padrões separados por vírgula. Os padrões nas listas de padrões podem ser negados precedendo-os com um ponto de exclamação ( !).

Então, para cobrir suas duas / 18 redes, você precisa listar:

  • todos os hosts correspondentes 10.2.?.*(ou seja, 10.2.0.0-10.2.9.255)
  • todos os hosts correspondentes 10.2.??.*(por exemplo, 10.2.10.0–10.2.99.255)
  • todos os hosts correspondentes 10.2.10?.*(ou seja, 10.2.100.0–10.2.109.255)
  • todos os hosts correspondentes 10.2.11?.*(ou seja, 10.2.110.0–10.2.119.255)
  • todos os hosts correspondentes 10.2.12?.*EXCETO os correspondentes 10.2.128.*e 10.12.129.*(e lembre-se de que a exclusão deve ocorrer primeiro!)

Sua lista de padrões deve ficar assim:

Host "10.2.?.*","10.2.??.*", "10.2.10?.*","10.2.11?.*","!10.2.128.*","!10.2.129.*","10.2.12?.*"

4
Para ser preciso, essa não é uma expressão regular, é um curinga brilhante.
Gabor Garami

1
Obrigado pela resposta, quase funciona para mim, mas eu realmente precisava diferenciar esses dois intervalos com hostentradas separadas . Também precisava de cada um deles citado separadamente (ssh / Mac). O mais curto que pude encontrar: 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*" e 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.*"
fazy

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.