ProxyCommand condizionale in ~ / .ssh / config?


14

Ho ~/.ssh/configconfigurato i miei host con vari host accessibili sia sulla nostra VPN aziendale, sia tramite un server proxy SSH.

Al momento l'ho appena fatto

Host internal-server
    ProxyCommand ssh -W internal.ip:22 external-server

Tuttavia, se mi trovo nella rete interna, posso accedere direttamente all'ip interno, quindi il proxy tramite il server esterno aggiunge solo un ritardo alla connessione.

Esiste un modo per eseguire il proxy provvisorio se l'ip interno non è raggiungibile e connettersi direttamente in caso contrario?

Risposte:


8

Di solito installo qualcosa del genere. Presuppone che l'host intermedio sarà in grado di risolvere il nome.

Host *%homeproxy
    ProxyCommand ssh user@proxyhost /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22

Quindi mi collegherei a Mi piace ssh blah%homeproxy.


Il mio google-fu mi sta fallendo. Puoi spiegarlo di più? Non ho mai visto questa sintassi *% prima.
fukawi2

3
Non c'è niente di speciale nel %personaggio. Potresti usare qualsiasi cosa davvero. La percentuale viene utilizzata poiché non è valida in un nome host o nome utente. Il cutcomando all'interno di ProxyCommand utilizza %come delimitatore per estrarre il nome host.
Zoredache,

1
Questo è buono, tuttavia significa che devo precisare il nome host completo anziché l'alias ssh.
alt,

@mobiusnz In realtà significa semplicemente che è necessario un nome diverso per ogni diverso mezzo di connessione. Nel mio caso, ad esempio, se sono a casa, uso ssh targetH, che significa bersaglio da casa . Se in una rete locale di destinazione, semplicemente ssh target. Sarebbe stato bello averlo dichiarato più chiaramente nella risposta.
Rubens,

4

Uso un metodo diverso usando Match. Nel mio caso, voglio usare un proxy locale se è in esecuzione o no, se non lo è. La seguente direttiva lo fa bene:

Match Exec "nc -z 127.0.0.1 1086"
    ProxyCommand nc -X 5 -x 127.0.0.1:1086 %h %p

Corrisponde ad ogni tentativo ssh ed esegue un controllo rapido usando ncper vedere se il mio proxy è attivo e in esecuzione su 1086 (nel qual caso, ncesce senza errori). Se ciò accade, imposta il ProxyCommand.


2

Un decennio fa ho scritto un comando proxy per questo tipo di scenario. Nel tuo caso d'uso il mio comando proxy potrebbe essere usato in questo modo:

Host internal-server
    ProxyCommand ssh-multipath-proxy %h:%p -- ssh -W %h:%p external-server

Un paio di avvertenze: sono un po 'imbarazzato ad ammettere che non gestisce IPv6 e che proverà solo un singolo indirizzo IP per nome host. Inoltre, non trasferirà il banner client sul server prima che il banner del server sia stato inviato. Ma è improbabile che ciò causi problemi.


2

Grazie per la risposta di @ till , mi ha ispirato molto.

Ho scoperto che puoi reindirizzare forzatamente la tua connessione con ProxyCommand nc dst dst-port.

Ad esempio, ti collegherai infatti a B.comse lo usi

ssh A.com -o ProxyCommand="nc B.com 22"

Ma UserKnownHostsFileregistrerò comunque comeA.com

Quindi potresti aggiungere un dominio "auto" al tuo ssh_config

Host auto.internal-server
  Hostname {internal-server ip or domain}
  ProxyCommand bash -c '(timeout 0.1 nc -z %h %p) && nc %h %p || ssh -W %h:%p external-server'

Ho sostituito nc -w 1 %h %pcon (timeout 0.1 nc -z %h %p) && nc %h %p, sarà più veloce se potessi raggiungere il server interno meno di 100 ms.

Oppure puoi sostituirlo con ping, ma potrebbe indicare informazioni errate se usi un proxy basato su TCP proxychainso se il server non consente un eco ICMP.

Host auto.internal-server
  Hostname {internal-server ip or domain}
  ProxyCommand bash -c '(ping %h &>/dev/null) && nc %h %p || ssh -W %h:%p external-server'

Puoi sostituirlo (timeout 0.1 nc -z %h %p)con qualsiasi cosa rilevi se sei nel server interno.

Se hai più IP candidati, anche tu puoi usare questo:

Host auto.internal-server
  Hostname {internal-server ip or domain}
  ProxyCommand bash -c 'f(){(timeout 0.1 ping -c 1 $1 &>/dev/null) && nc $1 %p;}; f 1.1.1.1 || f 2.2.2.2 || f 3.3.3.3'

Tenterà di connettersi 1.1.1.1, in caso contrario tentare di connettersi 2.2.2.2, quindi 3.3.3.3.


0

Funziona un po 'più automagicamente con un piccolo ritardo aggiuntivo di 1 secondo se non sei dietro il firewall e il firewall non rifiuta:

Host proxyhost.example.com
ProxyCommand none

Host *.example.com
ProxyCommand sh -c "nc -w 1 %h %p || ssh -W  %h:%p proxyhost.example.com"

0

Generalmente creerei un'altra voce simile a questa:

Host myVM
    ProxyCommand ssh -W internal.ip:22 external-server
    User ubuntu

Host myVM-np
    User ubuntu

Quindi invoca quello che desideri, a seconda dell'ambiente proxy corrente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.