Es muy común, sobre todo en las empresas, que hayan cierto sitios a los que se le restringe el acceso por algún determinado motivo (a veces absurdo, otras no), como pueden ser sitios de descarga, webmails y demás.
Por lo general, estas restricciones se hacen bloqueando el dominio del sitio en cuestión, añadiendo además, restricciones a determinados puertos ¿Qué hacemos entonces si necesitamos obtener alguna información de forma inmediata?
Normalmente los usuarios de Windows hacen uso de programas como Putty (el cual también está disponible en GNU/Linux), o YourFreedom, pero existe otra forma un poco más segura de poder acceder a los sitios que tenemos denegados, usando SSH y Sock5.
Para este ejemplo, estoy contando con que tenemos abiertos los puertos 80, 3128 (usado normalmente para la navegación) y el 9122, y veremos dos casos reales. No es mi objetivo con este artículo, explicar de forma detallada que es SSH, Sock5 y como funcionan, eso lo dejaremos para otra ocasión. Veremos dos ejemplos:
– Conectándonos a otra PC por SSH usando su dirección IP.
– Conectándonos a otra PC por SSH usando un dominio (via DNS).
¿Qué necesitamos?
– Un ordenador con acceso a Internet al que podamos acceder por SSH.
– SSH instalado como es lógico.
– Corkscrew (por si estamos por detrás de un proxy).
Abrimos un terminal y ponemos (en el caso de Debian):
$ sudo aptitude install ssh corkscrew
OK.. ya instalé ¿Cómo me conecto?
Es muy simple. Abrimos un terminal y ponemos ssh -p 443 usuario@ip_del_ordenador_con_internet:
ssh -p 9122 -D 1080 elav@192.168.1.1
El parámetro -p como es lógico, se usa para establecer por cual puerto nos vamos a conectar. Así de simple. Ahora, abrimos las preferencias del navegador (en mi caso Firefox) y en las Opciones de Red, marcamos únicamente la opción de usar Servidor Socks y ponemos:
127.0.0.1:1080
Con esto es suficiente para navegar.
¿Qué pasa si estamos detrás de un proxy?
Se puede dar el caso de que estemos por detrás de un servidor proxy muy restrictivo o que simplemente nuestro ISP no nos permita conectarnos mediante una dirección IP, por lo cual tenemos que hacerlo por DNS. Aquí es donde entra a jugar Corkscrew. Para usar esta aplicación lo único que debemos hacer es crear con nuestro editor favorito un fichero dentro de la carpeta .ssh en nuestro /home, llamado config:
$ vim ~/.ssh/config
y adentro le ponemos algo como esto:
host dominio.net
user tu_usuario
hostname dominio.net
port 9122
proxycommand corkscrew IP_Proxy 3128 %h %p
DynamicForward 1080
Compression yes
LocalForward 8888 localhost:8888
Explicando un poco esto. En el parámetro host ponemos la URL del servidor al que nos vamos a conectar (el cual tiene que tener SSH disponible por el 9122, como vimos en este post. En el parámetro proxycommand después de corkscrew ponemos la IP de nuestro proxy o el FQDN, por ejemplo: proxy.dominio.net y el puerto que se usa para navegar.
Ahora solo tenemos que abrir un terminal y poner:
ssh usuario@dominio.net
Ahora, un último detalle. Es posible que se necesite modificar un parámetro en la configuración de Firefox si no tuviésemos conexión. Abrimos una pestaña y tecleamos about:config. Prometemos que no meteremos nuestras manazas en las configuraciones y buscamos:
network.dns.disablePrefetch
Y si está en false lo ponemos en true.
Excelente, solamente me gustaría tener un servidor para poder hacerlo de forma funcional y no sólo la práctica entre 2 computadoras en mi red local :)…
Una duda, ¿No se podrá navegar a desdelinux.net desde https?
Nop, en estos momentos no se puede. Tendríamos que comprar un certificado SSL, y cuesta unos 60$ al mes o al año, dinero que no tenemos 🙁 … lo siento amigo.
¿Y porqué no un certificado auto firmado?
No conozco mucho al respecto, pero si nosotros mismos generamos un certificado, luego el navegador de ustedes les dirá que el sitio es no confiable y eso… 🙁
Si mal no recuerdo me parece haber visto alguna vez certificados limitados en unos 15 USD anuales, claro que esto depende en gran medida del proveedore de hospedaje. Pero francamente, para un blog (público por naturaleza) no veo la necesidad de navegación por HTTPS salvo quizás para garantizar que la información que vemos sea realmente la original y no parte de un ataque tipo man-in-the-middle (o el deseo puede ser también una señal de que nos estamos volviendo un poco paranoicos) 😉
en el servidor sock, te faltó un punto en 127.0.0.1:1080
Gracias. Ahora mismo lo corrijo.
Pues tengo que decirlo, SSH se ve muy interesante…
jejeje sí, no sabes la de maravillas que se puede hacer solo con una conexión SSH 😀
Quizas sea posible eliminar corkscrew de la ecuación, al menos para Firefox.
En «about:config», establecer la entrada network.proxy.socks_remote_dns a verdadero, lo cual en el caso de un proxy socks v5 hace que las peticiones DNS también se realicen por el proxy socks.
Mi enlace no tiene grandes restricciones, asi que no se esto si funcionará. Prueben y reporten. 😉
Otra sugerencia que he visto por ahi es utilizar -4D en lugar de -D para crear el proxy solo en una dirección ipv4. Con esto aparentemente se optimiza un poco la conexión.
Por último: si no se desea ejecutar ningún comando remoto, se podría utilizar al final el parámetro -N (así evitamos meter los cascos), y para desconectar solo habría que dar un Ctrl+C.
Gracias por la sugerencia Hugo, tendría que probar. Por cierto, con toda esta combinación también uso Screen 😀
Yo también lo uso, aunque mediante byobu. De hecho, hay ocasiones en que se me ha formado tremendo reguero porque he tenido accesos a hosts en los cuales había tenido acceso a otros hosts en los cuales a su vez también había tenido acceso a otros, etc Como casi en todos usaba byobu, al rato he terminado cerrandolo todo porque se me hacía difícil saber desde donde estaba accediendo a donde, jejeje.
Hugo sobre lo del tiempo, llámame de tu casa a mi celular para devolverte la llamada 😉
Además de -4D (para optimizar la conexión) y -N (para decirle a SSH que solamente vamos a forwardear puertos) podemos agregar llaves seguras a ambos lados de la conexión y un & al final de la línea de invocación SSH para iniciar un túnel de forma automatizada.
Suponiendo que tenemos configurados correctamente los archivos:
~/.ssh/
authorized_keys2
id_rsa
id_rsa.pub
en las máquinas involucradas en la conexión, la instrucción final sería:
$ ssh -p 9122 -4D 1080 -N elav@192.168.1.1 &
puediendo agregarla a nuestro /etc/rc.local para asegurarnos que la conexión se establezca automáticamente cada vez que se inicia el sistema.
Más todavía, usando pm-suspend y eth-tool podemos configurar el /etc/rc.local para que despierte a la máquina que va a hacer de proxy a través de internet y se conecte automáticamente a ella y luego la deje nuevamente en stand-by cuando cerremos nuestro sistema…
Happy nerding 😀
Excelente aporte.. Gracias 😀