¿ProxyCommand condicional en ~ / .ssh / config?


14

Lo ~/.ssh/configconfiguré con varios hosts accesibles a través de la VPN de nuestra empresa o mediante un servidor proxy SSH.

Por el momento solo tengo

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

Sin embargo, si estoy en la red interna, puedo acceder directamente a la IP interna, por lo que el proxy a través del servidor externo solo agrega un retraso a la conexión.

¿Hay alguna manera de que pueda proxy provisionalmente si no se puede acceder a la IP interna y conectarme directamente de lo contrario?

Respuestas:


8

Generalmente configuro algo como esto. Se supone que el host intermedio podrá resolver el nombre.

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

Entonces me conectaría para gustar ssh blah%homeproxy.


Mi google-fu me está fallando. ¿Puedes explicar esto más? Nunca antes había visto esta sintaxis *%.
fukawi2

3
No hay nada especial sobre el %personaje. Podrías usar cualquier cosa realmente. El porcentaje se usa ya que no es válido en un nombre de host o nombre de usuario. El cutcomando dentro del ProxyCommand usa %como delimitador para extraer el nombre de host.
Zoredache

1
Esto es bueno, sin embargo, significa que tengo que deletrear el nombre de host completo en lugar del alias ssh.
alt

@mobiusnz En realidad significa simplemente que necesita un nombre diferente para cada medio diferente de conexión. En mi caso, por ejemplo, si estoy en casa, lo uso ssh targetH, es decir, objetivo desde casa . Si está en una red local para apuntar, simplemente ssh target. Sin embargo, hubiera sido bueno tener esto más claro en la respuesta.
Rubens

4

Yo uso un método diferente usando Match. En mi caso, quiero usar un proxy local si se está ejecutando, o no, si no es así. La siguiente directiva logra esto muy bien:

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

Coincide con cada intento de ssh, y ejecuta una comprobación rápida usando ncpara ver si mi proxy está funcionando en 1086 (en cuyo caso, se nccierra sin errores). Si eso sucede, establece el ProxyCommand.


2

Hace una década escribí un comando proxy para este tipo de escenario. En su caso de uso, mi comando proxy podría usarse así:

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

Un par de advertencias: me da un poco de vergüenza admitir que no maneja IPv6 y que solo intentará una única dirección IP por nombre de host. Además, no transferirá el banner del cliente al servidor antes de que se haya enviado el banner del servidor. Pero es poco probable que cause problemas.


2

Gracias por la respuesta de @ till , me inspiró mucho.

Descubrí que puedes redirigir tu conexión con fuerza ProxyCommand nc dst dst-port.

Por ejemplo, de hecho te conectarás B.comsi usas

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

Pero UserKnownHostsFileaún así grabará comoA.com

Para que pueda agregar un dominio "auto" a su 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'

Reemplacé nc -w 1 %h %pcon (timeout 0.1 nc -z %h %p) && nc %h %p, será más rápido si pudiera alcanzar el servidor interno a menos de 100 ms.

O puede reemplazarlo por ping, pero puede indicar información incorrecta si utiliza un proxy basado en TCP comoproxychains , o el servidor no permite 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'

Puede reemplazarlo (timeout 0.1 nc -z %h %p)por cualquier cosa que detecte si está en un servidor interno.

Si tiene varias IP candidatas, incluso puede usar esto:

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'

Intentará conectarse 1.1.1.1, si falla intente conectarse 2.2.2.2, y luego 3.3.3.3.


0

Esto funciona un poco más automágicamente con un pequeño retraso adicional de 1 segundo si no está detrás del firewall y este no rechaza:

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

Normalmente crearía otra entrada como esta:

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

Host myVM-np
    User ubuntu

Luego invoque el que desee, dependiendo de su entorno proxy actual.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.