Wie kann ich einen CIDR-Bereich für einen SSH-Konfigurationshosteintrag abgleichen?

22

Ich suche nach einer Möglichkeit, bestimmte CIDR-Blöcke zu verwenden, um Hosts in der SSH-Client-Konfiguration abzugleichen (normalerweise ~/.ssh/config). Zum Beispiel habe ich einen Eintrag den gesamten Datenverkehr durch eine Bastion - Host zu übermitteln , wenn die IP in einen bestimmten Bereich fällt, sagen wir mal 10.1.0.0/16:

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

Das funktioniert sehr gut, aber wie wäre es, wenn ich einige Bereiche hinzufüge, die nicht genau zur Punktnotation passen?

# 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

Enthält das Handbuch etwas, das ich verpasst habe, oder einen cleveren Scripting-Trick, mit dem diese Host-IP-Bereiche abgeglichen werden können?

fazy
quelle

Antworten:

24

Der Abgleich mit Mustern in der Datei ssh_config erfolgt als einfacher Musterabgleich und nicht als Netzwerk- / CIDR-Abgleich. Die Verwendung der CIDR-Notation wird also nicht funktionieren.

Die Manpage erklärt, dass:

Ein Muster besteht aus null oder mehr Nicht-Leerzeichen *(einem Platzhalter, der null oder mehr Zeichen entspricht) oder ?(einem Platzhalter, der genau einem Zeichen entspricht).

Das Beste, was Sie tun können, ist, eine Liste mit mehr als einem Muster zu verwenden. Wiederum von der Handbuchseite:

Eine Musterliste ist eine durch Kommas getrennte Liste von Mustern. Muster in Musterlisten können durch vorangestelltes Ausrufezeichen ( !) negiert werden .

Um also Ihre zwei / 18-Netze abzudecken, müssen Sie Folgendes auflisten:

  • alle passenden Hosts 10.2.?.*(dh 10.2.0.0–10.2.9.255)
  • alle passenden Hosts 10.2.??.*(dh 10.2.10.0–10.2.99.255)
  • alle passenden Hosts 10.2.10?.*(dh 10.2.100.0–10.2.109.255)
  • alle passenden Hosts 10.2.11?.*(dh 10.2.110.0–10.2.119.255)
  • Alle passenden Hosts, 10.2.12?.*AUSSER denjenigen, die mit 10.2.128.*und übereinstimmen 10.12.129.*(und denken Sie daran, dass der Ausschluss zuerst kommen muss!)

Ihre Musterliste sollte dann so aussehen:

Host "10.2.?.*","10.2.??.*", "10.2.10?.*","10.2.11?.*","!10.2.128.*","!10.2.129.*","10.2.12?.*"
Jenny D sagt Reinstate Monica
quelle
4
Um genau zu sein, ist dies kein regulärer Ausdruck, sondern ein globaler Platzhalter.
Gabor Garami
1
Vielen Dank für die Antwort, es funktioniert fast für mich, aber ich musste diese beiden Bereiche tatsächlich mit separaten hostEinträgen unterscheiden. Es brauchte auch jedes einzeln aufgeführte (ssh / Mac). Kürzeste, die ich finden konnte: 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*" und 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