2010-06-08

Conectarse a un Servidor Lineage II a través de un Túnel SSH

Bueno, antes que nada muchas gracias a Manuel Gulias por leer las entradas anteriores e interesarse en el asunto y también por tomarse el tiempo para escribirme y despertar de nuevo mi interés en este cuento del tunneling.

Como ya saben estos temas ya los había tratado en el blog en estas dos entradas:

Por eso mismo no voy a explicar aquí los detalles de configuración del servidor SSH y etc. solo me voy a concentrar en hablar de el tema que quedó pendiente que es la conexión al game server.

De que trata esta entrada

Esta entrada es un tutorial que pretende de la forma más gráfica posible ilustrar una manera de conectarse a un servidor de Lineage II y poder jugar cuando se está detrás de un Firewall que no permite la conexión directa a los puertos en los que funciona el juego haciendo uso de un túnel SSH.

Para poder hacer uso de esta técnica hay que tener un equipo relevador por fuera del firewall que esté configurado para servir el protocolo SSH por un puerto que sea accesible para el equipo que está dentro del firewall. Para mayor información sobre este tema leer la entrada: Saltar Firewalls usando OpenSSH

Un comentario más, esta técnica solo funciona con los servidores que no modifican el cliente sino que alteran el archivo de hosts para lograr la conexión. Es posible que funcione con un servidor que altere el cliente pero eso no está cubierto en esta guía

Preliminares

Bueno antes que nada, para usar la técnica que explicaré a continuación el equipo que está dentro del firewall debe tener una dirección IP estática, por lo que si el equipo está recibiendo una dirección por DHCP habrá que tomar nota de las direcciones que el DHCP entrega y luego fijar estos parámetros en la configuración, a continuación veremos como hacerlo:

Vamos por Inicio → Panel de Control.

Allí, bajo la categoría "Redes e Internet" damos clic en el vínculo "Ver el estado y las tareas de red"

y en la ventana que se abre en el panel de la izquierda seleccionamos "Administrar conexiones de Red"

Ahora veremos una ventana con las conexiones de red con las que cuenta nuestro equipo, vamos a dar clic con el botón secundario del ratón en la conexión que usamos y a seleccionar "Estado" en el menú que se despliega:

En la venta que se abre seleccionamos "Detalles"

Aquí deberemos tomar nota de los siguientes datos: IPv4 Dirección IP, IPv4 Mascara de subred, IPv4 Puerta de enlace predetermina, IPv4 Servidores DNS. Estos datos los necesitaremos más adelante así que los anotaremos por allí en algún lugar y luego cerramos todas las ventanas que abrimos.

Información del servidor

Bien, también vamos a necesitar del servidor al que nos vamos a conectar la siguiente información:

  • Dirección IP del servidor de autenticación
  • Dirección IP del servidor del juego
  • Puerto del servidor de autenticación (normalmente 2106)
  • Puerto del servidor del juego (normalmente 7778)

Esta información se puede sacar normalmente del archivo de hosts que la mayoría de servidores alteran. El archivo de hosts está en C:\windows\system32\drivers\etc

Para este ejemplo nos vamos a conectar al servidor L2TheGame, la información de dicho servidor es:

  • Servidor de autenticación: 78.46.17.80
  • Servidor del juego (Phoenix [500x]): 78.46.17.80
  • Puerto del servidor de autenticación: 2106
  • Puerto del servidor del juego: 7778

Tip:

Lo mejor para realizar esta ténica de tunneling es jugar el Lineage II abriendo directamente l2.exe (que está en la carpeta system) para así evitar pasar por el servidor del nProtect y el l2patcher. Es lo que yo recomiendo y es así como llevaré esta guía.

Modificación del archivo de hosts

Lo primero que haremos será modificar el archivo de hosts. El archivo de hosts está en C:\windows\system32\drivers\etc, como se trata de un archivo de sistema para poder modificarlo tendrás que ejecutar el bloc de notas con privilegios de administrador (Clic derecho → Ejecutar como administrador) y abrir el archivo.
En el archivo verás tres líneas parecidas a estas:

# The patch edited this three lines...
78.46.17.80 l2authd.lineage2.com
84.246.123.71 l2patcher.lineage2.com
216.107.250.194 nProtect.lineage2.com

Solo modificaremos la primera línea, agregaremos un # al inicio y luego agregaremos otra línea debajo de ella, el archivo debe verse entonces así:

# The patch edited this three lines...
# 78.46.17.80 l2authd.lineage2.com
127.0.0.1 l2authd.lineage2.com
84.246.123.71 l2patcher.lineage2.com
216.107.250.194 nProtect.lineage2.com

Ahora probaremos que la resolución de DNS para el servidor l2authd.lineage2.com haya sido cambiada al localhost (127.0.0.1), para ello abrimos una ventana de consola y ejecutamos:

ping l2authd.lineage2.com

A lo que el sistema debe responder:

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

Configurar la tarjeta de red

Bueno, aquí es donde viene todo el secreto de esta entrada y en lo que se diferencia de las anteriores. Vamos a configurar una doble dirección IP en nuestra tarjeta de red, para ello vamos de nuevo a Inicio → Panel de Control

Nuevamente seleccionamos "Ver el estado y las tareas de red" bajo la categoría "Redes e internet"

y nuevamente en el vínculo "Administrar conexiones de red"

nuevamente clic con el botón secundario del ratón sobre la conexión y esta vez seleccionamos "Propiedades" en el menú que se despliega:

Buscamos y seleccioamos en la lista el "Protoclo de Internet versión 4 (TCP/IPv4)" y damos clic en el botón "Propiedades"

Seleccionamos "Usar la siguiente dirección IP" y damos clic en el botón "Opciones avanzadas..."

Arriba donde dice "Direcciones IP" damos clic en "Agregar"

Primero agregaremos la dirección IP normal del equipo (la que anotamos en la sección "Preliminares" más arriba), también introduciremos la máscara de subred y damos clic en Aceptar. Luego volvemos a dar clic en el botón "Agregar" y agregamos otra IP. En este caso agregaremos la dirección IP del servidor del juego, en el caso del ejemplo 78.46.17.80 y para acompañarla la máscara de subred 255.255.255.0

Ok, ahora en donde dice "Puertas de enlace predeterminadas" damos clic en el botón agregar y agregamos la puerta de enlace predeterminada de nuestra conexión (que anotamos en la sección "Preliminares") dejamos que windows se encargue de la métrica por lo que dejamos la casilla seleccionada

Ahora damos clic en la pestaña DNS

luego, donde dice "Direcciones de servidor DNS por orden de uso" damos clic en "Agregar" y agregamos los servidores DNS de nuestra conexión:

Damos clic en "Aceptar" en todas las ventanas abiertas hasta que lleguemos nuevamente a la ventana donde aparecen las conexiones de red. Antes de continuar debemos probar que aún podamos acceder a Internet, para hacerlo abrimos el navegador y buscamos cualquier página de Internet, si podemos verla, estamos listos para seguir adelante.

También sería bueno verificar que la tarjeta de Red quedó con ambas direcciones IP. Para ello abrimos una consola y ejecutamos:

ipconfig

Y verificamos que la conexión tenga ambas direcciones IP:

Adaptador LAN inalámbrico Conexión de red inalámbrica:

   Sufijo DNS específico para la conexión. . :
   Vínculo: dirección IPv6 local. . . : fe80::389d:74c8:67ee:f52c%11
   Dirección IPv4. . . . . . . . . . . . . . : 78.46.17.80
   Máscara de subred . . . . . . . . . . . . : 255.255.255.0
   Dirección IPv4. . . . . . . . . . . . . . : 192.168.0.174
   Máscara de subred . . . . . . . . . . . . : 255.255.255.0
   Puerta de enlace predeterminada . . . . . : 192.168.0.1

Crear el túnel

Bueno, ahora llegó el momento de crear el túnel SSH que nos hará saltar el firewall. Para este ejemplo utilizaremos el Putty por que tiene interfaz gráfica pero igual serviría el SSH normal por consola.

Abrimos el Putty:

Donde dice "Host Name (or IP Address)" escribimos la dirección IP del equipo relevador (el equipo que está por fuera del firewall). Si el equipo relevador está sirviendo por un puerto diferente al 22 (por ejemplo el 80 como lo discutimos en las entradas anteriores) habrá que especificar ese puerto en la casilla de al lado.

Luego en el árbol de la izquierda vamos a Connection → SSH → Tunnels

Primro nos aseguramos que la casilla de verificación "Local ports accepts connections from other hosts" esté marcada y luego debajo de donde dice Add new forwarded port vamos a escribir los siguientes datos:

Source port: 2106
Destination: 78.46.17.80:2106

Nos fijamos que "Local" y "Auto" estén seleccionados y damos clic en "Add"
En este paso acabamos hacer el túnel para el servidor de autenticación, por lo que deberás remplazar 78.46.17.80 por la dirección IP del servidor de autenticación del server donde juegas.

Seguidamente agregaremos el forwarding para el servidor del juego:

Source port: 7778
Destination: 78.46.17.80:7778

Nos fijamos que "Local" y "Auto" estén seleccionados y damos clic en "Add"

Al terminar la ventana del Putty debe verse más o menos así.

Aclaración:

En el caso del servidor Phoenix de L2 TheGame tanto el servidor de autenticación como el servidor del juego están en la misma máquina (tienen la misma IP), sin embargo para muchos servidores de Lineage II esto no es así. Fíjate que hayas hecho el forwarding a las direcciones correctas o la conexión fallará.

Bueno, ahora te recomiendo que guardes la sesión del Putty para usarla cada vez que quieras jugar y también por si algo fallara para que puedas corregir los errores sin tener que volver a escribirlo todo. En el árbol de la izquierda selecciona el primer Item (Session) y donde dice "Saved sessions" escribe un nombre para la sesión, por ejemplo "L2" y luego haz clic en "Save".
La siguiente vez que abras el Putty podrás hacer clic en la entrada de la lista y luego en "Load" y Putty cargará nuevamente todos los parámetros (incluidos los túneles).

Conectar y probar

Ok. Al parecer ya todo está listo para conectar y divertirse. Haz clic en el botón "Open" del Putty para establecer la conexión, logea con un nombre de usuario y una constraseña válidas.

Antes de iniciar Lineage fíjate que Putty esté preparado para hacer el Port Forwarding. Para ello abre una consola y ejecuta:

ipconfig -n -a -p tcp

Deben aparecer dos puertos abiertos en escucha, el 2106 y el 7778:

  TCP  0.0.0.0:2106    0.0.0.0:0    LISTENING
  TCP  0.0.0.0:7778    0.0.0.0:0    LISTENING

Si todo va bien hasta aquí solo restará abrir el cliente de Lineage II y conectarse y ya debes poder jugar normal. Felicidades!

Detalles técnicos

Ahora explicaré un poco por que funciona lo anterior. Como habran notado usamos la característica que tiene Windows de permitir más de una dirección IP en la misma tarjeta de red (aunque también se podría haber hecho con dos NICs si esa característica no estuviera disponible).

Lo que hicimos fue colocar la dirección IP del servidor del juego en la tarjeta de red con una máscara de subred de 255.255.255.0 y es allí donde radica el secreto de este asunto

Cuando una sistema va a establecer una conexión con otro sistema lo primero que hace es hacer un AND binario entre su propia dirección IP y su máscara de subred, en nuestro caso:

078.046.017.80
255.255.255.0
---------------
78.46.17.0

Luego toma la dirección la que se va a conectar y hace un AND binario con su máscara de subred, en nuestro caso:

078.046.017.80
255.255.255.0
---------------
78.46.17.0

Si las dos direcciones resultantes de las operaciones anteriores son diferentes el sistema sabe que debe tratar de enviar la solicitud de conexión a través de la puerta de enlace por que la dirección de destino está en otra red, más, si son iguales (lo que sucede en este ejemplo) el sistema sabe que la dirección de destino está dentro de su propia red así que no trata de enviar la solicitud a través de la puerta de enlace sino a través de la red local.

Como establecimos que nuestra dirección IP es 78.46.17.80 cuando la solicitud es enviada a través de la red local quien la recibe es nuevamente nuestra propia tarjeta de red.

Así pues, lo que hemos hecho aquí es engañar de cierta forma al sistema para que envíe una petición que normalmente enviaría a través de la puerta de enlace de vuelta a nuestro sistema y hemos hecho que Putty escuche conexiones entrantes en el puerto 7778 (como si hubiera un servidor de Lineage II corriendo en la máquina local)

Lo que sucede en resumen es:

  1. Abrimos el cliente de Lineage y escribimos nuestros datos de acceso
  2. Lineage resuelve la dirección l2authd.lineage2.com, como hemos agregado una entrada al archivo de hosts que dice que esa dirección es la 127.0.0.1 Lineage II envía una petición de acceso al localhost en el puerto 2106
  3. Putty está escuchando en el puerto 2106 cuando llegá la petición Putty la reenvía con ayuda del equipo relevador al servidor real de autenticación de Lineage II (el cliente no nota la diferencia)
  4. La autenticación sucede y Lineage II muestra la lista de servidores que el servidor de autenticación envió de vuelta.
  5. Seleccionamos un servidor para conectarnos
  6. En este caso Lineage II no trata de resolver ninguna dirección sino de establecer una conexión directa con el servidor. Pone una petición en la red que va a la dirección IP del servidor del juego (en el caso del ejemplo 78.46.17.80)
  7. Windows hace la operación binaria que mencionamos anteriormente y concluye que esa dirección está dentro de la red local. Pone la petición y esta regresa de vuelta a la tarjeta de red.
  8. Putty está escuchando en el puerto 7778 de modo que recibe la petición y la reenvía con ayuda del equipo relevador al servidor del juego real. Se establece la conexión y Lineage II muestra los personajes que hay en nuestra cuenta.

Mientras que juguemos Putty, y el servidor SSH que corre en el equipo relevador mantendrán establecida la conexión permanentemente. El cliente de Lineage II no notará la diferencia y el Firewall pensará que la conexión va a un puerto admitido.

Ten en cuenta que puede haber lag extra:

Recuerda que las conexiones SSH van encriptadas, por lo que tu equipo debe encriptar los datos antes de enviarlos al equipo relavador y luego este a su vez debe desencriptarlos para enviarlos al servidor del juego, adicionalmente estás agregando un nodo más a la conexión. Todo lo anterior puede causar lag extra por lo que la experiencia nunca será igual a la que tendrías con una conexión directa.