Problema con iptables [SOLUCIONADO]

Iniciado por malonecc, 26 Septiembre 2012, 21:49 PM

0 Miembros y 1 Visitante están viendo este tema.

malonecc

Hola a todos,

Me encuentro con un problema que no doy solucionado, y empiezo a pensar que me encuentro ante una limitación de iptables.
Paso a describirlo:

Tengo un equipo Debian haciendo de enrutador.

Por el eth0.2 recibo peticiones TCP en el puerto 10801 o 10802 y destino IP 20.0.0.2

Por el eth0.3 debo sacar los paquetes del eth0.2 transformados del siguiente modo:

Si recibo por el 10801 lo envío a la IP 20.0.0.2 puerto 10800 con dirección de origen 50.0.0.2
Si recibo por el 10802 lo envío a la IP 20.0.0.2 puerto 10800 con dirección origen 60.0.0.2

Total que se trata de un NAT de dirección origen y de puerto destino.

He conseguido que me funcionen las dos reglas por separado, pero nunca las dos a la vez. Por ejemplo con:

iptables -t nat -p tcp -A PREROUTING -d 20.0.0.2 --dport 10801 -j DNAT --to-destination 20.0.0.2:10800
iptables -t nat -p tcp -A POSTROUTING -d 20.0.0.2 --dport 10800 -j SNAT --to 50.0.0.2

Con estas reglas, si añado:

iptables -t nat -p tcp -A PREROUTING -d 20.0.0.2 --dport 10802 -j DNAT --to-destination 20.0.0.2:10800

Me saldrían todos los paquetes con origen 50.0.0.2, no hay manera de distinguir los que entran por el 10802 para ponerles origen 60.0.0.2

Entiendo que el problema es el orden del PREROUTING y del POSTROUTING.
Me imagino que lo ideal sería utilizar dos equipos Debian, el primero que haga el cambio de SOURCE y el segundo el DESTINATION, pero me resisto a creer que no pueda hacer de algún modo con un solo equipo.
He probado a poner mas adaptadores de red uniendo dos de ellos con un cable, pero los paquetes se enrutan internamente y pasan por iptables (o eso me parece).

Quizás haya algún modo combinando un loopback, no sé, ya estoy un poco perdido, cualquier idea será bienvenida.




cpu2

Hola

No entiendo muy bien tú pregunta, pretendes que los paquetes que recibas desde eth0.2, se traduzcan ala dirección que desees y sean redireccionados a la dirección 20.0.0.2?

Un saludo

malonecc

Lo que trato de hacer es que a cada paquete que llegue debo cambiarle el puerto destino  al 10800 y la IP origen se cambia en función del puerto destino original:

Si el puerto destino original era 10801 entonces debo ponerle ip origen 50.0.0.2
y
Si el puerto destino original era 10802 entonces le debo poner ip origen 60.0.0.2

En todos los casos el puerto destino quedará cambiado al 10800.


Reconozco que un poco liante si que es...

dato000

Interesante este problema, no se tanto de IPTables, pero quiero aportar lo que pueda.

Ummm no has probado además del Post-Pre, añadir conexiones que entran y salen, y luego con eso, redireccionas?


No estoy seguro si se aplicarian de esa forma:

Citariptables -t nat -p tcp -A INPUT -d 20.0.0.2 --dport 10801 -j DNAT --to-destination 20.0.0.2:10800
iptables -t nat -p tcp -A OUTPUT -d 20.0.0.2 --dport 10801 -j DNAT --to-destination 20.0.0.2:10800
iptables -t nat -p udp -A INPUT -d 20.0.0.2 --dport 10801 -j DNAT --to-destination 20.0.0.2:10800
iptables -t nat -p udp -A OUTPUT -d 20.0.0.2 --dport 10801 -j DNAT --to-destination 20.0.0.2:10800

iptables -t nat -p tcp -A INPUT -d 20.0.0.2 --dport 10800 -j SNAT --to 50.0.0.2
iptables -t nat -p tcp -A OUTPUT -d 20.0.0.2 --dport 10800 -j SNAT --to 50.0.0.2
iptables -t nat -p tcp -A INPUT -d 20.0.0.2 --dport 10800 -j SNAT --to 50.0.0.2
iptables -t nat -p tcp -A OUTPUT -d 20.0.0.2 --dport 10800 -j SNAT --to 50.0.0.2

La verdad aún no se de que va el nat, snat, dnat, Post y Pre routing, pero si lo que quieres es colocar un puente, creo que primero debe comprobarse que entran las peticiones (claro que no se muy bien como funciona eso, va con ICMP y ACK) y dar la salida desde el puente.

Voy a averiguar.



Epzylon

Te tiro una idea para hacer lo que queres:

iptables -t mangle -A PREROUTING -p tcp --dport 10801 -j MARK --set-mark 801
iptables -t mangle -A PREROUTING -p tcp --dport 10802 -j MARK --set-mark 802

iptables -t nat -A PREROUTING -p tcp --dport 10801 -j DNAT --to-destination 20.0.0.2:10800
iptables -t nat -A PREROUTING -p tcp --dport 10802 -j DNAT --to-destination 20.0.0.2:10800

iptables -t nat -A POSTROUTIGN -m mark --mark 801 -j SNAT --to-source 50.0.0.2
iptables -t nat -A POSTROUTIGN -m mark --mark 801 -j SNAT --to-source 60.0.0.2


En este blog, explico el tema de mark
http://www.netsecure.com.ar/2008/12/09/netfilter-iptables-v/


Decime si funca

malonecc

Hola,

Muy buenos ambos aportes!

Me pongo con ello y os cuento los resultados.

malonecc

Fantástico, Epzylon!


Efectivamente el truco estaba en "marcar" los paquetes previamente. No sabía que existía esa función, pero me la apunto.

Funciona a la perfección, al final, luego de unas pequeñas correciones la cosa ha quedado así:

iptables -t mangle -A PREROUTING -p tcp --dport 10801 -j MARK --set-mark 801
iptables -t mangle -A PREROUTING -p tcp --dport 10802 -j MARK --set-mark 802

iptables -t nat -A PREROUTING -p tcp --dport 10801 -j DNAT --to-destination 20.0.0.2:10800
iptables -t nat -A PREROUTING -p tcp --dport 10802 -j DNAT --to-destination 20.0.0.2:10800

iptables -t nat -A POSTROUTING -m mark --mark 801 -j SNAT --to-source 50.0.0.2
iptables -t nat -A POSTROUTING -m mark --mark 802 -j SNAT --to-source 60.0.0.2

Solamente se me ocurren un par de cuestiones que son mas curiosidad que otra cosa,

1.- ¿Cuantas marcas distintas se pueden establecer simultáneamente?

2.- ¿Las marcas deben estar dentro de un rango o sirve cualquier numero entero?

De nuevo, un millón de gracias por las respuestas e ideas.


Epzylon

Las marcas podes poner son muchas, aunque no se el numero, te aseguro que te van a alcanzar

Es importante tener en cuenta que estas marcas solo se ven dentro del linux que las ejecutas,
es decir es un funcionamiento interno del kernel y no "viajan" en el paquete.

Pd: que groso netfiler!
pd2: avisame cualquier cosa!

Saludos

dato000

Cita de: Epzylon en 28 Septiembre 2012, 16:47 PM
Te tiro una idea para hacer lo que queres:

iptables -t mangle -A PREROUTING -p tcp --dport 10801 -j MARK --set-mark 801
iptables -t mangle -A PREROUTING -p tcp --dport 10802 -j MARK --set-mark 802

iptables -t nat -A PREROUTING -p tcp --dport 10801 -j DNAT --to-destination 20.0.0.2:10800
iptables -t nat -A PREROUTING -p tcp --dport 10802 -j DNAT --to-destination 20.0.0.2:10800

iptables -t nat -A POSTROUTIGN -m mark --mark 801 -j SNAT --to-source 50.0.0.2
iptables -t nat -A POSTROUTIGN -m mark --mark 801 -j SNAT --to-source 60.0.0.2


En este blog, explico el tema de mark
http://www.netsecure.com.ar/2008/12/09/netfilter-iptables-v/


Decime si funca

Buen dato, estoy revisando el blog, muy bueno.