Netzwerkabhängig ~ / .ssh / config?

15

Im Büro kann ich eine Verbindung zu internen Computern ohne Proxy herstellen, benötige jedoch einen Proxy für externe Verbindungen. Außerhalb des Büros kann ich ohne Proxy eine Verbindung zu anderen externen Computern herstellen, muss aber einen von zwei Proxys verwenden, um eine Verbindung zu internen Computern herzustellen.

Kann ich ssh anweisen, die entsprechende Konfigurationsdatei zu laden, wenn ich eine Möglichkeit finde, mein Netzwerk automatisch zu erkennen?

Wenn nicht, gibt es eine elegantere Lösung, als ein Shell-Skript zu schreiben, um die entsprechende Konfigurationsdatei mit ~ / .ssh / config zu verknüpfen (meine bisher beste Idee)?

Edit: Ich denke, @pcm und JonnyRo haben meine Frage verstanden und ich werde versuchen, was sie vorschlagen, aber nur um klar zu sein, ich möchte

|--------\    Dest   | abc.example.com | xyz.external.org |
| Source  \---------\|                 |                  |
|--------------------+-----------------+------------------|
| example.com office | No Proxy        | Proxy            |
| outside            | Proxy           | No Proxy         |
Nate Parsons
quelle

Antworten:

11

Abhängig davon, wie Ihr Proxy konfiguriert ist, können Sie einfach einen SSH-Konfigurationseintrag erstellen, der in beiden Situationen funktioniert. In einem Netzwerk, das ich regelmäßig verwende, muss ich beispielsweise zu einem Zwischenhost ssh, bevor ich eine ausgehende Verbindung herstellen kann. Im Grunde genommen habe ich eine Konfiguration erstellt, die so aussieht.

# proxy ssh 
Host *%sshproxy
    ProxyCommand ssh [email protected] /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22

Host myhost.example.org
    HostName 172.16.24.1

Host otherhost.example.com
    HostName 192.168.57.12

Wenn ich also keinen Proxy verwenden muss, kann ich einfach einen Befehl ausführen ssh myhost.example.orgund eine Verbindung herstellen, aber wenn ich den Proxy benötige, führe ich den Befehl aus ssh myhost.example.org%sshproxy.

Ich vermute, Sie könnten wahrscheinlich eine Art Alias ​​oder eine automatische Vervollständigungseinstellung einrichten, die das %proxyBit automatisch anfügt .

Zoredache
quelle
8

Alte Frage, aber einige Ideen in diesem Thread haben mir geholfen und diese Lösung habe ich mir ausgedacht:

Zuerst die Proxy-Server- SSH-Konfiguration.

Match Originalhost proxy Exec "ifconfig | grep 10.0.1"
     Hostname 10.0.1.2
Host proxy 
     Hostname external.hostname.com

Dann die Konfiguration von Server B :

Match Originalhost server-b Exec "ifconfig | grep 10.0.1"
     ProxyCommand none
Host server-b
     Hostname 10.0.1.3
     ProxyCommand ssh -W %h:%p server-a

Die Idee hier ist, dass der Standardfall eine Verbindung von einem externen Standort herstellt und der ProxyCommand zuerst eine SSH-Verbindung zum Proxy initiiert und dann eine Verbindung zu Server-b herstellt . Befinden wir uns dagegen bereits im lokalen Subnetz, ist der ProxyCommand deaktiviert und es wird keine Proxy-Verbindung zu Server-A hergestellt.

Unabhängig davon, wo Sie sich befinden, können Sie über diesen Eintrag immer auf server-abc zugreifen, und dieses Setup ermittelt, wo Sie sich befinden, und richtet die Verbindung entsprechend ein. Verwenden Sie für server-xyz dieselbe Idee.

Ich habe hier eine genauere Erklärung abgegeben: http://blog.kihltech.com/2017/04/ssh-conditional-host-address-based-on-network-or-location/

Robert Kihlberg
quelle
7

Mit der Option -F können Sie aus verschiedenen Konfigurationsdateien auswählen. für die beiden Netzwerkfälle. Sie können dann entweder Aliase erstellen, die die verschiedenen Konfigurationsdateien verwenden, je nachdem, in welchem ​​Netz Sie sich befinden, oder in Ihrem Anmeldeskript einen einzelnen Alias ​​basierend auf Ihrer IP-Adresse einrichten.

pcm
quelle
Vielen Dank! Aliase mit -F werden definitiv mein Fallback sein, wenn ich kein Skript basierend auf IP zum Laufen bringen kann.
Nate Parsons
Das ist großartig, ich wollte gerade die gleiche Frage stellen. Ich schreibe bereits einige andere Optionen, um Umgebungsvariablen festzulegen, wenn ich ein neues Terminal starte. Ich kann auf einfache Weise einen Alias ​​erstellen oder die richtige .ssh / config-Datei basierend auf der Umgebung verknüpfen.
newz2000
1

Schreiben Sie ein Shell-Skript, das Ihre IP-Adresse anhand eines Musters überprüft, und verknüpfen Sie dann das entsprechende Shell-Skript.

Wenn aus irgendeinem Grund Ihr IP-Bereich für Privat- und Geschäftsanwender derselbe ist, versuchen Sie, basierend auf /etc/resolv.conf, das die DHCP-konfigurierten DNS-Server enthält, zu wechseln.

JonnyRo
quelle
0

Mit der Option "Host" in .ssh / config können Sie die Konfiguration basierend auf dem Ziel ändern. Ich benutze das, um die Portweiterleitung und so weiter anzupassen, je nachdem, wohin ich gehe.

JOTN
quelle
0

Ich habe diese Frage in der Vergangenheit untersucht und eine mögliche Lösung besteht darin, einen solchen Eintrag in der Konfigurationsdatei zu haben:

Host ENTRY_POINT
Hostname ENTRY_POINT_FQDN
User USERNAME

Host *.INSIDE_DOMAIN
ProxyCommand ssh ENTRY_POINT nc %h %p

Auf diese Weise können Sie, wenn Sie sich draußen befinden, $ ssh machine.inside_domain. Wenn Sie drinnen sind und DNS auflösen, können Sie $ ssh machine. Das funktioniert gut für mich.

Vielleicht kann jemand diese Idee verbessern, vielleicht die DNS-Konfiguration so ändern, dass sie automatisch von Maschine zu Maschine aufgelöst wird.

Fernando
quelle