2009-01-27

Crear aplicaciones Qt en Windows usando Microsoft Visual C++ 2008 (Compilar, Depurar y Ejecutar desde el IDE)

Bueno en mi post anterior expliqué como se podían crear aplicaciones Qt en Windows usando Microsoft Visual C++ 2008 Express Edition y dije que había que compilar desde la consola por que ni idea como hacerlo desde el IDE, ya sé como hacerlo así que lo dejo aquí para el que le interese.

Bueno, lo primero es saber que Microsoft Visual C++ 2008 Express Edition tiene dos configuraciones de compilación: Debug y Release. La configuración de Debug se supone que compila el ejecutable con los símbolos de depuración de Windows y otras cosas, por lo que el ejecutable es más rastreable y de tamaño mayor, la configuración de Release no tiene nada de esto por lo que el tamaño del ejecutable es menor.

Vamos a preprar a Microsoft Visual C++ 2008 Express Edition para compilar nuestras aplicaciones Qt en ambas configuraciones, para empezar tenemos que crear dos archivos (.bat) de procesamiento por lotes que se encargaran de llamar al precompilador de Qt y preparar todo para que luego el Compilador y el Linker del Visual C++ puedan compilar el programa, los pasos son los siguientes:

Vamos a crear dos archivos (.bat) en la carpeta bin del Qt 4 (en mi caso C:\Qt\4.4.3\bin), al primero le llamaremos qcreate.bat, dentro de el escribimos estás líneas de comando:

qmake -project
qmake
nmake

Al segundo lo llamaremos qcreate-release.bat y en el escribiremos:

qmake -project
qmake -config release
nmake

Ahora ya tenemos las secuencias de comando listas, lo que sigue ahora es configurar al Microsoft Visual C++ 2008, para ello seguimos estos pasos:

1. Se creamos un proyecto nuevo aparecerá el asistente de configuración de proyectos de archivos MAKE:


Le damos clic en Siguiente y el asistente nos muestra la configuración de Debug:


Allí, en donde dice Línea de comandos de generación escribimos qcreate, que es el nombre del .bat que hemos creado y luego en donde dice Resultados (para depuración) escribimos debug\ antes del texto que ya se encuentra en el recuadro (sin eliminarlo), es decir que en el ejemplo el texto quedaría: debug\Text-Make.exe, para terminar damos clic en Siguiente.

Ahora nos muestra una ventana muy parecida solo que esta vez se trata de la configuración para el Release, en esta vamos a quitar la marca de verificación de la casilla Igual que la configuración Debug para que se activen los campos. En donde dice Linea de comandos de generación escribimos qcreate-release que es el nombre de nuestro .bat para los releases, y de forma similar a lo que hicimos antes en el recuadro que dice Resultados (para depuración) escribimos release\ antes del texto que se enucentra allí:


Luego damos clic en Finalizar.

Listo, eso es todo, ahora si podemos usar los comandos del IDE para generar (Generar -> Generar Solución / Generar Proyecto) o para Depurar (Depurar -> Iniciar Depuración) también podremos ver los errores y advertencias de la compilación (Ver -> Otras Ventanas -> Lista de Errores) y hacer clic sobre ellos para que el IDE nos lleve directo a la línea donde se encuentra el error.

Lo único que no he podido hacer es que el IDE vea los archivos de Include del Qt, eso si no lo he podido hacer por que los archivos de Include del Qt tienen inclusiones anidadas y el Visual C++ 2008 como que es muy perezoso para irse a buscar las referencias en los archivos anidados entonces cuando uno escribe hello. (en el tutorial) no puede esperar que el Visual C++ le muestre los miembros de la clase QPushButton.

Si encuento una forma de hacerlo posteare nuevmanete. Por ahora los dejo. Comentarios y etc siempre están bien recibidos, siempre y cuando no sean Spam.

2009-01-26

Crear aplicaciones Qt en Windows usando Microsoft Visual C++ 2008

Hola, para los que no saben que es Qt se trata de una API multiplataforma para crear aplicaciones nativas en Windows, Linux, mac, Solaris, etc y poder portarlas sin cambiar ninguna línea de código. Si quieren ver más información sobre este paquete pueden visitar: http://www.qtsoftware.com/

Yo ya había escrito dos posts en este mismo blog sobre Qt y como instalarlo en Linux, si quieren darles un vistazo:

El remplazo de Visual Basic
Instalar Qt4

La verdad es que había estado intentando hacer correr este paquete en Windows pero hasta ahora no había podido, traté con DevC++ y con Eclipse pero nada, quien pensaría que la solución era un producto de Microsoft.

Recientemente Microsoft liberó las versiones Express del Visual Studio 2008 que se pueden descargar gratuitamente. Con este producto podemos compilar el Qt y también crear nuestras propias aplicaciones. En este post explicaré como hacerlo.

Obviamente lo primero es descar e instalar el Visual C++ 2008 Express Edition, una vez instalado (pesa como 150 MB) debemos descargar la versión de Código Fuente de Qt4 para Windows de la página de Qt Software. Ojo, no descargen la versión que viene con el MinGW sino la que es solo código fuente. La descarga pesa como 120 MB, es un archivo comprimido.

Descargamos el archivo y lo descomprimimos en C:\Qt\4.4.3 [EL NOMBRE DE LA CARPETA NO DEBE CONTENER ESPACIOS] (la 4.4.3 fue la versión que yo bajé pero puede que para el momento en que lean este post sea una más reciente). En esa carpeta queda un archivo que se llama configure.exe este es el autconf del builder, hay que ejecutarlo PERO NO SE PRECIPITEN, LEAN ABAJO.

Vamos a Inicio -> Todos los Programas -> Microsoft Visual C++ 2008 Express Edition -> Visual Studio Tools -> Símbolo del Sistema de Visual Studio 2008, esto nos abre una consola en el directorio del Visual C++ y habilita los paths para el maker, y el linker.

En esta consola nos vamos a C:\Qt\4.4.3\ (o el directorio donde hayan descomprimido el qt), una vez allí ejecutamos:

C:\Qt\4.4.3\>configure -platform win32-msvc2008

Este comando prepara el código para que se pueda compilar con el compilador de Microsoft Visual Studio 2008, una vez temine el proceso veremos un mensaje como este:

Qt is now configured for building. Just run nmake.
To reconfigure, run nmake confclean and configure.

Entonces simplemente hacemos lo que dice ahi, ejecutamos nmake para que Visual C++ empiece a compilar. Este proceso tarde un rato, igual que en Linux, la consola va a estar compilando durante un tiempo creando los ejecutables de Qt Designer, Qt Assistant, el moc, etc y las dll de Qt, cuando el proceso termina Qt esta compilado e instalado en el equipo listo para usarse.

Ahora vamos a ver como crear un programita en Qt usando el Visual C++, vamos a crear el Hello World del tutorial de Qt. Pero primero hay algo adicional que debemos hacer y es agregar la carpeta bin de Qt al Path del Sistema:

Damos clic en Inicio y luego clic derecho en Mi PC, ahi vamos a Propiedades y en la pestaña de Opciones Avazadas le damos clic en Variables de Entorno, aparece un cuadro de diálogo con las variables de sistema y las variables de usuario, en las variables de sistema buscamos la variable Path, la seleccionamos y damos clic en Modificar. Al final del texto colocamos un ; (punto y coma) y despues escribimos la ruta del bin de Qt, que en mi caso era C:\Qt\4.4.3\bin y damos clic en Aceptar en todos los cuadros de diálogo.

Ahora si vamos a crear el Hello World.

Abrimos el Visual C++ 2008 y cremos un Nuevo Proyecto, en donde dice Tipo de proyecto seleccionamos Visual C++ -> General -> Proyecto de archivos MAKE. Seleccionamos la ubicación y el nombre del proyecto que en este caso será Hello World. Retiramos la marca de la casilla Crear directorio para la solución y damos clic en Aceptar.

Visual Studio nos abre un asistente para configuración del proyecto de archivos MAKE, vamos a ignorarlo y daremos clic simplemente en Finalizar. Se creará el proyecto y apareceran las carpetas y archivos usuales del Visual C++ (crea un montón de basura).

Vamos a crear el main, entonces, en el Explorador de Soluciones, en la carpeta Archivos de código fuente damos clic derecho y ahi seleccionamos Agregar -> Nuevo Elemento y escojemos Archivo C++ (.cpp), le damos el nombre main y hacemos clic en Aceptar.

El Visual Studio nos abre un editor de código, ahi vamos a escribir el código que está en el Qt Assistant, en el tutorial de Hello World que es este:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPushButton hello("Hello world!");

hello.show();
return app.exec();
}

Le damos en Guardar y ya estara listo el proyecto, ahora vienen las malas noticias, no podemos compilar desde el IDE (o por lo menos yo no he podido por que hay que configurarlo y yo no me he puesto en esas) así que vamos a compilar por consola:

Abrimos otra vez el Símbolo del Sistema de Visual Studio 2008 que abrimos para compilar el Qt. En esa consola vamos a la carpeta donde hemos guardado el proyecto de Visual C++ y allí escribimos estos comandos:

qmake -project
qmake
nmake

Esto compila el programa y genera el ejecutable en la carpeta Debug, en mi caso Hello World.exe. Desde la misma consola o desde un explorador de Windows podemos ejecutar la aplicación para constatar que funciona.



Bien, ya hemos creado y ejecutado una aplicación en Windows con Qt. Si corre el Hello world corre cualquier cosa. :)

No duden en dejar sus comentarios, dudas o preguntas.

Se cuidan Bye Bye.

2008-10-16

Saltar un proxy que requiere autenticación

Bueno lo que pasa es que en mi post anterior sobre como saltar firewalls usando el OpenSSH no dije como se hacía cuando el proxy que ibamos a saltar tenía autenticación, como es el caso concreto del proxy de la universidad, si usamos por ejemplo el cliente que viene con el OpenSSH for Windows NUNCA vamos a poder pasar por que ese no sabe nada de proxy y siempre va a intentar conexión directa, entonces pailas.

[NOTA:] Me he dado cuenta que poner al OpenSSH a servir por el 443 es mejor que hacerlo servir por el 80 ya que algunos ISPs bloquean el puerto 80 (como es mi caso con ETB) pero el puerto 443 no está bloqueado por los ISPs ni por los firewalls, ya que es el puerto del HTTPS.

Bueno, para este ejemplo necesitamos:


Bueno, entonces, ya sabemos que debemos tener configurado el equipo relevador para aceptar conexiones SSH a través de un puerto accesible por el firewall, en este caso vamos a decir que es el puerto 443.

Para este ejemplo voy a mostrar como jugar en el servidor de Lineage 2 de TehGamers, voy a asumir que ya tienen instalado y configurado el cliente y que ya tienen su archivo de hosts en la carpeta correspondiente y que funciona bien (esto es en el equipo donde vamos a jugar, el equipo relevador no es necesario que tenga instalado el cliente ni el archivo de hosts modificado).

Bueno, lo primero que necesitamos es la información de a que puertos se conecta el cliente de Lineage II, esa información está en internet, pero para que no tengan que ir más lejos:

  • 2106 para el servidor de autenticación
  • 7777 para el servidor del juego
  • 2009 para el servidor del game guard
  • 80 se conecta también al de autenticación

Así que ya sabemos que puertos debemos relevar, ahora viene la parte complicada que es hacer todos los tweaks que necesitamos para que esto funcione, así que comencemos:

Lo primero que hay que hacer es modificar el archivo de hosts del equipo donde vamos a jugar (aquel que está dentro del firewall y tiene instalado el cliente) El archivo de hosts del servidor TehGamers luce más o menos así:

# Tehgamers patch edited this three lines...
91.185.193.200 l2authd.lineage2.com
91.185.193.200 l2patcher.lineage2.com
216.107.250.194 nProtect.lineage2.com

Lo que necesitamos entonces es redireccionar esas conexiones al localhost, para ello modificamos el archivo así:

# Direcciones modificados para el port forwarding:
127.0.0.1 l2authd.lineage2.com
127.0.0.1 l2patcher.lineage2.com
127.0.0.1 nProtect.lineage2.com

# Tehgamers patch edited this three lines...
# 91.185.193.200 l2authd.lineage2.com
# 91.185.193.200 l2patcher.lineage2.com
# 216.107.250.194 nProtect.lineage2.com

Noten que lo único que hice fue comentar las líneas originales del servidor y agregar tres nuevas todas apuntando al localhost, la razón de esto es que en el momento en que quiera volver a jugar por fuera del firewall pues invierto las líneas comentadas y ya.

Ahora hay que configurar Putty para que haga el port forwarding, abrimos putty y lo primero que vemos es esto:


Aca debemos introducir los campos necesarios, en Hostname (or IP Address) introducimos la ip del equipo relevador o el dominio que apunta a él y en Port pues el puerto que estemos usando (el 443 en mi caso). Lo siguiente que hacemos es ir a Connection -> Proxy en la parte izquierda, la ventana muestra lo siguiente:


Aquí debemos introducir la información del proxy, pues creo que no hay mucho que explicar, pero por ejemplo en el caso de la universidad será: el proxy es HTTP así que seleccionar esa opción en Proxy Type, luego en la dirección del proxy pues: proxy.unal.edu.co, lo siguiente es el puerto, que es el 8080. Listo, lo único que falta es meter el nombre de usuario y la contraseña del SIA y ya, habremos configurado el Putty para pasar por el proxy de la Universidad que requiere autenticación.

¿No es tan dificil verdad?

[NOTA:] Si están preocupados por que quede registro de que jugaron Lineage dentro de la universidad en el proxy no se preocupen, las conexiones del SSH van encriptadas con al menos 128 bits, así que no hay peligro, lo único que ellos verán serán paquetes encriptados que van al 443 (un puerto en el que es normal que fluya informacion encriptada).

Bueno, ahora hay que configurar el forwarding: eso lo hacemos en Connection -> SSH -> Tunnels:


Aca debemos agregar cada uno de los puertos a los que le vamos a hacer forwarding, para ello debemos tener en cuenta el archivo de hosts, entonces:

  1. Para el puerto 2106 que va al servidor de autenticación, la redirección es: Source port: 2106, Destination: 91.185.193.200:2106
  2. Para el puerto 7777 que va al servidor del juego, la redirección es: Source port: 7777, Destination: 91.185.193.200:7777
  3. Para el puerto 2009 que va al servidor del game guard, la redirección es: Source port: 2009, Destination: 216.107.250.194:2009
  4. Para el puerto 80 que va al servidor de autenticación la redirección es: Source port: 80, Destination: 91.185.193.200:80

Lo que se está haciendo aquí es decirle al Putty que todo lo que entre al computador local (el que tenemos por dentro del firewall) por el puerto 2106 lo reenvie a la 91.185.193.200 en el puerto 2106 haciendo uso del equipo relevador, y así con el resto de los puertos. Notese que coloqué las direcciones IP en vez de los nombres de los hosts, la razón de esto es que el equipo relevador no tiene el archivo de Hosts, si lo tuviera se podrían haber usado los nombres de los hosts.

Cuando estén listos todos los tuneles simplemente hay que darle Open al putty.

Listo, si hacemos un netstat -n -a -p TCP -b veremos entre otras entradas:

TCP 127.0.0.1:7777 0.0.0.0:0
LISTENING 3852
[Putty.exe]

TCP 127.0.0.1:2106 0.0.0.0:0
LISTENING 3852
[Putty.exe]

TCP 127.0.0.1:2009 0.0.0.0:0
LISTENING 3852
[Putty.exe]

TCP 127.0.0.1:80 0.0.0.0:0
LISTENING 3852
[Putty.exe]

Estas entradas en el netstat confirman que el forwarding está listo, ahora debemos probar que efectivamente las direcciones están siendo atendidas por nuestro propio equipo, para ello hacemos ping a las direcciones del archivo de hosts:

Haciendo ping a l2authd.lineage2.com [127.0.0.1] con 32 bytes de datos:

Respuesta desde 127.0.0.1: bytes=32 tiempo<1m ttl="128"
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m ttl="128"
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m ttl="128"
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m ttl="128"

Estadísticas de ping para 127.0.0.1:
Paquetes: enviados = 4, recibidos = 4, perdidos = 0

(0% perdidos),


Tiempos aproximados de ida y vuelta en milisegundos:

Mínimo = 0ms, Máximo = 0ms, Media = 0ms

Si todas son respondidas por el localhost (se resuelven al 127.0.0.1) entonces ya estamos listos, ahra si, abrimos el Lineage y a divertirnos.

[NOTA:] Esto en realidad no funciona, por que después de haber autenticado con el auth server este le dice al cliente en que dirección IP está el servidor del juego al cual se va a conectar, de modo que el cliente nunca hace un DNS Lookup para localizar el servidor del juego y por tanto no hay forma de engañarlo para que se conecte al localhost. Así que, cuando intenta hacer la conexión por el proxy muere.

Para poder hacerlo habría que usar una técnica que se llama ip-forwarding que conciste en engañar al sistema para que mande los paquetes que van a determinada dirección a otra, estoy investigando el asusnto pero todavía no he conseguido nada, para Windows al menos. De todos modos les dejo el post para que sepan como brincarse los Firewall que tienen proxy con autenticación.

2008-10-11

5000x

Bueno, como Terror nada que sube pues ayer con Jorge decidimos probar un server 5000x y fuimos a un server llamado L2Storm, un servidor PVP ultra high rate. Es la primera vez que juego en un servidor así y fue alucinante. Como había quedado con las ganas de crear a mi dagera (inspirada en シャナ) pues empecé con ese personaje:


Mis impresiones sobre este server son muchas, primero ¡miren los buffs! hay 6! ¡SI 6! líneas de buffs, esos buffs que ven ahi valen 50kk y duran 5 horas. Los Scrolls of Enchant encantan de a +5, el primer Scroll deja el arma o armadura en+5, el siguiente en +10, el siguiente en +15 y así sucesivamente.

Venden pociones y elixires en la Shop, y también armas con SA, el arma que ven ahi es un Dinasty Knife +35 con Haste. Venden los hair ornaments, ¡orejitas de neko! :P Kawaii!

La primera hunting area es Ketra Orc Outpost, no hay requisitos para ir ahi, la segunda, no recuerdo cual es, creo que es Wall of Argos y el requisito es que todo el equipo esté en +35 (obviamente el servidor no valida eso, pero es una forma de decirle, si no tiene eso, ni valla por que se va a morir). La siguiente es Monastery of Silence y el requisito es que el equipo esté en +100.

Venden unos huevos que encantan los objetos con probabilidad del 100% y tienen una probabilidad de hacer "saltar" al objeto a +100 de una vez.

Cuando uno mata a otro pj, ese pj dropea adena, así que hay una recompenza por PVPiar, esa debe ser la razón de que en ese servidor la cursed Weapons caigan tan a menudo.

Bueno, mi experiencia, pues nada más empezar mate a un moob y subí a nivel 83, entonces fui donde el Newbie Shop y con las Newbie Tokens compre arma y armadura, pero cuando ya había comprado todo me dí cuenta que la embarré y compré una espada en vez de una daga entonces la vendí y fui y me compre una Angel Slayer S y un Enchant Scroll, la encanté y +5 ¡oooooo! por dios!

Entonces fui a ver si podría cambiar de clase, me volví Elven Scout y luego me volvi Plains Walker, cuando iba a hacer el tercer cambio de clase me dí cuenta que cobraban por él (en ese momento no me había dado cuenta que tenía una Gold Bar en el inventario) entonces decidí no cambiar por ahora, me fui y busqué al Town Buffer, e hice clic en el botón de "All Buffs" y me salió un aviso que decía "You do not have enough adena, go farming" tonces hice clic en Newbie Buffs y el buffer me puso un montón de buffs normalitos (como los del Prohphet y esos)

Me fui al GK y mire las Hunting Grond, en donde decía Newbie Hunting Grounds vi el Monastery of Silence, y pensé "ja, con este equipo voy a partirlos en dos" me fui y ¡oh sorpresa! me dieron una paliza, habían unos pjs con uns armaduras re pasadas y entonces ataque a una de esas Shadow que hay ahi cerca de la entrada y con el primer ataque me mató luego hizo respawn un T-Rex entonces dije "bien, creo que de verdad no es para mi" luego lei el requerimiento y dije "seee realmente no era para mi"

Luego entonces me volvi a poner los Newbie buffs y me fui a Ketra Orc Outpost y empecé a matar bichitos cuando llego una @#$! por detrás y me PKio, y me aparecio "You have droped adena" entonces pensé como "¬¬ mmm si, no la culpo entonces.... me vio como un moob mas :( "

Como ya había colectado algunas adenas entonces me fui y cambie mi equipo, luego fui donde el buffer otra vez y le pedí "All Buffs" y seeeee fue muy tezo entonces ya ahi empecé a verle como más cara al Server. Creo que es bacano para jugar un rato, pero ¡hay ojala que no bajen L2Terror del todo! ¡ahi ya tenía subclass y todo!

Pues bueno, creo que a la larga fue una experiencia bacana... :) y es muy util para probar personajes.

2008-10-10

Saltar Firewalls usando OpenSSH

En la mayoría de instituciones educativas, empresas, bibliotecas, etc. Hay un Firewall (por lo general un ISA Server) que restringe el acceso a Internet a determinados puertos, esto lo hacen con el fin de evitar que los usuarios que se encuentran por dentreo del Firewall accedan a apliciones y protocolos que el Administrador ha marcado como inseguros o que consumen mucho ancho de banda, como por ejemplo MSN Messenger, Radio por Internet o juegos en línea (Como Lineage II).

Para todos nosotros los que nos encontramos atrapados dentro de los Firewall esto es frustante, pero se acabó. Ya no hay que preocuparse por eso, hay una forma de saltar cualquier Firewall y no despierta ninguna sospecha* ya que utiliza los puertos 80 (HTTP) y 443 (HTTPS) para establecer la conexiones, todo parece una inocente conexión a una página de Internet.

* Siempre y cuando el Firewall que estamos intentando saltar no tenga un analizador de paquetes. Ni nadie se extrañe por el continuo flujo de datos a través de HTTP (aunque esto podría ser por ejemplo un vídeo de YouTube).

Bueno, para todos ustedes los impacientes que están leyendo va ahora si el cómo hacerlo:

Que se necesita:
  1. Tener un equipo por fuera del Firewall que tenga instalado OpenSSH y en el que tengamos credenciales de acceso. (Yo uso el PC de mi casa).
  2. Tener un cliente SSH en el equipo que está dentro del Firewall desde el que nos queremos conectar al protocolo / servicio restringido.
¿Nada del otro mundo verdad?

Preparando el equipo Relevador

El equipo relevador es el equipo que tenemos por fuera del Firewall, hay que instalarle el OpenSSH Server y configurarlo para servir a través del puerto 80. Esto se debe a que el Firewall solo nos permite conexiones a ese puerto.

El OpenSSH se puede descargar de Internet de forma gratuita, si el equipo relevador es un equipo Linux pues bastara con buscar el paquete OpenSSH Server en el administrador de paquetes e instalarlo. Si se trata de un equipo con Microsoft® Windows® entonces se puede bajar el OpenSSH para Windows, que es un proyecto de código fuente abierto que está en SourceForge: http://sshwindows.sourceforge.net/

Una vez instalado el Servidor OpenSSH hay que configurarlo:

Configurar el Servidor OpenSSH (En windows)

Bueno, lo primero que hay que configurar es el puerto por el que servirá el servidor (valga la redundancia) como ya se dijo debe ser el puerto 80 como el OpenSSH por defecto sirve por el 22 hay que modificar esta configuración predeterminada, para hacerlo:
  1. Abrimos con el WordPad el archivo C:\Archivos de Programa\OpenSSH\etc\sshd_config
  2. En ese archivo localizamos la línea #Port 22 y debajo de ella agregamos la línea Port 80
El archivo debe quedarnos más o menos así:

# $OpenBSD: sshd_config,v 1.65 2003/08/28 12:54:34 markus Exp $

# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options change a
# default value.

#Port 22
Port 80
#Protocol 2,1
Protocol 2
#ListenAddress 0.0.0.0
#ListenAddress ::

[...]

Listo, ya está configurado el servidor para servir por el puerto 80, ahora lo único que resta es preparar el Key Based Authentication que es lo que nos permitira autenticar en nuestro servidor SSH (si no lo hacemos siempre nos negara el acceso), para hacerlo:
  1. Abrimos una consola y nos dirijimos a C:\Archivos de Programa\OpenSSH\bin\
  2. Allí escribimos estos comandos:
mkgroup -l >> ..\etc\group

y luego:

mkpasswd -l -u nombre_usuario >> ..\etc\passwd

Estos comandos preparan el key based authentication, lo que hace el primer comando es guardar la información de los grupos locales en el archivo ..\etc\group y el segundo crea un password para el usuario nombre_usuario en el archivo ..\etc\passwd.

[NOTA:] nombre_usuario debe ser un nombre de usuario de la máquina local, el nombre que usamos para iniciar sesión en Windows®. Después de esto el OpenSSH permitirá que nombre_usuario y solo nombre_usuario inicie una consola remota en la máquina, si queremos otro usuario pues simplemente ejecutamos el mismo comando con el otro nombre de usuario y ya.

Listo, eso es todo, ahora solamente hay que subir el servicio, para ello ejecutamos:

sc start "OpenSSHd"

Luego de eso el Servidor SSH estará corriendo en el equipo sirviendo por el puert 80.

Configurar el Servidor OpenSSH (En Linux)

Configurar el servidor OpenSSH en Linux es igual de fácil que en Windows, lo que hacemos es lo siguiente:

Localizamos el archivo sshd_config que se encuentra en /etc/ssh y lo editamos con permisos de super usuario, en el archivo vamos a ver algo similar a esto:

# Package generated configuration file
# See the sshd(8) manpage for details

# What ports, IPs and protocols we listen for
Port 22

[...]

Allí editamos la línea del puerto, en vez de 22 escribimos 80 o 443 según el puerto que podamos usar con nuestro ISP. Yo uso normalmente el 443 por que el 80 me lo tienen bloqueado.

Una vez que hemos editado el archivo debemos bajar y volver a subir el servicio del SSH Server, para hacerlo:

$ sudo /etc/init.d/ssh stop
$ sudo /etc/init.d/ssh start

Y listo. En linux no es necesario preparar la key-based authentication ya que el servidor SSH utiliza el sistema de autenticación del sistema operativo así que no hay que hacer nada más.

Hacer el Port Forwarding

Bueno, ahora si viene la parte divertida, conectarse a un puerto "prohibido", a partir de este punto estamos en la máquina que está dento del Firewall. Recordemos que en ese equipo debe estar instalado el cliente SSH. Si no tenemos permisos de instalación podemos buscar un cliente SSH que no lo requiera, no sé si el Putty pueda hacerlo poero valdría la pena probarlo (Posteen sus comentarios si lo intentan)

Para hacer esto más fácil de entender vamos a poner un ejemplo sencillo, digamos que queremos escuchar Anime Academy Radio dentro de la Universidad, normalmente eso no se puede por que el puerto está cerrado pero como ya tenemos nuestra máquina Relevadora por fuera del Firewall entonce si podemos.

Entonces, bueno, cuando entramos a la página de la estación descargamos un .m3u que básicamente nos apunta a la URL donde está el punto de publicación del servidor, la dirección donde apunta ese m3u es: rs1.animeacademyradio.net:8500

Tenemos que hacer que la máquina que está por fuera nos releve al puerto 8500 del servidor rs1.animeacademyradio.net entonces para eso ejecutamos este comando:

ssh ip_maquina -p 80 -l nombre_usuario -L 8500:rs1.animeacademyradio.net:8500

Escribimos nuestra contraseña y ya está, eso nos abre una consola remota y hace el Forwarding del puerto, ya voy a explicar como funciona, pero primero hace falta un paso, después de eso vamos a la página de Anime Academy Radio y hacemos clic en el link como siempre, la conexion fallará por que el proxy de la Universidad no permite conexiones al puerto 8500, entonces, en el WinAmp le damos clic derecho a la entrada de la lista de reproducción y seleccionamos Editar Entrada y ahi donde dice rs1.animeacademyradio.net escribimos localhost y volvemos a darle reproducir, ya debería funcionar.

[NOTA:] Se puede agregar la opción -N al comando para que no nos abra una consola remoto sino que solo haga el Port Forwarding, en Windows® igual la ventana de la consola quedará bloqueada entonces pues da como lo mismo.

Explicación

Bueno, ahora la explicación de lo que hicimos. En el comando que escribimos vemos lo siguiente:
  • ssh es el nombre del comando (no se necesita más explicacion)
  • ip_maquina es la IP (o en caso de que se tenga) el nombre de la máquina Relevadora
  • -p 80 es para decirle al SSH que se conecte al puerto 80 en ves de al puerto 22 (que es el puerto predeterminado)
  • -l nombre_usuario Es para decirle al OpenSSH que logee en la máquina remota con el nombre de usuario nombre_usuario. Si no se especifica esta opción el SSH logeara con el usuario actual.
  • -L 8500:rs1.animeacademyradio.net:8500 Esta es la parte teza del comando, lo que esta parte del comando le dice al OpenSSH es: Todos los paquetes que lleguen a la máquina local a través del puerto 8500 mandelos a la máquina remota (ip_maquina) y cuando lleguen allá digale al SSH Server que los mande a rs1.animeacademyradio.net en el puerto 8500. ¿Se entiende?
Así por ejemplo se pueden hacer otras cosas, digamos que por ejemplo tenemos un servidor de MySQL que se está ejecutando en nustro PC de la casa, pero claro, el cochino proxy de la universidad no nos permite conectarnos al puerto 3306 entonces:

ssh ip_maquina -p 80 -l nombre_usuario -L 3306:localhost:3306

Y listo, este comando a veces resulta un poco confuso pero lo voy a explicar en detalle: Le estamos diciendo a la máquina local, todo lo que le llegue por el 3306 mandelo a la máquina remota (ip_maquina) y digale al SSH Server que está allá que cuando llegue lo mande a localhost en el puerto 3306 ¿Localhost es la máquina donde ejecutamos el ssh o donde está el SSH Server? Es donde está el SSH Server, lo que colocquemos en la parte -L del comando ssh lo resuelve el sercvidor SSH y para el servidor SSH localhost es el pc donde se ejecuta.

De esta misma manera podemos redirigir cualquier puerto. Es muy util si se utiliza bien. El manual del SSH ofrece más información de como usar estas características, hay incluso otras opciones muy interesantes, como por ejemplo la opción -R, les recomiendo que la vean, por ahora voy a explicar como funciona la opción -L:

La opción -L tiene tres argumentos, por llamarlos así puerto local, destino y puerto remoto, estos argumentos se colocan separados por : así:

puerto_local:destino:puerto_remoto

Entonces: puerto_local es el puerto que el comando ssh escuchara en la máquina local. Cuando ejecutamos el comando ssh se abre un puerto en la máquina local y escucha por ahi, podemos constatarlo con un netstat -n -a. destino es la máquina FINAL a donde queremos acceder (donde está el servicio al que no podemos acceder por culpa del proxy). Recuerden que ese nombre o dirección la resuelve el Servidor SSH, por eso en el ejemplo del MySQL localhost resulta siendo la máquina donde está el SSH Server corriendo, y no donde ejecutamos el ssh.

Por ultimo el es el puerto_remoto puerto al que queremos conectarnos en la máquina FINAL.

Me lleva.... :C pero no quiero perder el puerto 80

A veces tenemos en nuestra máquina un servidor HTTP de verdad corriendo en el 80, en ese caso podemos usar el 443 (el HTTPS) para hacer que el OpensSSH Server sirva por ahi, en ese caso el comando del ejemplo quedaría así:

ssh ip_maquina -p 443 -l nombre_usuario -L 8500:rs1.animeacademyradio.net:8500

Noten el cambio en el -p.

Notese que esto del Port Forwarding permite conectarse al puerto que uno quiera en la máquina que uno quiera y parece que la conexión siempre para a través del puerto 80. Esto quiere decir (supongo que ya se habrán dado cuenta) que si uno tiene una máquina ejecutando el SSH Server por el puerto 80 no hay límite respecto a lo que se puede hacer, ¡no hay Firewall que pueda detenernos!

¡Tomen eso malditos de la DANIC!

Por ahora voy a dejar aquí, si tienen dudas o quieren mayores explicaciones me pueden escribir al correo electrónico o postear su comentario por aquí, estaré pendiente. También los que me conocen me pueden comentar por MSN.

Hay otros trucos en la bolsa por ahi pero ya no quiero escribir más por hoy, después postearé más.

Se cuidan

さようなら