¿Cómo sé si mi túnel ssh se creó con éxito?

21

Confío en el siguiente script tunnel.shescrito por otros para mantener vivo un túnel ssh:

#!/bin/bash
export SSH_HOST=tim@server 

if [ ! -f /tmp/.tunnel ] 
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" & 
touch /tmp/.tunnel 
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel" 
rm /tmp/.tunnel 
fi
exit

Para crear un túnel ssh persistente, solo publico tunnel.sh. El túnel no se cerrará hasta que tunnel.shvuelva a emitir .

Me preguntaba cómo puedo verificar si el túnel ssh se creó con éxito.

Mi uso principal del túnel es imprimir documentos en algunas impresoras en la misma LAN que el servidor, y solo se puede acceder a las impresoras desde la LAN. Después de crear un túnel, ahora la impresión no informa ningún problema, pero como no estoy físicamente allí, no puedo verificar si los documentos se han impreso realmente.

Pensé que ya que ahora estoy en la LAN gracias al túnel, mi IP externa debería ser la misma que la del servidor. Pero en realidad no son lo mismo (los descubrí wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'). ¿Me pregunto porque? Cuando me conecto a algún sitio web en Internet con el túnel vivo, ¿no es el servidor el punto medio entre mí y el sitio web de Internet en la conexión, debido al túnel entre mí y el servidor?

Tim
fuente

Respuestas:

25

Eso es mucho más complicado de lo que debe ser :-)

Comience el túnel:

ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"

Detén el túnel:

ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST

.

Eso es todo lo que necesitas hacer. Si quieres los detalles, salta a continuación.

Para su segunda pregunta, la IP. No, tu IP no cambia. Todo lo que hizo fue crear un proxy SOCKS a través del host remoto. Su sistema no usa automáticamente este proxy a menos que se lo indique.

Explicación de SSH
Args para iniciar el túnel
-f:: diga a ssh que se ejecute en segundo plano. Solo se pondrá en segundo plano si se inicia con éxito (coopera con el -oargumento a continuación).
-o ExitOnForwardFailure=yes: Esto le dice a ssh que salga si no puede configurar el proxy SOCKS.
-N: No ejecutes un comando. Solo queremos hacer un túnel, no hacer nada en el host remoto.
-D 9999: Su proxy SOCKS.
-M: Esto es necesario para que el argumento -S funcione aquí.
-S /tmp/ssh_tunnel_%h.sock: Esto le dice que use /tmp/ssh_tunnel_HOSTNAME.sock para su socket de control. La -Mopción le dice que ssh necesita configurar este socket y no emitir comandos a otro ssh que ya está escuchando en el socket. Puede usar este socket para configurar túneles adicionales después de que ssh ya se esté ejecutando. los%h usa el nombre de host del host remoto como parte del nombre del archivo.

Args para detener el túnel
-S /tmp/ssh_tunnel_%h.sock: Esto debería ser obvio. Sin embargo, dado que no emitimos un -M, eso significa que ssh debería conectarse al socket que ya está allí y decirle qué hacer en lugar de hacer algo por sí mismo.
-O exit: Esto es parte de la -S. Le decimos al ssh que escucha en el zócalo que salga.
El $SSH_HOSTtodavía se requiere aquí. Incluso si tuviera que especificar una ruta de socket absoluta, sin usar %hen el nombre del archivo, ssh aún querría que se especificara un host remoto. Es por eso que pongo el %hen los argumentos. También podría usarlo si ssh va a preguntar por el host, y mantiene las cosas organizadas.

Patricio
fuente
5

Este tipo de túnel no cambia la información de su dirección IP. Todo lo que hace es decirle a su computadora que abra el puerto 9999 y reenvíe las conexiones a ese puerto a la máquina remota (tim @ server) a través de su conexión ssh. La forma más fácil de probar que la conexión está activa, es telnet al puerto en el que se creó el reenvío (en su ejemplo 9999):

$ telnet localhost 9999
Intentando servidor ...
Conectado al servidor.
El carácter de escape es '^]'.

Si recibe el mensaje "Conectado al servidor". mensaje, eso significa que su túnel está arriba. Si, en cambio, obtiene: "No se puede conectar al host remoto: conexión rechazada" su túnel no está activo.

En cuanto a su segunda pregunta, para su navegador, su navegador no usará el túnel, a menos que se lo indique. En la configuración de red de los navegadores, puede configurar el proxy y especificar localhost: 9999 como proxy de socks5 y luego sus conexiones web deben usar el túnel ssh y parecer que provienen de la dirección IP del servidor.

gabe
fuente
+1 ¡Gracias! (1) Cuando imprimo en una impresora en la LAN, ¿cómo sabe ir al puerto 9999, es decir, usar el túnel? ¿Nada más? (2) ¿Hay tipos de túneles que cambian la información de mi dirección IP?
Tim
@Tim probablemente, esa impresora en particular se ha configurado para imprimir en una dirección IP y puerto en particular. Esto depende de cómo esté configurada su impresora. Por lo general, puede especificar ambos cuando define una impresora. Sí, hay tipos de túneles que tendrán su propia información de IP asociada a ellos. En general, para estos, crea una interfaz tun / tap separada en.wikipedia.org/wiki/TUN/TAP que tendrá su propia dirección IP adjunta, y todo el tráfico que salga de esa dirección parecerá provenir de una red diferente .
Gabe.
¡Gracias! En las preferencias de mi Firefox, en avanzado -> conexión -> configuración, elijo la configuración manual del proxy y escribo "localhost" para HTTP Proxy y "9999" para su puerto. Después de eso no puedo conectarme a ningún sitio web en Firefox. ¿Me pregunto porque?
Tim
@Tim es un poco confuso ... lo correcto para configurar es: SOCKS Host, y no HTTP Proxy. Tuve este mismo problema la primera vez que lo intenté.
Gabe.
1

En mi caso (Google Chrome en Ubuntu 14.10), mi dirección externa cambia, al menos dentro del navegador. Solo google "¿Cuál es mi dirección IP?" con y sin conexión proxy.

Además, después de configurar el proxy, intente destruir el túnel y vea si aún puede obtener tráfico. Cuando hago esto, Chrome devuelve un error "No se puede conectar al servidor proxy".

Otra forma: después de hacer un túnel hacia el host remoto, cree una nueva sesión ssh y ejecútela tcpdump -A dst port 80. Luego navegue a alguna página y debería ver el tráfico relacionado en la terminal.

onlyanegg
fuente