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.