Linux desde Windows

Hola, vengo a defenestrar… Vengo a patearle en contra al imaginario popular, a demostrar que después de todo, Windows y Linux no son incompatibles. (No tanto como muchos dicen al menos…)

Los que usen o hayan intentado usar Linux durante algún tiempo se habrán dado cuenta de que es MUY compatible con Windows. Puede ejecutar una amplia variedad de aplicaciones para Windows gracias a la capa de compatibilidad Wine con una usabilidad dentro de todo bastante buena que si bien todavía no llega al 100% no deja de mejorar todos los días y puede conectarse por la red a cualquier host que corra Windows para usar los servicios que este provea. Está pensado desde el punto de vista del mas chiquito: “Si no puedes contra tu rival, únetele” y así es que cada vez mejora mas la compatibilidad desde el lado Linux.

La cosa se complica olímpicamente cuando es al revés. Cuando se trata de usar aplicaciones para Linux en Windows, ya sea de forma local como remota, por ridículo que esto suene –por que no va a faltar el fanático de un lado o del otro que venga a decir que tal o cual aplicación es mucho mejor que tal otra– pero en determinadas situaciones, acceder a servicios únicamente disponibles de forma nativa en Linux desde una PC corriendo Windows puede venir bien y basado en esa idea va este artículo.

No, no voy a hablar del machacadísimo Cygwin que hoy en día ha evolucionado tanto que hasta te permite instalar KDE como shell para tu Windows voy un poco mas allá, voy a como aprovechar los recursos de una PC con Linux desde otra con Windows usando únicamente la red local o –con buen ancho de banda o un poco paciencia– internet.

Por no entrar en tecnicismos ni hacerla muy larga parto de la base de que saben lo que es SSHel padre de la criatura– y Tienen SSHd instalado y corriendo como servicio. De no ser así, dedos a la obra, que una PC con Linux e internet sin OpenSSH es lo mismo que nada.

Ejemplo 1:

Montar tu partición Linux en Windows, por la red.

En determinados casos puede que necesites acceder a la información contenida en la PC que corre Linux desde tu otra PC, desde la Laptop, desde el laburo o desde un cibercafé. SSHFS al recate:

Partiendo de la premisa de que toda PC con Linux tiene instalado un servidor SSH, se puede usar SSHFS para conectar el contenido del disco rígido de una PC con el de otra de la misma forma en que lo haría Windows al utilizar el “Entorno de red” pero con una serie de ventajas respecto a las alternativas Samba o NFS:

  • Nativo, no necesita software adicional.
  • Tráfico encriptado todo el tiempo.
  • Permisos de seguridad heredados del usuario que inicia sesión remotamente.

En Windows, haciendo uso de Dokan se puede obtener exactamente el mismo resultado.

Basta con instalar la Dokan Library (ejecutable, 486Kb), si no lo tuvieras de antemano Microsoft Visual C++ 2005 SP1 Redistributable y Dokan SSHFS – (Archivo Zipeado de 374Kb).

Una vez ejecutado el programa, te saluda con esta interfaz:

Linux desde Windows

Que como ven no tiene mucha ciencia: Nombre de host o número de IP de la PC que corre Linux, número de puerto en donde escucha el servidor SSH, nombre de usuario y contraseña, que carpeta remota montar localmente en Windows y que letra de unidad asignarle. Para el ejemplo, la letra S.

Ejemplo 2: Usar la conexión a Internet remota.

Este viene bien en el laburo por que te han filtrado ciertas páginas web o ciertos clientes de chat, en el cibercafé o en la wi-fi pública por que no sabés quien pudiera estar capturando todo el tráfico de internet y necesitás ingresar nombres de usuario y contraseñas o algún tipo de información sensible, o simplemente por que necesitás cambiar de número de IP momentáneamente.

Todo lo que hace falta es establecer un túnel SSH entre tu PC filtrada o con internet de dudosa procedencia y tu otra PC en la ubicación remota corriendo Linux. Para hacer esto basta con descargar y ejecutar PuTTYojo con el doble sentido-, el cliente SSH por excelencia para Windows.

Ejecutado PuTTY tampoco tiene mucha ciencia, nombre de host o número de IP al cual conectarte, número de puerto y listo, solo hay que tener la precaución de crear el túnel especificándolo en las opciones:

Linux desde Windows

Una vez conectado PuTTY y autenticado el usuario, se crea un túnel dinámico escuchando en el puerto 3128 en este caso, entre la PC problemática y la que corre Linux.

Basta con especificarle al navegador que use como servidor proxy –como socks server en realidad– la direción de IP 127.0.0.1 en el puerto 3128 (elegí este arbitrariamente por costumbre, el número de puerto puede ser cualquiera, se prefieren los no privilegiados, del 1024 en adelante), para que todo el tráfico sea cifrado y reenviado hasta la PC con Linux antes de salir a internet:

Linux desde Windows

Comprobable usanso algún servicio como whatismyip.com o checkip.dyndns.org para comprobar antes y después del tunnel si estás saliendo a internet por la conexión local o por la remota.

Ejemplo 3:

Aplicaciones de Linux en Windows, por la red.

Para cuando en el laburo te bloquearon ciertos clientes de chat o ciertas páginas web que no podés dejar de consultar compulsivamente para ver que te escribieron en ciertos muros –así no cabe ninguna duda acerca de que estoy hablando-, o por que tu PC Linux no tiene monitor, o justo te la están usando y queda la que tiene Windows, etc… etc…

Gracias a X11 Forwarding, se puede ejecutar una aplicación remotamente pero trayendo el contenido de la ventana hasta la PC local sin usar VNC, Teamviewer o similares.

Para que esto funcione entre una PC con Linux y otra con windows es necesario agregarle a tu Windows la capacidad de ejecutar aplicaciones pensadas para el entorno gráfico de Linux, conocido como X o X11. Esto se consigue instalando Xming (ejecutable, 2.4MB), una implementación de X11 para windows.

Por otro lado, el servidor SSH del lado Linux necesita tener habilitado X11forwarding. Es muy probable que lo tengas habilitado por defecto pero de no ser así es tan fácil como editar el archivo de configuración /etc/ssh/sshd_config y modificar o agregar al final una línea que diga:

X11Forwarding yes

Teniendo Xming en ejecución y establecida la conexión con PuTTY con la opción “Enable X11Forwarding” habilitada, cualquier comando que ejecutes remotamente te traerá la ventana hasta tu PC local corriendo windows (Por ejemplo el navegador, el cliente de chat, el cliente de correo electrónico, etc.). Se usan todos los recursos de la PC remota –incluida la conexión a internet– para ejecutar la aplicación:

Linux desde Windows

Y eso es todo. Cualquier comando ejecutado en la PC remota y que necesite mostrar ventanas en pantalla es representado por el servidor X11 de Windows gracias a Xming:

Linux desde Windows

En la captura, xcalc, la calculadora mas fea de Linux, corriendo en windows gracias a X11 Forwarding.

Conclusiones:

Toda la magia la hace el protocolo SSH. Como prácticamente no existe PC con Linux conectada a internet sin OpenSSH, este protocolo es uno de los primeros en ser golpeado por bots tratando de loguearse usando fuerza bruta. De todas las medidas de seguridad que se pueden tomar para evitar esto, la mas efectiva y simple es cambiar el número de puerto en donde escucha el servidor SSH por cualquier otro.

Esto se logra editando el archivo de configuración /etc/ssh/sshd_config modificando la línea que dice:

Port 22

Si van a exponer su servidor SSH a internet, cámbienlo de puerto o implementen otro tipo de soluciones como Fail2ban o autenticación basada en llaves.

El rendimiento de X11 Forwarding sobre internet no es la gran cosa, por mas compresión que haya de por medio. En la red local es una gran solución. Sobre internet puede que te resulte hasta tedioso de usar si no hay mucho ancho de banda disponible en un momento dado.

Obviamente, todos los ejemplos anteriores son aplicables también para el caso en donde hay Linux en las dos puntas.

Habrá con seguridad unas cuantas aplicaciones mas para el par Windows-Linux que no conozco, así que a ver si me iluminan y aprendemos todos.

19 Comentarios

  1. Muy interesante…yo en el laburo cuando se me terminan las ideas con los pocos comandos que se de unix/linux para ver/editar archivos de texto plano, recurro al FilaZilla, descargo, edito y subo (sin olvidar LF).
    Con esto me ahorraria unos cuantos pasos y hasta tiempo.

    Slds

  2. genial, ideal para tener en cuenta a la hora de una demostración a gente que no está en el tema.

    Ahora, tengo una pregunta: ¿qué diferencia (a grandes rasgos, no soy una experta) hay entre el SSH y una VPN? Estas últimas semanas estuve investigando sobre VPN, y la verdad que montar un servidor propio (por ej, con OpenVPN) parece algo bastante complicado =P

    • SSH es un protocolo que seguramente inventó Mc Gyver por que sirve hasta para hacer chorizo en tira. Conecta dos PC entre sí usando un único puerto y cifrando la conexión.

      Una VPN une dos redes bajo tu control usando una tercera red sobre la que no tengas control (internet). Nada mas facil que Hamachi, como dice el slogan del producto: “La VPN hecha simple” si estás enpezando con esto: http://www.hamachi.cc

      Se puede establecer una conexión SSH sobre una VPN pero no al revés, para que se entienda.

      ¡Saludos!

      • Ah… ahora queda más claro. Igual, el problema que tiene Hamachi es que llega a haber un problema con sus servidores o, como leí en un tuto “si se muere don hamachi”, solo queda cruzarse de brazos y esperar.

        Igual, si veo que la VPN se me va de las manos, no cuesta nada probar con SSH+autentificación con llaves.

        • Perdón por pasar tan tarde, me acabo de colgar mirando esta entrada, pero en respuesta para la duda de Nadius, en caso de que SSH no se ajuste a sus necesidades y busque una VPN que no dependa del servicio y humor de un tercero como Hamachi, le recomendaría probar con OpenVPN, que no es tan fácil, pero al menos la veo mucho más fácil que IPSec y existen distros de firewall/routers basados en Linux que la permiten implementar de forma bastante facilonga: IPFire en una PC, o DD-WRT y TomatoVPN en routers Linksys o equivalentes. Saludetes

  3. muy bueno Juan. Ya había leído algo cuando explicaste el reenvío de tráfico HTTP por SSH en malditonerd. Pero acá está mas completas las opciones que tenemos. Muy bueno. Y la posta, no conocía ninguno de los programas para Windows que mencionas que aportan esa capa de compatibilidad. Gracias por compartir un poco de tu sapiencia!
    Saludos

    • No solo HTTP podés mandar por un tunel SSH, se aplica a cualquier protocolo en realidad pero el caso mas común es HTTP o POP3/SMTP y por eso el ejemplo.

      ¡Saludos!

  4. Que bárbaro!

    Yo tampoco conocía esas aplicaciones y menos que menos el de lanzar X en windows así como así.

    SSH GPG y listo!! (eso si doy de baja el Facebook antes XD)

  5. Buenisimo el artículo! Una pregunta, si la pc con linux está conectada a un router, esto funciona de una o hay que hacer alguna configuración especial?

    • Necesitás reenviar el puerto en donde corre el servidor SSH (por defecto el 22 TCP) desde el router hasta la PC con Linux. Tu router necesita saber que hacer con esa conexion que viene de afuera sin haberse originado por una petición interna.

      Si usás algún tipo de VPN que sea transversal a tu router, entonces no necesitás reenviar nada y funciona de una.

      ¡Saludos!

  6. Muy interesante el articulo, me ayudo mucho entender como funciona el SSH. Como puedo implementar para acceder a una base de datos SQL Server 2005 que esta detrás de un servidor linux que es mi servidor de Internet. El SQL Server 2005 esta en Windows 2003 y esta en la red local y tiene salida a Internet a través del servidor linux.

  7. Está muy bueno el artículo pero yo necesitaría hacer justo lo contrario: correr aplicaciones en una máquina con Windows y enviarlas por túnel ssh a una pc con linux. No sé si me explico bien, pero la idea es el ejemplo 3 pero al revés, de Windows a Linux. Si me pueden orientar un poco se los agradezco porque la verdad que no soy una experta en el tema ni mucho menos, pero me parece re interesante esto.

Dejar respuesta

Please enter your comment!
Please enter your name here