La tabla mangle se puede usar para modificar paquetes, básicamente los objetivos con los que se puede usar son para modificar
- TOS ( Type Of Service) y darle prioridad a unos paquetes frente a otros (dependemos de que los enrutadores externos a nuestra organización reconozcan estas marcas, que no suele ser lo habitual).
- TTL podemos modificar el ttl para asignarles uno nosotros, con esto podemos ser más invisibles frente a utilidades como traceroute.
- Mark: se suele usar para marcar los paquetes con valores específicos, estas marcas las podemos emplear después para realizar enrutamientos por determinados interfaces (empleando por ejemplo iproute) dependiendo de la marca, también podemos limitar anchos de banda y crear sistemas de balanceo de cargas mediante colas, basándonos en dichas marcas.
En cuanto al tipo de servicio TOS, podemos buscar coincidencias y emprender acciones según el TOS, sería algo como:
-m tos --tos {valor} -j OBJETIVO
lo realmente importante es que, además, también podemos modificar
nosotros los bits de TOS de los paquetes para priorizar determinados
servicios, en este caso emplearemos:
-j TOS --set-tos {valor}
tanto en un caso como en otro, los posibles valores que puede tomar los bits TOS son:
- Normal- service 0x00 (valor de los bits de TOS por defecto) 0
- Minimize-Cost 0x02 (coste mínimo) 2
- Maximize-Reliability 0x04 (máxima fiabilidad) 4
- Maximize-Throughput 0x08 (máximo rendimiento) 8
- Minimize-Delay 0x10 (demora mínima) o también 16
Por ejemplo para
minimizar la demora en el servicio telnet haríamos simplemente (los
modificamos antes de la decisión de enrutamiento, por ello empleamos
mangle en prerouting) de cualquiera de los tres siguientes modos
(emplear sólo uno):
iptables -t mangle -A PREROUTING -p tcp --dport telnet -j TOS --set-tos 0x10
iptables -t mangle -A PREROUTING -p tcp --dport telnet -j TOS --set-tos 16
iptables -t mangle -A PREROUTING -p tcp --dport telnet -j TOS --set-tos Minimize-Delay
Inicio con netcat una escucha en el puerto 23
netcat -l -p 23
y me conecto a la misma desde otro equipo
grabamos en el
fichero de logs las entradas y salidas de paquetes destinadas al puerto
23 (recordar que al hacer la modificación en PREROUTING, los paquetes ya
deberán tener la marca de demora mínima en ambos) con:
iptables -A INPUT -p tcp --dport 23 -j LOG
iptables -A OUTPUT -p tcp --dport 23 -j LOG
como vemos en las estadísticas detalladadas de iptables vemos que está marcando los paquetes
cuestión que podemos
comprobar revisando el fichero /var/log/syslog, dónde veremos que todos
los paquetes que tengan como puerto de destino 23 tendrán TOS=0x10:
d.- Explorar las extensiones de "marcado" como –mark.
Al igual que en el caso anterior modificábamos los bits de TOS ahora podemos emplear números enteros positivos (hasta el 4.294.967.296) para clasificar y diferenciar a unos paquetes de otros en función de dicho valor.
El modo de empleo es para la comparación:
-t mark --mark {número} -j OBJETIVO
pero también podemos modificar las marcas para asignarle un valor determinado:
-j MARK --set-mark {número}
Las
marcas se suelen emplear en combinación con iproute2 o colas para
definir las rutas por dónde ha de ir determinado tráfico o incluso
para realizar balanceos de carga entre varios interfaces de red.
Por
ejemplo vamos a hacer que todo el tráfico que llegue por la interfaz
eth1 y el generado por el propio equipo destinados a los puertos 80
(tráfico http) los marque con el número "1".
iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -j MARK --set-mark 1
Ahora
de las tres conexiones que tengo eth0, eth1 y eth2 en realidad podría
salir a Internet por eth0 (estoy haciendo nat en la tarjeta) o por
eth2 (la interfaz en modo puente que es la que está configurada por
defecto para salir). Lo que voy a hacer es crear y configurar una tabla
para que todos los paquetes marcados con un "1" - el tráfico web-
emplee esta tabla y salga por la interfaz eth0 mientras el resto sigue
saliendo por eth2 (podríamos desear hacer esto en caso de querer
hacer que un determinado tráfico salga siempre por un determinado
interfaz, o que los costes de ambas líneas sean distintas, o en
procesos de balanceos).
Para
controlar por qué interfaz sale el tráfico inserto reglas para que se
registre el tráfico saliente por cada una de las interfaces destinado
al puerto 80:
iptables -A OUTPUT -i eth0 -p tcp --dport 80 -j LOG
iptables -A OUTPUT -i eth1 -p tcp --dport 80 -j LOG
iptables -A OUTPUT -i eth2 -p tcp --dport 80 -j LOG
como podemos ver en la siguiente imagen, por defecto el tráfico sigue saliendo por eth2
Dado que hemos marcado los paquetes con "1" vamos a trabajar con ello.
En
primer lugar y por cuestiones de legibilidad creamos una tabla de
enrutamiento y le asignamos el número 201 y nombre web.salida:
echo 201 web.salida >> /etc/iproute2/rt_tables
añadimos una regla para que todo el tráfico marcado a uno emplee esta tabla
ip rule add fwmark 1 table web.salida
nos aseguramos de que la regla ha sido añadida correctamente
ip rule ls
finalmente generamos la tabla web.salida enlazándola a la interfaz eth0 cuya puerta de enlace es la 10.0.2.2
ip route add default via 10.0.2.2 dev eth0 table web.salida
tras
hacerlo podemos ver cómo la iptables marca los paquetes salientes y
cómo el tráfico http comienza a pasar por la interfaz eth0 en lugar de
por eth2:
No hay comentarios:
Publicar un comentario