Cosas varias, tecnología y familia.... y descargos de la pega

Mostrando entradas con la etiqueta iptables. Mostrar todas las entradas
Mostrando entradas con la etiqueta iptables. Mostrar todas las entradas

viernes, 31 de julio de 2009

Tech: Traffic Shaping (per host)

Después de mucho auto negarme la necesidad, y decir cosas como "es difícil, tengo que estudiarlo", que a pesar de ser completamente verdad, en mi interior no quería hacerlo ya que es una jugada sucia que como ISP podemos realizar para y en contra de nuestros clientes. Pero naturalmente uno viendo la realidad y examinando feacientemente los hechos, llega a la conclusión de si.... es necesario, asi que me puse a investigar y logramos realizar el tan mal visto traffic shaping y limitación de tráfico al 95% de nuestros usuarios (95% de nuestro trafico internacional)

Nuestra intención principal es hacer limitación por equipo cliente (o rango) y no tanto por tipo de tráfico.
Voy a partir diciendo como traté y no pude, para luego seguir con lo que si funcion:

Para trabajar con traffic shaping y limitación de ancho de banda, escogí usar el encolado HTB que en conjunto con TC (iproute2) son aparentemente la mejor opción par ocupar en Linux, tanto por el rendimiento como por en uso de CPU de la máquina en cuestión.

El TS (traffic shaping) es una forma de limitar la velocidad de transmisión de cierto flujo de datos que se van "introduciendo" dentro de un tubo con un ancho limitado, y que se le puede dar a su ves, calidad de servicio.

No voy a profundizar en los tecnicismos para eso deben leer LARTC y entenderlo.

Como No funcionó:

No funcionó tratando de hacer una cola y clase del tipo 122:2 y 123:2. Esto tratando de hacer una diferenciación por clase de dirección IP y su respectivo host, es decir 122:2 para representar al host 200.112.122.2 y 123:2 para representar al 200.112.123.2. Quería mantener cierto orden en el script. A pesar que los creaba sin problemas, no había forma de hacer que el trafico se diferenciara por alli (que entrara en esas colas).

Como SI funcionó

Después de mucho intentarlo, decidí hacerlo correlativamente empezando de la cola 1: en adelante (1:1, 1:2, 1:3 etc...) y desde allí... lo demás fue trivial.-

En script cuenta con 3 pasos. La creación de un canal común para un cliente y la creación de 2 subcanales para diferenciación del tráfico interno.

Entonces:
tengo un archivo de la siguiente forma

"nombre_cliente" "ancho de banda_kbps" "ip1" "ip2" "subred1/mask"... etc
Como ejemplo
Carlost 2000 192.168.3.2 192.168.3.4 192.168.4.0/24

Entonces

En forma simplificada, creo una nueva cadena en la cadena POSTROUTING de la tabla MANGLE utilizando iptables, con el nombre de cliente como el nombre de la cadena.
iptables -t mangle -N Carlost
Entonces creo las cadenas iniciales
tc class add dev $iface parent 1: classid :$counter htb rate $BW\kbit
tc class add dev $iface parent 1:$counter classid :$(($counter+1)) htb rate $((9*$BW/10))\kbit ceil $BW\kbit
tc class add dev $iface parent 1:$counter classid :$(($counter+2)) htb rate $((3*$BW/10))\kbit ceil $((6*$BW/10))\kbit

Donde: $iface es la interface desde donde proviene esa red o IP
$counter es un contador simple
$BW es el ancho de banda asociado al cliente
(lo demás) son solo operaciones matemáticas.

Entonces aplico classify para clasificar los paquetes sobre la cadena creada para el cliente.
$ipmangle -A $comment -o $iface -j CLASSIFY --set-class 1:$(($counter+2))
$ipmangle -A $comment -o $iface -p ICMP -j CLASSIFY --set-class 1:$(($counter+1))
$ipmangle -A $comment -o $iface -p tcp -m multiport --sports 80,8080,500,20,21,22,19,443,53,110,7,993,6890:6900 -j CLASSIFY --set-class 1:$(($counter+1))
$ipmangle -A $comment -o $iface -p tcp -m multiport --sports 5900:5906 -j CLASSIFY --set-class 1:$(($counter+1))
$ipmangle -A $comment -o $iface -p udp -m multiport --sports 53,500,161,162,7,6890:6900,5060 -j CLASSIFY --set-class 1:$(($counter+1))
$ipmangle -A $comment -j ACCEPT ### necesario ya que CLASSIFY no es de retorno
Y después iterando sobre las IPs del cliente (y subredes si corresponde) para mandarlo a la cadena asociada a su trafico.

for ip in "${IPs[@]}" ; do
$ipmangle -A POSTROUTING -o $iface -d $ip -j $comment
done

Y eso es todo todito todo...

Cualquier duda solo posteen

PS: Tambien siendo un router sin NAT se puede limitar el ancho de banda de subida muy failmente sin recurrir a otro trucos... solo copien la cola principal en la otra tarjeta y creen la regla general con classify orientado a la tarjeta de salida.

Ciao.

jueves, 19 de febrero de 2009

Tech: Log blocked IPs by mod recent

Hace un tiempo les mencioné como hacer un bloqueo de puertos utilizando el mod recent de iptables.

Bueno, ahora les digo como pueden hacer un logeo de los mismos… es decir, generar una entrada en el log cada vez que se bloquea una ip.

El truco es muy simple. Veamos primero el original:

iptables -A INPUT-p tcp -i eth0 --dport 22 -m state --state NEW,INVALID -m recent --name ChicoMalo --set
iptables -A INPUT -p tcp -i eth0 --dport 22 -m state --state NEW,INVALID -m recent --seconds 60 --hitcount 4 --name ChicoMalo --update -j DROP

Primero damos vuelta el orden. Ya que es más optimo que se revise al revés, es decir, para el primer paquete pasa de larglo la primera regla y después los segudnos y los bloqueados no llegan a bajar nada.

Y además le agregamos la línea donde nos va a loggear la dirección bloqueada, con un hitcount con 1 menos que el anterior y listo.

Entonces:

iptables -A INPUT -p tcp -i eth0 --dport 22 -m state --state NEW,INVALID -m recent --seconds 60 --hitcount 4 --name ChicoMalo --update -j DROP
iptables –A INPUT –p tcp –I eth0 –dport 22 –m state –state NEW,INVALID –m recent –seconds 60 –hitcount 3 –name ChicoMalo –update –j LOG –log-prefix “BLOQUEADO: ”
iptables -A INPUT-p tcp -i eth0 --dport 22 -m state --state NEW,INVALID -m recent --name ChicoMalo

Eso es todo, aqui tienen sus logs de bloqueo de IPs.

martes, 12 de febrero de 2008

Protegiendo puertos con IPTABLES y mod RECENT con 2 lineas

Este está catalogado como TIP de linux:

Hace mucho tiempo me di cuenta de los muchos atakes que subre el puerto 22 de ssh, y empecé a buscar formas de protegerlo, encontrando unas pocas y muy diversas formas.

Las que incluyen por ejemplo: Levantar el servivio de acuerdo con una cadena específica en la tarjeta de red. Conocido como Port Knocking, esto se logra con un par de programas.. los voy a poner cuando me acuerde de cuales son..

Otra, incluye un simple cambio de puerto... es muy efectivo elimina los atakes a casi 0, en mi caso 0, pero tiene el incoveniente que si es una máquina orientada a dar el servicio de ssh (muy pocos casos) tienes que decirles a todos que puerto ocupar.

La última forma, es quizas una de las más elegantes y de mayor efectividad que he visto.

esta consiste en un módulo relativamente reciente de nf-iptables, el modulo se llama "recent" y puede trabajar de muchas formas.... aqui la más efectiva segun yo!

iptables -A INPUT-p tcp -i eth0 --dport 22 -m state --state NEW,INVALID -m recent --name ChicoMalo --set
iptables -A INPUT -p tcp -i eth0 --dport 22 -m state --state NEW,INVALID -m recent --seconds 60 --hitcount 4 --name ChicoMalo --update -j DROP

explicacion:

La primera línea envía cualquier paquete con flag "new" e "invalid" a una tabla especial llamada "ChicoMalo" y lko deja pasar a la sigiuente linea (recent no es excluyente).

La segunda linea hace el truco: dice literalmente que cualquier paquete con flag "new" o "invalid" será comparada con la lista de las de ChicoMalo, y si encuentra una cuarta coincidencia dentro de los 60 segundos anteriores, simplemente lo bota.

Es decir.... dentro de 60 segundos tu puedes hacer 3 intentos de conecciones nuevas, a la cuarta, te bota

Lo puedes probar con el comando netcat

netcat 22

Lo ejecutas 3 veces y a la cuarta, ya no funca..... esperas un minuto desde la última ves e intentas de nuevo.

Lo entretenido es que puedes protejer cualquier puerto que quieras, y es escalable, por defecto tiene un tamaño de 100 chicos malos (segun recuerdo) que puedes cambiar a voluntad al momento de cargar el módulo.

Como se carga el modulo..... si mantienes los parametros por defecto, se carga al ejecutarlo y ya. De otro modo lee el manual de iptables, alli esta todo....

Otra cosa muy entretenida.... vi por alli que es escalñable en el sentido del tiempo de atake.... es decir con un script más elaborado puedes decirle que cuando alguien se bloqueo en los 60 segundos pase a una lista de 1 hora, si aparece determinadas veces en la de 1 hora, lo botas por el dia, y asi susesivamente!!!!!

Investiga y lee, es lo mejor..... en otras palabaras RTFM

io.

Counter