lunes, 23 de septiembre de 2013

Ejercicios de Iptables. 4c

c.- Estudiar las opciones del tipo “mangle” y, en concreto las relacionadas con el tipo de servicio, TOS. La orientación de esta extensión es la alteración de paquetes de acuerdo con el servicio a prestar, priorizando el trafico proveniente de distintas partes. Por ejemplo, para minimizar los tiempos de espera: Minimize Delay. Es usada con las cadenas PREROUTING y POSTROUTING. Tratar, por ejemplo, de probar el correspondiente comando de iptables para minimizar la demora en el servicio telnet

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
iptables -t mangle -A OUTPUT -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:
iptables -L OUTPUT -vn
en la última imagen podemos ver cómo ha dejado de enviar tráfico por eth2 y comienza a hacerlo por eth0.
 

No hay comentarios:

Publicar un comentario