redireccionamientod e puertos con iptables

Miguel Oyarzo O. admin en aim.cl
Lun Nov 9 18:00:50 CLST 2009


Rodrigo Valenzuela escribió:
> On Sun, 08 Nov 2009 16:16:48 +0100
> "Miguel Oyarzo O." <admin en aim.cl> wrote:
> 
>> rvr en vtr.net escribió:
>>> Estimados:
>>>
>>> El cuento es el siguiente, tengo un proveedor (Telmex) el cual vamos a 
>>> dar de baja a fin de mes. Todo me funciona bien, mi red interna 
>>> (usuarios y servidores) sales por mi linux con iptables, cuento corto, 
>>> ningún problema.
>>>
>>> El proveedor nuevo instalo el cablerio nuevo y su aparato (obviamnete 
>>> hay IP nueva GTD ) y ahí viene el problema.
>>>
>>> Acá alojamos varios sitios y mientras no se haga el cambio de todos los 
>>> sitios a la IP nueva no podemos llegar y cambiar el enlace, por lo que 
>>> monté otro equipo con Linux + iptables, y lo que quería hacer era 
>>> redireccionar todas las peticiones al puerto 80 en la IP nueva hacia mi 
>>> servidor apache.
>>>
>>> La ip interna del servidor web es 192.168.0.1, y el Linux + iptables 
>>> nuevo tiene la 192.168.0.3., por lo que entre ellos se ven sin 
>>> problemas. El problema viene cuando llega la petición a la IP nueva y la 
>>> reenvía bien hacia adentro con una regla PREROUTING, pero el server 
>>> viejo 192.168.0.1 ve que le llego una peticion desde la IP nueva, puerto 
>>> 80 y por ende trata de contestar usando el GW del proveedor viejo 
>>> (gateway por defecto) , por lo que la conexión se queda esperando 
>>> eternamente.
>>>
>>> Cuál es el mejor enfoque para tratar este problema? Creo que no me 
>>> enrede mucho
>>>
>>> Gracias!!!
>>
>> Es mas facil de lo que piensas  (no requieres redirigir puertos)
>>
>> 1) Agrega una nueva interfaz de red a tu maquina y ponle la IP de tu 
>> nuevo proveedor (tendras 2 IP, pero un solo GW, el de tu antiguo ISP)
>> entonces,
>> 2) mediante el comando "ip" crea una segunda tabla de rutas (TABLAX) que 
>> tenga el gateway nuevo o el que tu quieras
>>
>> usa esto si quieres:
>> #ip route flush table TABLAX
>> #ip route show table main | grep -Ev ^default | while read ROUTE ; do 
>> $RUTA table TABLAX $ROUTE ; done
>> #ip route add default dev eth1 via $GW_GDT table TABLAX
>>
>> Esto te creara una nueva tabla de rutas llamada TABLAX.
>>
>> 3) usando iptables --set-mark y la tabla "mangle" marca cada paquete que 
>> entre por esa nueva intefaz, con un numero X
>>
>> 4) Asocia todos los paquetes marcados con X a la nueva tabla TABLAX
>> Algo como #ip rule add fwmark X table TABLAX
>>
>> Es todo, el kernel hara lo demas, peticiones por la interfaz vieja se 
>> iran por la tabla de rutas default "main" (TELMEX) y peticiones que 
>> entren por la nueva interfaz se iran por la tabla de rutas TABLAX (GTD).
> 
> 
> Exactamente esa es la solución que me interesó en una primera instancia pero me surgieron muchas dudas, por lo que empecé a leer más, espero tener más tiempo en la semana para centrarme en esto.
> 
> La duda que tenía es que según este enfoque mi servidor tendría que estar expuesto directamente a inet, y lo que tengo en la oficina es un tarro que hace de FW delante de mi red. De hecho por acá estoy partiendo http://linux-ip.net/html/adv-multi-internet.html
> 
>> Suerte!
> 
> y mucha lectura, gracias!!


En realidad el tema de si las IPs son publicas o privadas es irrelevante 
en esta solucion. El trafico entrará por una u otra interfaz y eso es lo 
que mangle marcara y el kernel re-enrutará al gw deseado.


=====================================
Miguel A. Oyarzo O.
Ingeniería en Redes y Telecomunicaciones
Austro Internet S.A.  &  INALAMBRICA S.A.
Teléfono: [+05661] 710030
Punta Arenas - Chile
Linux User: # 483188 - counter.li.org
=====================================






Más información sobre la lista de distribución Linux