tabla mangle y rutas multiples

Jens Hardings jhp en csol.org
Mar Ene 10 15:03:59 CLST 2006


Miguel Oyarzo wrote:

>At 10:42 10-01-2006, Jens Hardings wrote:
>  
>
>>Miguel Oyarzo wrote:
>>
>>    
>>
>>># regla por defecto (va primero en mangle?)
>>>iptables -A PREROUTING -i eth0 -t mangle -j MARK --set-mark 2
>>>iptables -A PREROUTING -i eth2 -t mangle -j MARK --set-mark 2
>>>iptables -A PREROUTING -i eth3 -t mangle -j MARK --set-mark 2
>>># regla especifica
>>>iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80   -j MARK --set-mark 1
>>>
>>>si subo la especifica primero, entonces el paquete no se marca directamente.
>>>
>>>la salida de # iptables -L -n -v -t mangle   igual me muestra las reglas default arriba.
>>>
>>>Alguien puede confirmar esto? porque no funciona como la tabla filter?
>>> 
>>>
>>>      
>>>
>>Se supone que la marca es una sola, así que la última regla que calza
>>elimina la(s) marca(s) anterior(es).
>>    
>>
>
>mmm... no creo que funcione asi:
>
>la primera coincidencia descarta el resto de las reglas.
>  
>

No, eso es sólo para los target ACCEPT, REJECT y DROP. Los demás targets
pueden retornar, y en particular el MARK y LOG siempre retornan.

>osea, el paquete entra y a la primera regla que concuerde se aplica la accion.
>por lo menos la tabla filter funciona de esa manera.
>
>
>  
>
>>Al parecer no se puede entregar una máscara para marcar solamente algunos bits del paquete (que parece es lo
>>que intentas hacer), pero lo que sí se puede hacer es marcar la conexión
>>(utilizando máscara para modificar sólo algunos bits) y luego se puede
>>aplicar la marca de la conexión al paquete.
>>    
>>
>
>En realdidad no he intentando marcar conexiones.
>Lo que hago es marcar paquetes y redirijir los paquetes con dicha marca a una ruta especifica.
>No encontre ningun inconveniente en hacer eso y hasta aqui el trafico 
>hace exactamente lo que deseo (dependiendo del origen lo mando por uno de los 3 gateways)
>
>  
>
>>Se puede jugar un poco con reglas como estas, eliminando o modificando
>>el orden de las tres primeras:
>>
>>iptables -A PREROUTING -i eth0 -j MARK --set-mark 1
>>iptables -A PREROUTING -i eth0 -j MARK --set-mark 2
>>iptables -A PREROUTING -i eth0 -j MARK --set-mark 3
>>
>>iptables -A FORWARD -m mark --mark 1/1 -j LOG --log-prefix "mark 1: "
>>iptables -A FORWARD -m mark --mark 1 -j LOG --log-prefix "mark solo 1: "
>>iptables -A FORWARD -m mark --mark 2/2 -j LOG --log-prefix "mark 2: "
>>iptables -A FORWARD -m mark --mark 2 -j LOG --log-prefix "mark solo 2: "
>>    
>>
>
>Jen, no entendi tu ejemplo. Parece q no me explique bien antes.
>  
>

Es para que hagas ejemplos. Si piensas que la primera regla que calza
manda y luego el resto no se ejecuta, intenta con:

iptables -A PREROUTING -t mangle -i eth1 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i eth1 -j MARK --set-mark 2

iptables -A FORWARD -m mark --mark 1/1 -j LOG --log-prefix "mark 1: "
iptables -A FORWARD -m mark --mark 1 -j LOG --log-prefix "mark solo 1: "
iptables -A FORWARD -m mark --mark 2/2 -j LOG --log-prefix "mark 2: "
iptables -A FORWARD -m mark --mark 2 -j LOG --log-prefix "mark solo 2: "


Y verás que se registra la marca 2 y no la 1. Al revés lo mismo, se
registrará la marca 1

iptables -A PREROUTING -t mangle -i eth1 -j MARK --set-mark 2
iptables -A PREROUTING -t mangle -i eth1 -j MARK --set-mark 1

iptables -A FORWARD -m mark --mark 1/1 -j LOG --log-prefix "mark 1: "
iptables -A FORWARD -m mark --mark 1 -j LOG --log-prefix "mark solo 1: "
iptables -A FORWARD -m mark --mark 2/2 -j LOG --log-prefix "mark 2: "
iptables -A FORWARD -m mark --mark 2 -j LOG --log-prefix "mark solo 2: "


Con eso verás que efectivamente al saltar a la cadena MARK se ejecuta lo
que se pide y después se continúa con la siguiente cadena.

>La idea es asociar la marca a una tabla de ruteo especifica-
>
>Ej:
>ip rule add fwmark 2 table tabla1-enlace-hiperveloz
>ip rule add fwmark 1 table tabla2-enlace-medio
>ip rule add fwmark 3 table tabla3-enlace-lento
>  
>

Ojo entonces con poner una marca 3, porque viendo el mismo ejemplo:

iptables -A PREROUTING -t mangle -i eth1 -j MARK --set-mark 3

iptables -A FORWARD -m mark --mark 1/1 -j LOG --log-prefix "mark 1: "
iptables -A FORWARD -m mark --mark 1 -j LOG --log-prefix "mark solo 1: "
iptables -A FORWARD -m mark --mark 2/2 -j LOG --log-prefix "mark 2: "
iptables -A FORWARD -m mark --mark 2 -j LOG --log-prefix "mark solo 2: "


Resulta que tanto el 1 como el 2 están seteados. Sugiero poner múltiplos
de 2 para las marcas y así te evitas la ambigüedad.

Saludos,

-- 
Jens.



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