Können Sie SSH-Einstellungen pro Netzwerk konfigurieren?

Können Sie SSH-Einstellungen pro Netzwerk konfigurieren?

Ich rede vonssh_config(5). Ich frage mich, ob Sie einen Konfigurationsabschnitt oder eine Konfigurationsdatei basierend auf dem aktuell verbundenen Netzwerk definieren können.

Ich denke an das Szenario, in dem die Firewall Ihres Unternehmens Port 22 blockiert, Ihr Heimnetzwerk jedoch nicht. Sie haben also diese Konfiguration, aber sie ist zu Hause technisch unnötig.

Host github.com
  Hostname ssh.github.com
  Port 443

Ich bin sicher, dass dies nicht das interessanteste Szenario ist, aber ich hoffe, Sie verstehen, worauf ich hinaus will.

Antwort1

Ich habe dies gelöst, indem ich mehrere Konfigurationen mit den Namen der von DHCP bereitgestellten Domäne und einer Standardkonfiguration als Fallback eingerichtet habe, z. B. ~/.ssh/config.abc, ~/.ssh/config.xyz, ~/.ssh/config:defaultfür zwei Domänen abcund xyz, plus Standard. Wenn Sie sich fragen, warum in Standard ein Doppelpunkt steht – dies ermöglicht eine Domäne mit dem Namen default.

Dann gibt es ein kleines Skript ~/.ssh/update-config, das eine der Dateien basierend auf der in der Befehlszeile übergebenen Domäne verknüpft:

#!/bin/bash`

config=~/.ssh/config
default_config=${config}:default

domain="$1"
domain_config=${config}.${domain}

if test -f ${domain_config}; then
    echo "Using config ${domain_config}"
    ln -sf ${domain_config} ${config}
else
    echo "Using default config ${default_config}"
    ln -sf ${default_config} ${config}
fi

Sie können dieses Skript dann manuell mit der entsprechenden Domäne als erstem Parameter aufrufen.

Um dies zu automatisieren, habe ich auch einen NetworkManager-Hook ( /etc/NetworkManager/dispatcher.d/02-sshconfig) hinzugefügt:

#!/bin/bash

case "$2" in
    up|dhcp4-change)
        break
        ;;
    *)
        exit 0
        ;;
esac

# some iface went up

for home in /home/*; do
        user=$(basename ${home})
        script="${home}/.ssh/update-config"
        test -x ${script} && su -l ${user} ${script} ${IP4_DOMAINS}
done

exit 0

Wenn jetzt eine Schnittstelle aktiviert wird oder ihre DHCP-Konfiguration geändert wird, wird dieses Skript update-configfür jeden Benutzer ausgeführt.

Nicht ideal (was ist, wenn das kabelgebundene Netzwerk eine andere Domäne als das kabellose hat, keine Domäne in der DHCP-Konfiguration vorhanden ist usw.), aber es hat bei mir jahrelang so gut funktioniert, dass ich vergessen habe, dass ich es konfiguriert hatte, und ich auf meinem alten Laptop herumwühlen musste, um es auf einen neuen zu übertragen.

Wenn durch die DHCP-Konfiguration keine Domäne bereitgestellt wird, können Sie versuchen, die Konfigurationsauswahl auf etwas anderem zu basieren, beispielsweise auf Ihrer zugewiesenen IP.

Es gibt natürlich einige Duplikate in den Konfigurationen, daher wäre vielleicht eine Konfiguration mit einer Quelle mit speziellen Tags (DHCP-Domäne, IP-Adresse/-Bereich) und einem Skript, das nur markierte Hosts zur tatsächlichen Konfiguration filtert, besser. Vielleicht kann sich hier jemand inspirieren lassen.

Antwort2

Eine Antwort, auf die in einem Kommentar hingewiesen wurde, schlug einfach vor, netzwerkspezifische Regeln in der SSH-Konfigurationsdatei des Benutzers beizubehalten. Zum Beispiel ...

Host foo@work
  Hostname ssh.foo.com
  Port 443

Das würde wahrscheinlich funktionieren, da ich so mehr Kontrolle über die Befehle und die Eingabe des Hostnamens habe, Gits pushund pullBefehle aber direkt von den konfigurierten Remotes gelesen werden.

Ich müsste anscheinend auch Arbeits-/Heim-Fernbedienungen konfigurieren :(

verwandte Informationen