Redirigiendo tráfico

He estado revisando para cambiar el servidor a otro nuevo, con una versión limpia y actualizada de Debian (la nueva versión Squeeze), por lo que, toca migrarlo todo.

Esto puede constituir un pequeño desastre para todos los servicios que tengo montados, ya que hay que copiar todos los datos al nuevo servidor, tirar el servicio antes para que los datos no cambien, y levantar los servicios en el nuevo, asegurándose de que todo funcione… vale, por ahí, ya sé que van a ser un par de horas… pero el DNS… con su propia caché y demás, eso sí puede ser un gran problema.

Por ese motivo me puse a buscar y, a modo de post-it, me lo dejo aquí escrito para futuro, y por si alguien lo necesita también. Básicamente es: cómo redirigir el tráfico de un servidor a otro, empleando iptables.

Redirigiendo…

Vale, estoy en el antiguo servidor, tengo email y web. Los puertos por los que llega la comunicación, todos TCP, y posibilidad de SSL, pero en eso no hay mayor problema. En esencia tengo que cuidarme de las peticiones a los puertos: 80 (http), 443 (https), 25 (smtp), 465 (ssmtp), 110 (pop3), 995 (pop3s), 143 (imap) y 993 (imaps).

Buscando, vi esta web sobre como redireccionar tráfico, por lo que, escribí:

echo 1 > /proc/sys/net/ipv4/ip_forward
export IP=XXX.XXX.XXX.XXX
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination $IP
iptables -t nat -A POSTROUTING -p tcp -d $IP --dport 80 -j MASQUERADE

NOTA: como es lógico, hay que cambiar XXX.XXX.XXX.XXX por la IP del servidor al que se quieren redireccionar las peticiones al puerto 80.

Lo que hacen estos comandos es:

  1. Indica al kernel que puede hacer forward de los paquetes que pasen por su interfaz de red.
  2. Indica al sistema que los paquetes entrantes al puerto 80 sean dirigidos a la $IP indicada.
  3. Indica al sistema que los paquetes que deban de salir, se emascaren modificando su IP de origen por la propia.

Con esto conseguimos que la comunicación hacia el puerto 80 pase sin problemas al otro servidor. Lo único, es que se desvirtúan las estadísticas, ya que para el servidor web, todas las peticiones son del servidor que redirecciona las peticiones, pero si es un recurso temporal (como es mi caso), no tiene mucha o mayor importancia ;-)

¿Cómo funciona el enrutado?

Encontré también otra página donde se explica bastante bien (aunque algo esquemática) la forma en que funciona el enrutado de paquetes empleando iptables, el gráfico:

!(/assets/images/posts/ipmasq-small.gif)

Como puede verse, el paquete pasa por la cadena de reglas PREROUTING al entrar, es procesado y, cuando se detecta que es para otra máquina, se pasa a FORWARD y después a POSTROUTING, donde se pueden agregar reglas de modificación antes de que el paquete sea entregado a su destino.

Recomiendo echar un vistazo al enlace dado para ampliar más sobre el tema.

Conclusiones

Nada es perfecto al 100%, por ejemplo, esto mismo lo probé con XMPP, y no funciona correctamente, ya que la comunicación de s2s del protocolo espera que los mensajes lleguen del dominio (e IP) al que se solicita información, mientras que, estos mensajes, en su mayoría, al estar direccionados al dominio, no es la misma IP. No obstante, como medida temporal y sobretodo para HTTP, el apaño lo da.