IProute, el gran director II

En el primer artículo sobre IpRoute pudimos aproximarnos al uso cotidiano  y casero que le podemos dar a esta poderosa herramienta,
pero en esta ocasión vamos a avanzar sobre utilidades mas avanzadas.

IpRoute no solo centraliza la administración de la red en nuestro linux, si no que nos brinda herramientas que antes uno
no podía ni imaginar, sin pagar un alto costo por sistemas dedicados. Por ejemplo: Proxy ARP, control del ancho de banda, multicasting,.. y una de las cosas que mas me interesa es la posibilidad de trabajar con múltiples tablas de ruteo (balanceo de carga).

Tablas de Ruteo

Con IProute podemos manejar las distintas tablas de ruteo del kernel de linux.
Simplificando ideas, tener varias tablas de ruteo, nos permite acceder a distintas redes con el agregado de poder elegir de forma minuciosa (ya sea por dirección de destino, Type of service, scope, o interfaz de salida) la ruta a seguir de un determinado paquete (como adelanto, imaginate si pudieras usar el poder de matcheado de iptables, para marcar un paquete, el cual direccionaremos a la tabla de router que querramos! ).

Ejemplos de uso:
Tipico ejemplo, tengo dos conexiones a internet, una de 3mb con Fibertel y una de arnet de 1mb.
Atraz de Linux’sBox tengo un servidor de juegos, y una red de maquinas que acceden para navegar y usar msn y otra que se conecta a juegos online.
Objetivo: Distribuir las maquinas entre las 2 conexiones para que la red no se me sature.

Otro ejemplo común, es cuando tengo dos conexiones, y quiero balancear el uso de p2p en la red.

En mi caso hoy quiero utilizar estas herramientas para balancear trafico http entre dos proxyweb

Comenzando:

El kernel soporta 256 tablas de ruteo (de la 0 a la 255), lo que es generalmente, mas que suficiente.
Por defecto se le asigna el numero 255 a la tabla de ruteo local,  la cual en la mayoría de los casos no tocaremos, ya que esta contiene los broadcast y direcciones de las interfaces locales, esta tabla es la que manejan los ip address e ifconfig, para poder verla usamos: ip route show table local.

El número 254 se lo gano la tabla principal (main) donde esta alojadas las rutas que soliamos ver en un route -n y finalmente, siempre hay algo que debermos explicar en otro momento, y en este caso nos referimos a las tablas 253 (default) y 0 (llamada para unspect , sirve para manejar todas las tablas! :s )

Esta configuración esta guardada en /etc/iproute2/rt_tables#
# reserved values
#
255     local
254     main
253     default
0       unspec
#

Y es justamente en este archivo donde definiremos nuestras tablas personalizadas.
Como es costumbre en un sistema *nix-like, usamos nuestro editor de texto preferido y nos disponemos a editar este archivo,
donde colocaremos un ID y un ALIAS, el ID debe estar entre 1 y 252 ya que los otros valores están ocupados, el alias sera el nombre que le asignaremos
a la tabla para llamarla de una forma amigable.
Una vez editado nuestro archivo puede quedar algo asi:# reserved values
#
255     local
254     main
253     default
0       unspec
#
# Tablas personalizadas
#
#  Tabla para Red Arnet
1 arnet
#  Tabla para red Fibertel
2 fibertel

Simple no? si, por ahora es asi de simple.
Usando ip route show table arnet/fibertel , podemos observar que no hay nada dentro de las tablas.
Ahora bien, dentro de cada tabla, puede haber varios tipos de rutas, y estos son:

Unicast:
La mas común de todas las tablas, tan común, que cuando no sepamos de que tipo es una ruta, muy probablemente sea Unicast.
Este tipo de rutas, establece una gateway para una red.
Por ejemplo, cuando queremos llegar a la red 10.1.1.0/27 (ver subnetting) atravez de nuestro router (cuya ip es 192.168.1.1) usaremos:
ip route add 10.1.1.0/27 via 192.168.1.1
Y el ejemplo mas común es el de la ruta de ultima milla, ruta por defecto, puerta de enlace, o default gateway:
ip route add default gw 192.168.1.1
ó bien
ip route add 0.0.0.0/0 via 192.168.1.1
Broadcast:
Otra ruta muycomún. Esta tipo de ruta, solo se encuentra en la tabla local, y especifica una dirección de broadcast de una interfaz.
Para mirar esas rutas podemos usar:
ip route show type broadcast table local
Lo que nos mostrara solo las rutas tipo broadcast de la tabla local
Local:
Tan comunes como las broadcast, las rutas del tipo local, quienes pueden ser un poco complicadas de explicar por un concepto poco logico, para la forma de pensar humana, ya que, esta ruta, dice, para llegar a la dirección 10.0.0.1 parta de la interfaz eth1 y use 10.0.0.1 como dirección de origen.
que??
Si bueno, miremos esto:
Agregamos una dirección ipv4 a nuestra interfaz eth1
ip addr add 10.0.0.1 dev eth1
Veamos lo siguiente:
ip route sh type local table local
Veremos que automaticamente, se ha agregado la si siguiente linea:
10.0.0.1 dev eth1  proto kernel  scope host  src 10.0.0.1
Con esto, si hacemos un ping a dicha ip (10.0.0.1) funciona de 10, pero si la borramos (ip route del 10.0.0.1 dev eth1 table local),
veremos como el tonto de nuestro kernel no sabe como llegar!!!!
Entonces, este tipo de rutas, como dijimos, le dicen al kernel, que para llegar a la ip 10.0.0.1 user la interfaz eth1, con la dirección 10.0.0.1.
Volvamos a los tipos de rutas

nat:
Tipo de ruta utilizada cuando se crea NAT
unreachable:
Este tipo de rutas se generan automáticamente cuando se recibe un paquete ICMP unreachable.
prohibit:
Exactamente igual a unreachable pero con ICMP prohibit
blackhole:
Este tipo de ruta es similar a /dev/null, es decir, lo que matchea contra esta ruta, es descartado
throw:
Si blackhole es un  /dev/null throw es un archivo tipo pipe (fifo), es decir, cuando una conexión llega a matchear contra esta ruta, se envia a la conexión nuevamente a ser manejada por el proceso de selección de ruta normal, con un destino especifico.

Pues bien, teniendo una idea, de como crear rutas, y de como funcionan (siempre teniendo en cuenta el comando ip route get), podemos crear las rutas que necesitemos en nuestras tablas personalizadas, por ejemplo:
Hagamos un mini ejemplo de como conectarnos a dos proveedores

#Vale aclarar primero, que si no tenemos una interfaz para llegar a 10.0.0.2 habrá un error
#además estoy suponiendo que ya creaste las tablas arnet y fibertel en /etc/iproute2/rt_tables

#Ahora si insertamos una ruta por defecto en la tabla arnet
ip route add default via  10.0.0.2  dev eth1 table arnet
# y otra en la tabla fibertel
ip route add default via 192.168.5.1 dev eth2 table fibertel

Ahora bien, antes de seguir, para entender la siguiente linea, quizas necesites leer los articulos de NetFilter, para comprender que estamos haciendo.
iptables -t mangle -A OUTPUT  -p tcp –dport 80 -j MARK  –set-mark 1
iptables -t mangle -A OUTPUT  -p tcp –dport 1863  -j MARK  –set-mark 2

Con esto solo nos falta unas lineas mas,

ip rule add fwmark 1 table arnet
ip rule add fwmark 2 table fibertel

Analicemos esto un poco:
Al igual que con los otros objetos, podemos listar el contenido de la tabla rule con
ip rule list
nos mostrará algo asi:
Onix:~# ip rule ls
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

Estas reglas (rules) determinan la forma en que los paquetes ingresaran en una tabla u otra. Si ya te has familiarizado con el funcionamiento de tablas, podrás notar,
que en este caso, los paquetes entran primero en la tabla local, ya que de seguro, es la primera contra la cual matchearan (anteriormente explicamos su uso). Al salir de
esta tabla, pasaran a la tabla main, donde encontraran su destino.
Para entender de forma práctica el uso de ip rule, podemos ver una forma alternativa de hacer lo mismo que hicimos con ‘ip rule add fwmark……’:
ip rule add from 192.168.1.0/24 table arnet
Y con eso, diriamos que todo lo que venga de la red 192.168.1.0/24 pasa a ser controlado por la tabla arnet.
fwmark nos permite leer una marca (que asigno iptables, y que es solo de uso interno) a un determinado paquete, y según esa marca destinarlo a una tabla.

Ahora pensemos que el poder de matcheado de IPtables nos permitirá dirigir el tráfico de la forma que necesitemos.

Un resumen de todo:
Primero, definimos tablas de ruteos, a las cuales le asignamos un default gateway. De esta manera nuestras tablas quedaron listas!
Pero ahora teniamos que decirles a los paquetes que pasen por esas tablas, así que lo que hicimos fue usar iptables, para “encontrar” los paquetes que queriamos
encaminar por una tabla en particular, y les agregamos una marca (fwmark, que es una marca solo de uso interno).
Nos faltaba la conexion entre los paquetes marcados y nuestras tablas, por lo que usamos ip rule, para definir que los paquetes marcados, pasen por las tablas de ruteo correspondientes, y de esa manera se completo el circuito.

Bien, hemos visto un poco mas del poder del comando ip, si todo va bien seguiremos aprendiendo sobre iproute2 y la cantidad de cosas que podemos hacer con el!

Cualquier duda específica pueden dejar un comentario con su mail y me comunicaré con uds.

/* A partir de marzo nos estamos mudando a http://netsecure.com.arhttp://www.netvulcano.com.ar */

Redes con subneting!

Divide y vencerás!

Esta máxima romana viene a hacerse presente de nuevo para ayudarnos a imperar sobre las redes!

Solución rápida: http://www.aprendaredes.com/cgi-bin/ipcalc/ipcalc_cgi, además, te dejo una tabla 100% útil al final del artículo.

El problema: La escases

Cuando tenemos un switch y un router, con solo algunas pcs, crear una red no es un problema,
pero si uno debe enfrentarse a una legión de pcs, con muchos routers y switches, es muy importante que conozcamos como movernos y como crear redes y subredes.
No es un problema trivial, ya que cuando se diagramo el protocolo IP, no se imaginó el crecimiento exponencial que tendría Internet, y la escases de direcciones que eso significaría. Claro que no es para culparlos, 4.294.967.296 de IPs disponibles era un número muy amplio como para pensar en que algún dia sería poco!

La solución: Subdividir

CIDR fue la respuesta a la necesidad de mayor flexibilidad a la hora de crear redes con direcciones de 32 bits (ipv4). CIDR introdujo una nueva manera de interpretar las mascaras de subred de las direcciones ip, con la técnica VLSM.

A los bifes!

Ahora bien, aún no te queda en claro nada? Bueno… demasiada intro, vayamos a los bifes!
Para explicar Subnettin/CDIR/VLSM voy a usar los clásicos ejemplos de números IP designados para redes privadas, pero lo mismo es aplicado a la hora de crear redes para ISPs/Carriers.

Si alguna vez configuraste una PCs/Server en una red, seguramente habras utilizado una dirección IP y una mascara de sub red. Quizas no tenias plena certeza de lo que la mascara de subred significa, pero si de que lo mas común es que esta, sea 255.255.255.0. Pues en configuraciones caseras raras veces veras otras mascaras.
Aclaremos un concepto entonces antes de seguir:
Una dirección IP, no es solo ese famoso número al estilo 192.168.1.2.
Una dirección IP, esta compuesto por su número IP (p.e. 192.168.1.2) y por su mascara de sub red (p.e. 255.255.255.0), ambas cualidades de una dirección ip, indicaran a que red lógica pertenece dicha dirección. Es decir que un número ip, sin su correspondiente mascara de subred, no es mas que un número!

Ejemplo:

Los números IP: 192.168.1.1, 192.168.1.2, y 192.168.1.3 que tienen como mascara de subred 255.255.255.0, pertenecen todos a la misma red.
Sin embargo el número 192.168.1.4 con mascara de subred 255.255.255.240 no pertenece a la red anterior

Expliquemos por que:

Para determinar la red a la que pertenece una dirección IP debemos dejar de pensar en decimal y pasar nuestra mente a binario (al estilo matrix! )
Repasemos binario:Como todos sabemos en binarios solo existen 2 dígitos, 1 y 0, con los cual formaremos cualquier otro número. Asi, el 0 es el 0 que conocemos en decimal, el 1 es el 1 que conocemos de decimal, pero el 2 decimal se expresa en binario de la forma 10, por eso dicen que existen solo 10 tipos de personas en el mundo las que saben binario y las que no. Mas allá del chiste, veamos una tablita:

Binario    Decimal

0                  0
1                  1
10                2
11                3
100              4
101              5
110              6

y asi sucesivamente.

De forma tal que cuando vemos el número 255, en realidad deberíamos mirar con nuestro ojo de matrix lo siguiente:  11111111
8 unos! Si ya se que no sabes ni sumar en binario, y saltamos de 6 al 255 en binario, pero no puedo extenderme mas sobre binario en este minitutorial, por lo que te doy la regla, y si tu intriga te lleva, estudiaras un poco mas en algún otro lado:

0            0            0            0            0            0            0            0
128        64          32          16          8            4            2            1

Asi de simple, cada vez que aparece un 1 en la linea de los 0, sumas el número decimal correspondiente, por ejemplo:

0            0            0            1            0            1            1            1
128        64          32          16          8            4            2            1

Entonces,  10111 es 23 en decimal (16 + 4 + 2 + 1).

Transformemos una mascara de subred:

255.255.255.0 es:

11111111.11111111.11111111.00000000

Los importantes aca, son los 1. La mascara de sub red tiene 3 octetos de unos, 3 grupos de 8 unos, y eso es 3×8=24, no?
Si, por eso habrás visto algo parecido a lo siguiente: 192.168.1.1/24, es decir, dirección Ip 192.168.1.1 con mascara 255.255.255.0, en si, una forma mas compacta de expresarlo.
Los 8 ceros nos indican la cantidad de hosts que esa red tiene, y para saberlo podemos usar: 2^X, siendo X=8 (32 – 24 = 8 ) en este caso, que es la cantidad de bits que la mascará de subred tiene “desactivados”.  2^8 es 256, y esta es la cantidad de hosts que entran en esa red, sin embargo, a estas 256 ips posibles, se le debe restar siempre 2, ya que la primera dirección posible es reservada para “nombre de red” o “unicast” y la última para “broadcast”.

Así, nuestros ojos matrixiados ya ven, que 192.168.1.1/24 indica, que la red contiene 256 ips, de las cuales la 192.168.1.0 (la primer ip) es el nombre de la red, y 192.168.1.255 es el broadcast de la red. Así mismo vemos que las IP disponibles van desde la 192.168.1.1 a la 192.168.1.254.

Pfff, cuanto lio para decir algo que sin trabajar en binario ya sabiamos…. Pero, ahora ya sabes por que es así! no es hermoso? Avancemos!

Una vez entendido lo anterior, podemos (recien) meternos con Subnetting

Como dijimos CDIR sirve para que IP tenga mas flexibilidad a la hora de crear redes, ya que hasta 1993, solo se conocian las redes con mascaras de subred /24, /16 y /8,
que son las famosas redes de clase:

Red de Clase C, por ejemplo 192.168.1.0 255.255.255.0 (256 nodos posibles)
Red de Clase B, por ejemplo 172.16.0.0 255.255.0.0     ( 65536 nodos posibles)
Red de Clase A, por ejemplo 10.0.0.0 255.0.0.0              (16777216 nodos posibles)

Cual era el problema? Simple, si teniamos una red con 300 nodos, teniamos que configurar una red del tipo B por solo unos pocos nodos, y “desperdiciabamos” 65400 y pico de nodos posibles, lo que quizas para una red privada podría no ser un problema, pero cuando hablamos de redes públicas es grave, ya que habia que distribuir las ips al rededor de todo el mundo, y con ese tipo de saltos (de 256 a 65536 por ejemplo) pronto no habría mas direcciones para asignar.
Además si bien, no parece problematico para las redes privadas, si lo es, ya que las redes lógicas disminuyen los dominios de broadcast, y por lo tanto aumentan el rendimiento de la red.

Para implementar CIDR, sólo debemos abrir nuestra mente:

11111111.11111111.11111111.11100000

Traducido es, 255.255.255.224,  o bien un  /27.
Esta mascara de subred nos brinda la posibilidad de tener un red con 32 host
Entonces, si asignamos esta mascara a una direccion como por ejemplo 192.168.1.50, tendríamos los siguientes datos:

Dirección IP: 192.168.1.50
Mascara de subred: 255.255.255.224
Cantidad de nodos disponibles: 30
Elevo 2 a la 5 (la cantidad de 0s) 2^5=32 menos 2 (unicast y broadcast), es una red de 30 nodos
Primera IP de la red: 192.168.1.33
En este ejemplo debemos considerar que hemos dividido a una red de 256 direcciones IP en redes mas pequeñas de 32 (haciendo la cuenta 256/32, 8 redes de 32 nodos)
Por lo tanto, la primera red va desde 192.168.1.0 (unicast) a 192.168.1.31(broadcast), la segunda red va desde 192.168.1.32 (unicast) a 192.168.1.63 (broadcast).
Y ahi ya vemos que nuestro hosts ( 192.168.1.50) esta en la segunda red, por lo q la primera ip disponible para asignar es la 192.168.1.33.

Bien, hasta aquí, tenes las herramientas minimas necesarias para conocer un poco mas sobre subnetting, faltaría que veas que pasa con una red con mascara 255.255.224.0, pero eso ya lo podes prácticar vos solo, por que en si, es lo mismo

A la carga! Divide y venceras!!!!!

Subnetting

Referencias:

http://www.netexpresslabs.com/info/subnet

http://es.wikipedia.org/wiki/CIDR

Para mas info, sobre la aplicación correcta de VMLS ver este artículo

/* A partir de marzo nos estamos mudando a http://netsecure.com.arhttp://www.netvulcano.com.ar */

Empirismo de Red (probar minimamente nuestro firewall ) II

Técnicas y estrategias

Usar scripts y programas de escaneo o pen test, es muy simple, sin embargo, para obtener información valiosa, es necesario saber que es lo que se esta haciendo.
En el artículo anterior llegamos a ver una técnica de ‘port scann’  muy común llamada SYN Scann. Su nombre indica justamente que se utiliza el flag SYN para escanear el/los puertos, tal cual lo hicimos en las pruebas del artículo anterior.
Esta vez repasaremos otras tecnicas de escaneo de puertos.
Vale aclarar que estas tecnicas de escaneo, se pueden realizar con nmap de manera muy simple, pero si no lo hacemos de esta manera, nunca sabremos como funcionan.

Xmas

Esta técnica consiste en enviar un paquete TCP con los flags FIN, PSH, y URG.
Para esto usamos:

Onix:~# hping -F -P -U -p 22 192.168.3.4

Demás esta decir que con -F activamos el flag FIN, -P -> PSH y -U -> URG.
Ahora bien, si la implementacion TCP del target (en este caso 192.168.3.4) es correcta, cuando nos encontremos ante un puerto abierto, no deberia responder nada, y en caso de ser un puerto cerrado responderia con un RST.

Onix:~# hping -c 5  -F -P -U -p 22  192.168.3.4
HPING 192.168.3.4 (eth1 192.168.3.4): FPU set, 40 headers + 0 data bytes

--- 192.168.3.4 hping statistic ---
5 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

En este caso tenemos un puerto 22 abierto, ya que no recibimos ningún RST.
Y por el contrario si revisamos el puerto 23, vemos que este se encuentra cerrado (recibimos un RST/ACK (RA) )

Onix:~# hping -c 5  -F -P -U -p 23 192.168.3.4
HPING 192.168.3.4 (eth1 192.168.3.4): FPU set, 40 headers + 0 data bytes
len=46 ip=192.168.3.4 ttl=64 DF id=0 sport=23 flags=RA seq=0 win=0 rtt=9.5 ms
len=46 ip=192.168.3.4 ttl=64 DF id=0 sport=23 flags=RA seq=1 win=0 rtt=0.3 ms
len=46 ip=192.168.3.4 ttl=64 DF id=0 sport=23 flags=RA seq=2 win=0 rtt=0.3 ms
len=46 ip=192.168.3.4 ttl=64 DF id=0 sport=23 flags=RA seq=3 win=0 rtt=0.6 ms
len=46 ip=192.168.3.4 ttl=64 DF id=0 sport=23 flags=RA seq=4 win=0 rtt=0.3 ms

--- 9.6.166.207 hping statistic ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.3/2.2/9.5 ms

Esta técnica tiene la ventaja de ser muy sileciosa, sin embargo, es facil de filtrar. Pero además se debe recalcar, que el hecho de que no responda, puede significar, que fue interceptado por el firewall y este lo dropeó y necesariamente de que el puerto esta abierto.
Para filtrar este tipo de escaneo, deberiamos decirle al firewall que no acepte segmentos TCP con los flags FIN,PSH,URG si no pertenece a una conexión ya existente.

NULL y FIN

Tanto NULL scan, como FIN scan utilizan el mismo concepto que Xmas, envian un paquete mal formateado, si responde un RST esta cerrado, en caso contrario, es probable que este abierto.

NULL scan, como dice su nombre envia un paquete sin flags TCP:

Onix:~# hping -c 5 -p 23 192.168.3.4
HPING 192.168.3.4 (eth1 192.168.3.4): NO FLAGS are set, 40 headers + 0 data bytes

--- 192.168.3.4 hping statistic ---
5 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
Onix:~# hping -c q -p 23 192.168.3.4
HPING 192.168.3.4 (eth1 192.168.3.4): NO FLAGS are set, 40 headers + 0 data bytes
len=46 ip=192.168.3.4 ttl=64 DF id=0 sport=23 flags=RA seq=0 win=0 rtt=1.2 ms

---192.168.3.4 hping statistic ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.3/0.5/1.2 ms

De la misma manera funciona con el escaneo FIN, solo que en lugar de no enviar flags, se envia solo el flag FIN.

Onix:~# hping -c 5 -F -p 23 192.168.3.4

Es importante recalcar, que el hecho de que no recibamos una respuesta, no es una garantia de que el puerto este abierto, ya que por ejemplo si usamos estos paquetes contra un host que no existe, no recibiremos respuesta!

ACK Scan

A diferencia de Xmas, FINScan, y Nullscan, ACK Scan no intenta encontrar los puertos abiertos/cerrados, si no mas bien los silenciosos y los hosts que deniegan las conecciones que comienzan con el flag SYN. No hace falta dar un ejemplo, ya que solo hay que activar el flag ACK y si no responde, es probable que ese puerto este filtrado.

Si leistes los articulo sobre iptables podras imaginar como bloquear estos escaneos, pero si todabia no caes, te doy una ayuda:
Para el Null Scan:  iptables -t nat -A PREROUTING -p tcp –tcp-flags ALL NONE -j DROP
Para el Xmass: iptables -t nat -A PREROUTING -p tcp –tcp-flags ALL FIN,PSH,URG -j DROP

Ok, esto son solo algunas de las utilidades que le podemos dar al hping, tiene mucho mas para darnos, por lo que te invito a que no te pierdas el proximo artículo.

/* A partir de marzo nos estamos mudando a http://netsecure.com.arhttp://www.netvulcano.com.ar */

Empirismo de red (Probar minimamente nuestro firewall) I

Probando nuestro Firewall

En realidad, comprobar si nuestra red es segura, es infinita mente mas trabajoso que comprobar que puertos abiertos tenemos. Sin embargo, cuando hablamos de una pc hogareña, comprobar los puertos de nuestro host, es importante, pero mucho, muchísimo mas importante es tener una noción de que hablamos cuando hablamos de puertos y como funcionan.
En conclusión, voy a tratar de explicar , para todos aquellos que busquen, por ejemplo, como comprobar si su firewall de iptables  esta funcionando adecuadamente, o si tal o cual puerto esta ‘abierto’ o ‘cerrado’. Ya que lo cierto, es que abundan ese tipo de consultas, así que sin mas adentre monos en el tema.

Si ya leistes un poco sobre como configurar tu red, y luego te aventuraste a hacerte un firewall, o (tristemente) a usar uno ya hecho, pero aún quieres probar si todo funciona como esperabas, esto quizas te ayude.

Probablemente, has leido repetidas veces acerca de los ‘puertos’, y pareciera, que si cerramos todos los puertos de nuestro host / server, entonces estaríamos seguros. Esto no es tan así, como dije antes, ‘cerrar’ un puerto no lo es todo en la vida, pero puede ser útil, o muy útil si razonas lo que estas haciendo.

Repasemos para aclarar:

Los sistemas informáticos, necesitan comunicarse entre si, y la red mas grande del mundo, para la comunicación es Internet. Esta esta basada en una arquitectura que es similar a la de una red, donde un ‘nodo’ de la red, se puede ‘comunicar’ con otro directamente, o saltando algunos otros nodos intermedios.
Por razones etimologícas, para el funcionamiento de la internet actual, se utiliza un protocolo llamado IP, al cual, en la mayoría de los casos, se lo acopla con el protocolo TCP, y en otros casos con UDP.
Estos protocolos, fueron construidos con la intención, de que una máquina pueda tener varias conexiones simultaneas utilizando el mismo protocolo.
Ahora bien, para diferenciar los datos pertenecientes a una conexión, con los datos de la otra conexión, se les asigno un rango de números, que el sistema debe implementar sobre los datos. Este número, es lo que nosotros conocemos como ‘puerto tcp’, ó ‘puerto udp’.
Estos protocolos (TPC y UDP), estan diseñados teniendo en cuenta, el modelo ‘cliente-servidor’, donde ‘un servidor’ es un sistema que espera, que un ‘cliente’ se contacte con el, para que le pueda brindar el servicio para el cual esta programado.
Entonces, por ejemplo, Apache, es un servidor web, programado para que cuando un cliente (firefox,chrome,netscape,opera,konqueror o el que usen) se conecte a él, este les brinde un servicio, en el caso de Apache, una pagina web.
Para continuar el ejemplo, los servidores web, por ser un standar, deben funcionar en el puerto 80.

Todo navegador (cliente web), buscará conectarse al puerto 80, para recibir las paginas web que se le soliciten.
Todo servidor web, funciona por defecto, brindando paginas en el puerto 80, por que es donde los navegadores la buscaran. ( Si lo se, parece recursivo)

Una vez que sabemos esto, el resto es simple:

Cuando un servidor esta corriendo, ‘abre’ un puerto a la espera de conexiones y una vez que ese servidor se para, entonces el puerto queda ‘cerrado’, por que no hay ningún programa esperando a recibir peticiones.

Vamos a los bifes

Existe un programa hyper-super-recontra-conocido, llamado Nmap, escaner de puertos y algo mas, con varios tipos de escaneo. Creo que es mas que suficiente decir que ejecutando nmap <direccion-ip>, hacer un escaneo básico, y nos informa los puertos tcp que tenemos a la escucha.
Esto nos da una mirada superficial y amplia del estado en que dicha ip se encuentra. Pero existen muchisimos manuales que hablan del nmap, por lo que no es la intención hablar de este programa. Si no que vamos a ir a otro programa, un poco menos conocido, pero super util:

Puerto abierto Puerto cerrado

Cuando un puerto tcp ( por ejemplo 80/TCP (web) , 25/TCP (smtp), 110/TCP (pop3)), se encuentra ‘abierto’, responde de una manera diferente que cuando se encuentra cerrado (obvio? no del todo.. ), justamente, tcp define una seria de saludos y respuesta necesarias para iniciar una conexión, que es llamada comunmente Three-way hand-shake, o “apreton de manos en 3 pasos”.
Básicamente consiste en lo siguiente:

CLIENTE ——-SYN——-> SERVIDOR
CLIENTE<—SYN/ACK—–SERVIDOR
CLIENTE——-ACK———>SERVIDOR

El cliente envia un ‘paquete’ TCP con el flag SYN activado, a lo que el servidor debe responder SYN/ACK (es decir las flags SYN y ACK activdas) si el puertos solicitado se encuentra a la escucha, y para que la conexión quede establecida, el cliente envia otro SYN, confirmando la conexión.
Por el contrario, si el puerto se encuentra cerrado, sucede lo siguiente:

CLIENTE——-SYN——>SERVIDOR
CLIENTE<–RST/ACK—SERVIDOR

Si el puerto se encuentra cerrado, el servidor, solo responde con un RST/ACK.

Hping
En www.hping.org/ encontraremos el download e info.
Hping nos permite confeccionar paquetes (tcp,udp,icmp) un poco mas personalizados, para hacer escaneos mas específicos.
Por ejemplo:

 hping -c 1 -n -1  2x0.x9.xx.4x

Enviará un (uno solo) simple ping.
Si pensas que para hacer eso, usas el ping normal y es menos historia, tenes razón, pero seguí leyendo y vas a ver que hay cosas que no podes hacer con un simple ping.

Con hping podemos enviar paquetes TCP con los flags que querramos:

hping -c 1 -n -p 80 -S www.google.com

En este caso, enviaremos un paquete tcp con el flag SYN activado, al puerto 80 de google.

Onix:~# hping -c 1 -n -p 80  -S www.google.com
HPING www.google.com (eth1 74.125.93.99): S set, 40 headers + 0 data bytes
len=46 ip=74.125.93.99 ttl=56 id=30167 sport=80 flags=SA seq=0 win=512 rtt=5.7 ms

--- www.google.com hping statistic ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 5.7/5.7/5.7 ms

Como el puerto 80 de google se encuentra abierto (esperando conexiones) y responde con los flags SYN y ACK activados.
Esto mismo pasará con cualquier puerto que este abierto.

Con las siguiente opciones podes setear las distintas flags de un paquete TCP y podras experimentar los distintos resultados.

  -L  --setack     set TCP ack
  -F  --fin        set FIN flag
  -S  --syn        set SYN flag
  -R  --rst        set RST flag
  -P  --push       set PUSH flag
  -A  --ack        set ACK flag
  -U  --urg        set URG flag
Si lees el RFC de tcp, encontraras que tenes mucho para experimentar ahi.

Ahora, existe una funcionalidad interesante, que te va a ser util si la sabes implementar.
Supongamos que queremos escanear un rango de puertos de nuestro Host (digamos del 21 al 90 /TCP).
Podemos usar muchas lineas de hping tirando una vez a cada puerto o bien:

Onix:~# hping -n -p 21  -S 9.6.166.1
HPING 9.6.166.1 (eth1 9.6.166.1): S set, 40 headers + 0 data bytes
len=46 ip=9.6.166.1 ttl=255 id=49466 sport=21 flags=RA seq=0 win=0 rtt=1.8 ms
len=46 ip=9.6.166.1 ttl=255 id=22495 sport=21 flags=RA seq=1 win=0 rtt=1.2 ms
22: len=46 ip=9.6.166.1 ttl=255 id=18905 sport=22 flags=SA seq=2 win=4128 rtt=1.3 ms
len=46 ip=9.6.166.1 ttl=255 id=49665 sport=22 flags=SA seq=3 win=4128 rtt=2.2 ms
23: len=46 ip=9.6.166.1 ttl=255 id=9520 sport=23 flags=RA seq=4 win=0 rtt=1.4 ms
len=46 ip=9.6.166.1 ttl=255 id=45949 sport=23 flags=RA seq=5 win=0 rtt=1.2 ms
24: len=46 ip=9.6.166.1 ttl=255 id=25211 sport=24 flags=RA seq=6 win=0 rtt=1.2 ms
....

Aca hping comienza enviando paquetes TCP con el flag SYN activado al puerto 21, pero pronto es interrumpido por mi (presionando control-z) y comienza enviar los mismos paquetes pero al puerto 22 y asi susecivamente.

Si especificamos -z en lugar de cambiar el puerto ira aumentando el ttl y si usamos -Z, cuando presionemos control-z, el proceso tomará un curso normal poniendose en background.

Establecidos ya algunos conocimientos básicos... podremos ver (en el proximo articulo) algunas herramientas mas que nos da hping y otras herramientas.

/* A partir de marzo nos estamos mudando a http://netsecure.com.arhttp://www.netvulcano.com.ar */

Manual tutoria de hacking con hping

Scapy, solo para alquimistas!

Si te gusta explorar las profundidades de la red, o investigar cada rincon al que te conectas, has de tener un set de herramientas disponibles para facilitar tus investigaciones. Y cuanto mas quieres explorar, y cuanto mas intentas testear, mas te das cuenta, que a pesar de la gran cantidad de scripts y programas disponibles que se pueden encontrar, no siempre tus necesidades tienen solución.

Pues hoy aquí podras ver que scapy/python es la piedra filosofal de tu busqueda!

Si bien puedes instalar scapy como un herramienta y usarla individualmente de python, es mas que re comendable tener conocimientos de este lenguaje, para poder llevar a cabo tus mas intimos deseos!

No voy a detallar el uso de Scapy, ni mucho menos el de Python, pero quiero compartirte un sencillisimo script que te permitira saber cual de todas los nodos de una red es un GateWay.

Para ello, explico brevemente le concepto y luego copio el codigo:

Si estas en un red, en la cual no sabes cual es tu GW ( una red Wifi, o una red sin DHCP o ambas), podras usar este script, el cual te mostrara todas los hosts que te daran acceso a internet.

Todos los paquetes que viajan sobre IP, son dirigidos por nuestro host, mediante el protocolo ethernet, a una MAC que esta asociada a la ip de destino.
Esto sucede, siempre y cuando la ip de destino este dentro de nuestra red, pero si no fuera asi, los paquetes se dirigen a la puerta de enlace.
Esta puerta de enlace, es justamente la encargada de dar acceso a otras rede.
Los paquetes se configuran con la ip de destino deseada, pero con la direccion mac de la puerta de enlace de la red.

En el script, usamos este concepto, para enviar un paquete icmp (un ping, en particular) a una ip de google, probando dicho paquete en cada una de las macs que se encuentren en el archivo configurado. Cuando se recive una respuesta icmp el script detecta que se ha encontrado una puerta de enlace.

El codigo es simple, para mostrar el concepto:

import scapy, os
macs = open("../tmp/ethers")
ether = scapy.Ether()
ip = scapy.IP()
icmp = scapy.ICMP()
# Configuracion Ethernet
ether.type = 0x0800
# Configuracion IP
ip.dst = "72.14.207.99"
#seteamos una ip publica para dirijir el paquete hacia el exterior
# Configuracion ICMP
# Se setea por defecto, pero queda mas prolijo:
# icmp tipo 8 es echo
icmp.type = 8
icmp.code = 0
# y aqui vamos con la verdad de la milanesa
for i in macs.readlines():
   i.strip("\n")
   #Configuramos el frame ethernet
   ether.dst = i
   #Creamos el paquete
   paquete = ether/ip/icmp
   # y finalmente lo enviamos
   print "ENVIANDO A " + str(i.strip("\n"))
   result = scapy.srp(paquete, timeout=2,verbose=0)
   if len(result[0]) == 1:
      print "Puerta de enlace encontrada ", str(i.strip("\n"))

/* A partir de marzo nos estamos mudando a http://netsecure.com.arhttp://www.netvulcano.com.ar */
Escrito en Scripts. Etiquetas: , , , , . Deja un Comentario »

IPRoute el gran director I

IPRoute, la otra cara de la moneda

Por herencia de los ancestrales unixs, linux, tiene 3 herramientas fundamentales para la configuración de las redes:

ifconfig, route y arp.

Sin embargo, estos comandos, no nos pueden proveer de todo el potencial que el kernel linux puede darnos para nuestras redes.
He tratado de exponer en los artículos sobre Netfilet, la punta del iceberg de lo que Linux puede hacer en cuanto al manejo de paquetes de red.
IPRoute2, es el conjunto de herramientas que nos  terminará de dar el control completo sobre todo ‘paquetito’ que quiera circular por nuestra red.

Adiciono una lista de los programas que instala IProute2:

Programas instalados: arpd, ctstat (enlace a lnstat), genl, ifcfg, ifstat, ip, lnstat, nstat, routef, routel, rtacct, rtmon, rtpr, rtstat (enlace a lnstat), ss y tc

Descripciones cortas

arpd Demonio ARP a nivel de usuario, útil en redes realmente grandes en las que la implementación ARP del núcleo es insufuciente, o cuando se configura un “honeypot”.
ctstat Utilidad para el estado de la conexión.
genl
ifcfg Un guión del intérprete de comandos que actúa como envoltorio para el comando ip.
ifstat Muestra las estadísticas de las interfaces, incluida la cantidad de paquetes enviados y recibidos por la interfaz.
ip El ejecutable principal. Tiene diferentes funciones:

ip link <dispositivo> permite a los usuarios ver el estado del dispositivo y hacer cambios.

ip addr permite a los usuarios ver las direcciones y sus propiedades, añadir nuevas direcciones y borrar las antiguas.

ip neighbor permite a los usuarios ver los enlaces de vecindad, añadir nuevas entradas de vecindad y borrar las antiguas.

ip rule permite a los usuarios ver las políticas de enrutado y cambiarlas.

ip route permite a los usuarios ver las tablas de enrutado y cambiar las reglas de las tablas.

ip tunnel permite a los usuarios ver los túneles IP y sus propiedades, y cambiarlos.

ip maddr permite a los usuarios ver las direcciones multienlace y sus propiedades, y cambiarlas.

ip mroute permite a los usuarios establecer, cambiar o borrar el enrutado multienlace.

ip monitor permite a los usuarios monitorizar continuamente el estado de los dispositivos, direcciones y rutas.

lnstat Proporciona estadísticas de redes Linux. Es un sustituto generalista y con características más completas para el antiguo programa rtstat.
nstat Muestra las estadísticas de la red.
routef Un componente de ip route. Este es para refrescar las tablas de enrutado.
routel Un componente de ip route. Este es para listar las tablas de enrutado.
rtacct Muestra el contenido de /proc/net/rt_acct.
rtmon Utilidad para la monitorización de rutas.
rtpr Convierte la salida de ip -o a un formato legible
rtstat Utilidad para el estado de rutas.
ss Similar al comando netstat. Muestra las conexiones activas.
tc Ejecutable para el control del tráfico. Este es para las implementaciones Quality Of Service (QOS, Calidad de Servicio) y Class Of Service (COS, Clase de Servicio).

tc qdisc permite a los usuarios establecer la disciplina de colas.

tc class permite a los usuarios establecer clases basadas en la planificación de las disciplinas de colas.

tc estimator permite a los usuarios hacer una estimacón del flujo de red en una red.

tc filter permite a los usuarios establecer el filtrado de paquetes QOS/COS.

tc policy permite a los usuarios establecer las políticas QOS/COS.

Como veran, iproute no es un tema trivial, la idea de este articulo es ver el manejo BÁSICO del comando ip.

Para comenzar a ver los primeros rayos de luz, comenzaremos por la administración mas básica y cotidiana.

Adios ifconfig

Repasemos el uso de ifconfig:

Onix:~# ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 00:00:01:51:31:61
          inet addr:10.6.1.1  Bcast:10.6.1.255  Mask:255.255.255.0
          inet6 addr: fe80::221:86ff:fe5c:3761/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:44098 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27090 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:16877090 (16.0 MiB)  TX bytes:6276440 (5.9 MiB)
          Memory:fe000000-fe020000

Ejecutando ifconfig con una interfaz como argumento nos muestra cierta cantidad de información, generalmente mas que suficiente para las tareas diarias.
Generalmente usaremos ifconfig, para configuar la dirección IP (direccion ip y mascara de de sub red), tambien para saber justamente cual es la dirección configurada, o bien para activar o desactivar una interfaz (up / down). Otra tarea, es la de crear interfaces virtuales o alias (ifconfig eth1:1 192.168.0.1).
Veamos como traducir esto a iproute, y luego explicamos como funciona!

Primeramente, iproute es un paquete que contiene 2 herramientas fundamentales ip y tc. En este momento nos centraremos en el comando ip que al igual que iptables, es una interfaz para el manejo que hace el kernel.

Basta de alaraca!

Lo que ante haciamos con un ‘ifconfig -a’ (mostrar la info de todas las interfaces), ahora podremos hacerlo con:

Onix:~# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever

2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
link/ether 00:00:01:51:31:61 brd ff:ff:ff:ff:ff:ff
inet 10.6.1.1/24 brd 10.6.1.255 scope global eth1
inet6 fe80::221:86ff:fe5c:3761/64 scope link
valid_lft forever preferred_lft forever

Probablemente te tire algo parecido, pero lo primero a recalcar, es que la información básica que encontrábamos en el comando ancestral, también la encontraremos aquí. Nos estamos refiriendo a la dirección ip (dirección y mascara), pero antes de ahondar, hagamos unos ejemplos mas.

Lo que antes haciamos con ‘ifconfig eth1′.. adivinen…

Onix:~# ip addr show eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
link/ether 00:00:01:51:31:61 brd ff:ff:ff:ff:ff:ff
inet 10.6.1.1/24 brd 10.6.1.255 scope global eth1
inet6 fe80::221:8
6ff:fe5c:3761/64 scope link
valid_lft forever preferred_lft forever

Eso es simple.. sigamos.

Lo que antes haciamos con ‘ifconfig eth1:1 10.0.0.1′ (un alias, o una interfaz virtual) ahora lo haríamos:

Onix:~# ip addr add 10.0.0.1 dev eth1 &&  ip addr show eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
link/ether 00:00:01:51:31:61 brd ff:ff:ff:ff:ff:ff
inet 10.6.1.1/24 brd 10.6.1.255 scope global eth1
inet 10.0.0.1/32 scope global eth1
inet6 fe80::221:8
6ff:fe5c:3761/64 scope link
valid_lft forever preferred

Vemos que se agrego una linea ‘inet 10.0.0.1/32 scope global eth1′, que si hacemos un ifconfig, es como si ni existiera.
Hasta ahi con el ifconfig, veamos como cambia el tema de las rutas.

‘route’, es un comando simple de usar, pero suficientemente potente para las tareas mas comunes, pero, no explota de forma completa lo que Linux puede hacer por nosotros.

Si antes haciamos ‘route -n’, ahora podemos hacer:

Onix:~# ip route list
10.1.1.0/24 dev eth1  proto kernel  scope link  src 10.1.1.1
default via 10.1.1.100 dev eth1

La informacion es casi la misma…

Bien ya vimos suficiente como para darnos cuenta que el comando ip centraliza las tareas, y trabaja de una forma distinta a la acostumbrada en los sistemas unix, sin embargo esto se adecua más a los sistemas embebidos, como por ejemplo los sistemas CISCO.
Ahora, ya dejemos las recetas prácticas y veamos un poco de teoria.

Primero, vamos a convencernos de que iproute2 no solo provee una nueva sintaxis, si no que tiene verdaderos beneficios.
Para varios, les sera de interés, saber que iproute provee la posibilidad de hacer balanceo de carga,  es decir, dividir la cantidad de tráfico en distintas conexiones.
Otro de los beneficios, es poder tener varias tablas de routeo, para configurar redes complejas, y algo de lo que se habla mucho en este tiempo, que es la posibilidad de usar QoS para limitar el ancho de banda de las conexiones.
Si comparamos esto, con las arcaicas herramientas, veremos que iproute2 es una herramienta poderosa.
Revisemos entonces la forma de trabajar de iproute2, en particular, del comando ip.

Sintanxis

El comando ip, concibe a todo como un objeto, al cuál le cambiará ciertas cualidades de dicho objeto.
Por lo cuál su sintaxis es la siguiente:

ip [ opciones ] Objeto [ Comando [ argumentos ]]

Los objetos son los siguientes (extraido de wikipedia):

  • link Para configurar los objetos físicos o lógicos de la red
  • address Manejo de direcciones asociadas a los diferentes dispositivos. Cada dispositivo debe tener al menos una dirección asociada.
  • neighbour Permite a los usuarios ver los enlaces de vecindad, añadir nuevas entradas de vecindad y borrar las antiguas.
  • rule Permite a los usuarios ver las políticas de enrutado y cambiarlas.
  • route Permite a los usuarios ver las tablas de enrutado y cambiar las reglas de las tablas.
  • tunnel Permite a los usuarios ver los túneles IP y sus propiedades, y cambiarlos.
  • maddr Permite a los usuarios ver las direcciones multienlace y sus propiedades, y cambiarlas.
  • mroute Permite a los usuarios establecer, cambiar o borrar el enrutado multienlace.
  • monitor Permite a los usuarios monitorizar continuamente el estado de los dispositivos, direcciones y rutas

Veamos el ‘objeto’ mas común: address

Desde aquí se administraran las direcciones del protocolo IP (v4 o v6) asignadas a los dispositivos (interfaces).
Como ya se mencionó cada dispositivo debe tener como mínimo una dirección, lo que significa que podrá tener mas de una también.
A diferencia de ‘ifconfig’, no se llama ‘alias’ a las direcciones agregadas, si no que iproute llama dirección primaria (a la dirección principal) y direcciones secundarias (a lo que llamabamos alias).

Address, también abreviado como ‘addr’, tiene los siguientes comandos:
‘add’, ‘del’, ‘show’, ‘flush’, ‘change’, y ‘replace’.
No son dificil de imaginar para que sirven cada uno, pero veremos algunos ejemplos.

Add:
Agrega una dirección a un dispositivo.

ip route add 10.0.0.1/24 broadcast 10.0.0.255 dev eth1

Como verán, no implica mucha complejidad.
Vimos en su sintaxis, que ‘route’ era el objeto, y ‘add’ es un comando.
Los argumentos usados para este comando, fueron:
10.0.0.1/24 : Dirección IPv4 en notación CDIR.
broadcast 10.0.0.255 : Dirección de broadcast
dev eth1 : Nombre del dispositivo

Existen otros argumentos opcionales para el comando add, y se pueden ver haciendo, como siempre.. un man ip

Del:

Borra una dirección de un dispositivo.

ip address del 10.0.0.1/24 dev eth1

El comando del, necesita que le mencionen el dispositivo al cual se le quiere borrar una dirección, y la dirección que se quiere borrar, que si no se mencionara, se borraría la primera.

Show:

Lista las interfaces y sus direcciones, y se especifica una en particular, se lista las características de esa.

Onix:~# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
    link/ether 00:11:46:6c:34:61 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.1/24 brd 10.1.1.255 scope global eth1
    inet6 fe80::221:86ff:fe5c:3761/64 scope link
      valid_lft forever preferred_lft forever

O bien podemos listar una sola usando ‘ip addr show eth1′, para mostrar solo la eth1.
El comando show, también soporta mostrar las interfaces que cumplen con una característica, por ejemplo:

ip addr show to 192.168.1.1/24

Me mostraría todas las interfaces con una dirección 192.168.1.1.
Algunas de las características que se pueden usar son:
dev: Nombre del dispositivo.
scope: Dispositivos que coincidan con ese ‘scope’ (ámbito)
to: Dispositivos que contengan la ip dada.
label: ‘etiqueta’ del dispositivo
Y aquí paramos un segundito, ya que es valido aclarar, que cuando agregamos una dirección secundaria, podemos asignarle una etiqueta.
Pensemos que cuando hacemos un ‘ifconfig eth1:1 192.168.1.11′, en realidad lo que hacemos es asignarle una dirección más a la interfaz eth1, la cual llamamos eth1:1 para identificarla de forma diferente. Con ‘ip’, podemos agregar una dirección, de forma lisa y llana, o bien, asignandole una etiqueta, la cual debe coincidir en las primeras letras con el nombre del dispositivo. Por ejemplo, una dirección secundaria a eth1, podria tener un ‘label’ que se llame eth1secu o bien eth1:1.

Flush:

Se darán cuenta que hace un flush (borrado, lavado) de las direcciones de una interfaz.

ip addr flush eth1

Con lo que eth1 quedaria sin ninguna dirección IP

Bien, con esto, solo hemos visto apenas como usar el comando ip, para manejar direcciones ip.
Veamos ahora un poquito acerca de las rutas.

Otro ‘objeto’ muy usado es ‘route’, desde el cual se puede controlar de forma avanzada el sistema de router del kernel. Para finalizar este pequeño articulo sobre iproute, veamos el manejo básico y estaremos en condiciones para el proximo artículo, de hablar de cosas un poco mas ‘avanzadas’.
Con ‘ip route’ así solito, el comando nos listará las rutas definidas. Usar ‘ip route’ es sinonimo de ‘ip route show’ ó ‘ip route list’.
Al igual que Netfilter, ‘ip’ utiliza tablas, que sirven para definir las reglas de  routeo.
Cada entrada de la tabla contiene un dato clave, que es la dirección de la red/host. Cuando un paquete matchea contra esa regla/ruta, (o matchea con el TOS, veremos mas adelante), se le aplica la ruta a dicho paquete.  En caso de encontrarse varias coincidencias, primero se observa la dirección de red, luego el TOS, y finalmente la preferencia)

Podemos ver, que los comandos que podemos tirar sobre este objeto son iguales a los de addres.
Flush, como es de esperar, borrará la ruta/s deseadas, o todas si no se pasan argumentos, y ya dijimos que show, ó list (también abreviado como s, sh, ó l, ls, list, nos muestra las rutas, y si lo indicamos, las rutas pertenecientes a algún criterio en particular como lo vimos con address. Se agrega un comando iteresante, que es get, el cual nos permite comprobar las rutas.
Para agregar una ruta, usamos:

ip route add 'ruta'

Donde en ‘ruta’, se definirán las distintas opciones que debe cumplir un paquete para matchear con la dicha ruta. Pero algo que no es opcional, es la dirección de la red, y justamente el destino que debe tomar los paquetes que matcheen con dicha ruta.
El uso mas común sería:

ip route add 10.0.0.0/24  via 192.168.1.2

Donde le decimos al kernel, que todo lo que quiera ir hacia la red 10.0.0.0/24, utilice de pasarela a la ip 192.168.1.2.
Para cambiar una ruta podemos usar, replace o change de la misma manera.
Y para borrar una ruta, cambiariamos el del, en lugar del add, y dejando todo lo demas igual.

Queda más por ver, pero trataremos de analizarlas de forma mas profunda en la segunda parte.

Todas las correcciones son bienvenidas! ;)

/* A partir de marzo nos estamos mudando a http://netsecure.com.arhttp://www.netvulcano.com.ar */

NetFilter / IPTables V

Matcheteando todo!

Antes de comenzar te recomiendo ver los post anteriores ( NetFilter / IPTables I, II, III, IV)
Finalmente podemos entrar en este tema, del cual no se suele hablar mucho, y sin embargo a mi me parece por demás útil!!
Los matches de NetFilter, convierten a este firewall en un excelente sistema de filtrado y protección para nuestro sistema, por lo que trataremos de dar una vislumbre de este amplio tema.

La verdad de la milanesa

Mencionamos en el articulo anterior que existen una buena variedad de matchs, que nos provee netfilter, para poder precisar nuestras reglas.
Vamos a ir viendo uno por uno estos matchs para poder exprimir al maximo nuestro firewall.

Nota: Los ejemplos mostrados actualmente carecen de una explicación completa de un uso real posible, son solo un ejemplo de como usarlos en una cadena.

Para comenzar, es necesario mencionar una de las funcionalidades, que le otorgan tanto poder a NetFilter, que a diferencia de lo que imaginan que voy a decir, no es el sistema de matches, si no que (además) Netfilter posee un modulo llamado Conntrack, o Connection Tracking.

Este tal ‘conntrack’,  provee herramientas, para manejar las conexiones, de una forma avanzanda..

Lo que hace, es vigilar las conexiones, darles un seguimiento y relacionarlas, para que, no solo podamos establecer reglas sobre las peticiones o respuestas (considerando los paquetes de forma individual), si no sobre los flujos de información/datos que pasan a travez de nuestro Firewall.
Para esto, a las conexiones se les asigna ‘estados’. Con este ‘etiquetamiento’ de estados, NetFilter puede ejecutar una serie de herramientas, que lo vuelven muy poderoso. Una de las facultades que adquiere, es filtrar paquetes, dependiendo de si están asociados a una conexión y el estado de la misma. Esto se podrá entender cuando veamos los distintos matchs que utilizan Connection Tracking.

(Se puede evitar que netfilter haga este seguimiento mediante la tabla raw antes vista)

Los estados de una conexión pueden ser los siguientes:
INVALID,  NEW, ESTABLISHED, RELATED, SNAT, DNAT, NONE, EXPECTED, SEEN_REPLY, ASSURED, CONFIRMED.
No voy a explicarlos a todos aqui, por que haciendo una man iptables ,pueden ver una pequeña pero suficiente explicación de cada uno de los estados.

Para acentar el conocimiento sobre este modulo, podemos prácticar algo con el primer match que estudiaremos:

State

Este match, favorito y muy popular en los scripts de firewalls, permite tomar el estado de una conexión (sea tcp , udp, o icmp).
Primero veamos cuales son los posibles estados de una conexión a matchear:

NEW, ESTABLISHED, RELATED, e INVALID
Sus nombres son muy descriptivos, hasta para los que no saben ingles.
NEW: Se da en conexiones ‘nuevas’,  en el caso de una conexión tcp, estariamos hablando del primer SYN (el que abre juego) del SYN/ACK ( la respuesta) y el ACK ( de confimación). En conexiones UDP,  en realidad no hay una ‘conexión’, sin embargo por razones que exceden este articulo, se toma al primer paquete udp enviado a un puerto como NEW, y en caso del ICMP,  pasa lo mismo, tomandose el primer paquete para el estado NEW (por ejemplo un ICMP ECHO REQUEST).

ESTABLISHED : Son las conexiones, que (valga la redundancia) estan ya establecidas, en TCP, hablamos de los paquetes que no sean los primeros 3, y dependiendo que quien envie el FIN/ACK los últimos paquetes necesarios para cerrar la conexión, en UDP son los paquetes que provienen del mismo puerto del que se mando un paquete en ‘estado NEW’, ICMP se considera established, miestras se espera la respuesta al mensaje enviado.

RELATED
: Son los paquetes que inician una nueva conexión, pero que esta asociada a otra. Por ejemplo cuando al inicio de una conexión TCP, se le responde con un mensaje ICMP, o lo mismo para UDP, o las conexiones FTP…

INVALID : Simplemente, cuando un paquete es erroneo o no reconocido, y se toma como invalido

Una vez comprendido esto, resta ver como matchear:

[ ! ] –state : Es posible listar los estados posibles que puede tener el paquete para que sea ‘atrapado’ en la regla, por ejemplo: “NEW,ESTABLISHED” o “RELATED,INVALID”, o la conbinación (y cantidad) que les paresca.

Ejemplo:

iptables -A INPUT -i eth1 -m state –state ESTABLISHED,RELATED -j ACCEPT
Esto acepta todas las conexiones que estan en estado “related” o “established” (ver arriba)

Conntrack

Este match, tiene en sus manos herramientas que sirven para interfacear el trabajo del módulo llamado del mismo nombre. Es decir, nos otorga cierto control sobre el Connection Tracking del Kernel. En particular, es una forma avanzada del modulo anterior (state, al que de alguna manera podemos ver como una interfaz).
Por ejemplo:

[ ! ] –ctstate : Matchea si una conexión se encuentra en uno de los estados listados como argumento a esta opción. (pe: NEW,ESTABLISHED)
[ ! ] –ctproto : Matchea si coincide el protocolo (TCP, UDP, ICMP)

Como explicamos antes, Conntrack, hace que los paquetes no se vean, como simples paquetes individuales, si no que esten relacionados cuando pertenecen a una misma conexión. Las siguientes opciones nos permiten detectar paquetes que pertenezcan a una conexión:
[ ! ] –ctorigsrc address[/mask] :  Donde la ip de origen es la especificada (“Address[/mask]“)
[ ! ] –ctorigdst address[/mask] : Donde la ip de destino es la especificada (“Address[/mask]“)
[ ! ] –ctreplsrc address[/mask] : Donde la ip de origen que responde (reply) es la especificada (esto es casi igual a ctorigsrc)
[ ! ] –ctrepldst address[/mask] : Donde la ip de destino que responde (reply) es la especificada (casi igual a ctdstsrc)

Las demas son iguales solo que correspondientes a un puerto.
[ ! ] –ctorigsrcport port
[ ! ] –ctorigdstport port
[ ! ] –ctreplsrcport port
[ ! ] –ctrepldstport port

[ ! ] –ctstatus : Detecta los estados de una conexión, los cuales pueden ser los siguientes: NONE, EXPECTED, SEEN_REPLY, ASSURED.
[ ! ] –ctexpire : Detecta según la cantidad de segundos que le faltan a una cionexión para expirar. Es decir para que Netfilter / Conntrack la considere muerta

–ctdir : Detecta si los paquetes son “ORIGINAL” o “REPLY”, si no se especifica, se considera los dos casos.

Como vemos, conntrack (el match) es una forma avanzada de state.

Ejemplo:

iptables -A INPUT -p tcp -m conntrack –ctstate  ESTABLISHED, RELATED  -j ACCEPT

En este ejemplo, volvemos a realizar lo que hicimos en el ejemplo anterior,  solo para mostrar que es lo mismo.

iptables -A INPUT -p tcp -m conntrack –ctorigsrc 10.1.10.0/24 -j ACCEPT

Ahora, para mostrar que este modulo es mas avanzado que state, lo que hacemos es lo siguiente: Aceptamos las conexiones, que (en el módulo conntrack ) tengan la ip origen en 10.1.10.0/24

TTL

Conociendo un poco la arquitectura del protocolo IP, veremos que si no existiera el TTL los paquetes podrían dar vueltas por internet indefinidamente, o nunca llegarían.
Que es el TTL? Time to Life, tiempo de vida.
El TTL, es una propiedad de la cabezera IP, en si, es solo un número que se decrementa, cada vez que atravieza un gateway (o pasarela). Y sirve
justamente, para que un paquete, no pueda quedar andando por pasarelas, como un fantasma sin destino.
Todos los paquetes IP, son generados este contador, cuyo número máximo, puede ser 255. Al pasar por cualquier Host o pasarela, se debe decrementar en uno, este contador, y si el contador es 0 se debe eliminar este paquete.

El típico ejemplo, cuando se habla de TTL, es hablar del “traceroute”, ya que lo que hace este programita, es enviar paquetes ICMP, incrementando el valor TTL, de esta manera, el primer paquete, sale con un TTL en 1, al llegar a la “puerta de enlace”, esta informa que el “paquete murio en transito”, así, con el mensaje de error, se obtiene la ip del primer salto y se lo informa por pantalla, el segundo lo envia con TTL dos, y muere en el siguiente host, y asi sucesivamente.

Mucho ruido y pocas noeces..

Ok, Podemos usar las siguientes opciones:

–ttl-eq : Matchea si el ttl es igual al número pasado como argumento
–ttl-gt : Matchea si el ttl es más grande que el número pasado como argumento
–ttl-lt : Matchea si el ttl es mas chico que el número pasado como argumento

Ejemplo:

iptables -A INPUT -p icmp -m ttl –ttl-lt 15 -j DROP

El TTL, es ignorado por la mayoria, sin embargo este campo del paquete ip, puede llegar a ser usado para obtener información valiosa.
En este caso,  rechazando los paquetes icmp con ttl menor a 15, evitamos por ejemplo ciertos “traceroutes”, lo que me inspira a escribir algún otro post sobre el asunto.

Multiport

Usando este match junto a “-p tcp” o “-p udp”, podemos especificar rangos de puertos, tanto de origen como de destino.
–source-ports : Lista de puertos, o rango de puertos de origen
–destination-ports : Lista de puertos, o rango de puertos de destino
–ports : Lista o rango de puertos, indistinto si es de destino o de origen.
Aclaro, que Multiport matchea si el puerto del paquete (tcp o udp) coincide con cualquiera de los puertos en la lista o rango.
Se puede anteponer “!” para especificar lo contrario. (Ej. “! –ports 3:90″)

- De ahora en mas usaré [ ! ], para indicar que vale usar el “!” para negar lo especificado -

Ejemplo:

iptables -A INPUT -p tcp -m multiport –source-ports 1:1024 -j ACCEPT

Aca, aceptamos las conexiones entrantes (tcp) que provengan de los puertos 1 al 1024.  Estos puertos suelen ser solo manejados por el administrador de sistema, por lo que para que alguien puede iniciar una conexión desde esos puertos, significa que tiene acceso root (en los unix) o administrador (en los windows). Si tenemos una política restrictiva entrante (es decir -P INPUT REJECT),  estaríamos aceptando conexiones de otros sistemas, que solo pueda ser iniciadas por un root/administrador .

MAC

Cualquiera que tenga un AP con linux, le puede ser de mucha utilidad este match, y para quienes no seguramente que también.
Deben estar imaginando, que este match les permitira filtrar mediante MAC, y estan en lo cierto,
Espero que también hallan imaginado, que este modulo solo se puede usar en las cadenas de ingresos (PREROUTING, INPUT y FORWARD) de paquetes, por que también estarán en lo cierto, lo que es completamente lógico.
[ ! ] –source-mac : Se pasa como argumento la mac, con el formato “xx:xx:xx:xx:xx:xx”

Ejemplo:

iptables -A INPUT -m mac –source-mac aa:bb:cc:dd:ee:ff -j DROP

Mas facil, imposible. Esta cadena, rechaza las conexiones desde la mac aa:bb:cc:dd:ee:ff

DSCP

Existe en la cabezera IP, una serie de bits destinados a servir como flags para el servicio diferenciado, como no existe un estandar, algunos usan DSCP y otros TOS.
[ ! ] –dscp : Matchea si el valor del paquete es el indicado.
[ ! ] –dscp-class : Matchea por clase, y los valores posibles son BE, EF,AFxx o CSx.

Ejemplo:

iptables -I OUTPUT  -m dcsp –dscp 16 -j REJECT

Esta cadena, reject el uso de dscp con valor 16, de un paquete saliente. Sinceramente poco usado (hasta donde la experiencia) me muestra.

TOS

Como explicaba anteriormente, TOS es una implementación para tener en cuenta el tipo de servicio.
[ ! ] –tos : Matchea si corresponde el valor de TOS
Valores posibles:

(0×10) 16 Minimize-Delay
(0×08)  8 Maximize-Throughput
(0×04)  4 Maximize-Reliability
(0×02)  2 Minimize-Cost
(0×00)  0 Normal-Service

Ejemplo:

iptables -A INPUT -m tos –tos 0×10 -j DROP

Dropeamos todo lo entrant con TOS 16. Hoy en dia TOS es usado para implementar QoS, sumamente importante para priorizar tráfico, o controlar el ancho de banda.

Recent

Este, es uno de los módulos mas interesantes!
Es que puede ayudarnos a detectar DoS, DDoS, o incluso escaneos!
Prestemos un poco de atención:
La pegada de “recent”, es que genera una lista (o varias) de ips, las cuales, luego, podemos utilizar en otra regla de iptables.
Si fueramos un super administrador, hariamos que nuestro firewall nos tiere un log de todas las ip que se conectan con nosotros, y estariamos todo el tiempo, haciendo un tail de log, para ver si alguien esta intentando realizarnos un DoS, pero como nostros somos más que un super administrador ( :P ), dejaremos que NetFilter sea quien trabaje por nosotros. Por lo que vamos a pedirle, que todas las conexiones que ingresen al puerto 80 sean controladas.. de que forma?
Pues pediremos que solo puedan hacer  5 conexiones (nuevas) cada 10 segundos.
Primero le diremos a iptables, como queremos que se cree la lista:

iptables -A INPUT -i eth1 -p tcp –dport 80 –tcp-flags ALL SYN  -m recent –set

Así solito nomas, entonces, todas las conexiones que sean tcp dirigidas al puerto 80, con solo el flag SYN activado, seran puestas en la lista.
Y ahora descartamos los paquetes que se excedan:

iptables -A INPUT -i eth1 -p tcp –dport –tcp-flags ALL SYN -m recent –update –seconds 10 –hitcount 5 -j DROP

Je… Y si todabia no entendes bien como funciona? Ok, veamos!

Cada vez que un paquete matchea contra la primer regla, pasa a listarse en un archivo /proc/net/ipt_recent/DEFAULT.
El archivo, es “DEFAULT”, por que no le pusimos un nombre especifico a la lista, pero podemos usar “–name” para otorgarle un nombre particular, lo que nos permite hacer distintos tipos de listas para distintas puertos o aplicaciones, o lo que nuestra imaginación nos dicte.
Recent, anota cada ip que matchea contra la primer regla en /proc/net/ipt_recent/nombre_que_pusimos | DEFAULT, y si matchea mas de una vez, sobre escribe esa linea, anotando la cantidad de veces que lleva matcheando. Como la primer regla, no tiene objetivo, la compración sigue camino, y al matchear con la segunda regla,
recent, obtiene la orden de limpiar la lista si se cumplio los 10 segundos, y en este caso, si alguna ip, matcheo 5 veces, pasa a cumplirse la regla y se ejecuta el DROP sobre tal IP.

Luego de este articulo, vere de escribir uno que se dedique a usar herramientas para probar estas cosas.

TCPMSS

La cabecera TCP define un flag, que programa el tamaño maximo de un segmento (paquete tcp), esto puede se útil en redes de diferente MTU, o bien en conexiones que necesiten cierto tamaño de paquetes. Este match nos permite matchear un paquete segun el MSS (Maximun Segment Size), pudiendo usar un número o un rango.

[ ! ] –mss : Valor del MSS precisado para matchear.

Ejemplo:

iptables -A OUTPUT -p tcp -m tcpmss –mss 2000:3000

Este flag de tcp es opcional y solo se puede usar en el segmento tcp que inicia la conexión (el primer SYN). Por lo que esta cadena matchea con los segmentos tcp salientes que contengan el MSS puesto entre 2000 o 3000

AH/ESP

Estos dos módulos, Ah y ESP, sirven para quienes esten usando IPSec, y les permite leer en la cabezera ip, los valores SPI de AH o ESP.

[ ! ] –espspi : Se especifica el valor SPI

[ ! ] –ahspi : Se especifica el valor SPI

Owner

Una de las particularidades de los sistemas unix, es la forma estructurada de otorgar permisos, que se implementa a travez de los usuarios. Estos son dueños de las cosas que crean, y de los recursos asignados. Este match utiliza esa propiedad, para verificar, que socket pertenece a que usuario, y nos permite delimitar una regla segun esa carácteristica.(solo valido para cadenas OUTPUT y POSTROUTING)

[ ! ] –uid-owner : Se puede utilizar como argumento, el nombre de usuario, el numero de usuario o un rango de numeros de usuarios

[ ! ] –gid-owner : Exactamente igual que uid-owner pero con nombres y numeros de grupos.

[ ! ] –socket-exists : Matchea si un paquete esta asociado con un socket.

Ejemplo:

iptables -A OUTPUT -p udp -m owner –uid-owner 1004:1007 -j REJECT

En esta cadena, rejecto los paquetes udp creados por los usuarios con id 1004 a 1007. Util por ejemplo, para denegar el trafico P2P.

Packet Type

Simple modulo que permite detectar paquetes de la capa de Link (Modelo OSI). Los tipos de paquetes exsitentes son unicast,broadcast o multicast.

Ejemplo:

iptables -A INPUT -m pkttype –pkt-type multicast -j REJECT

Detecta un paquete multicast y lo rejecta.

Mark

Mark, sirve para detectar paquetes marcados por el kernel (con el objetivo Mark) y solo sirve dentro del host que se maque, es decir, la “marca” no será detectada en otro host o nodo de la red, solo es una maca de uso interno, ya que verdaderamente no afecta al paquete, si no que es otorgada mediante el módulo Conntrack antes explicado. Sirve para, por ejemplo, establecer rutas segun dichas marcas. La “marca” debe ser un numero entero entre 1 y 4294967296.

Ejemplo:

iptables -A POSTROUTING -p tcp –dport 80 -m mark –mark 1233 -j LOG –log-prefix  ”LOADBALANCING”

Esta cadena, encuentra los segmentos tcp destinados al puerto 80, que estan siendo enrutados, y poseen una marca (numero 1233) y loguea dicha actividad. El modulo Mark, se utiliza en conjunto con IPROUTE2, el cual generalmente esta relacionado con balanceo de carga (aunque su utilidad va mas alla de eso)

Limit

Otro paquete favorito para scripts de firewalls, ya que provee la opción de limitar la cantidad de paquetes que matchean contra la regla. Esto significa que se pueden armar reglas para por ejemplo evitar DoS, o usarlo en combinación con el objetivo LOG, para generar logs de ciertas conexiones.

Limit, tiene dos parametros para matchear, el primero, es la cantidad de veces que se cumple la regla en un determinado tiempo, y el otro parametro, es la cantidad de veces que se cumplirá la regla antes de que se aplique el match.
Para poner un ejemplo, hablemos de un ataque muy común, un SYN Flood.
SYN Flood, es un ataque DoS, donde un atacante envia una gran cantidad de paquetes TCP, con el flag SYN activado. Cuando se recive un SYN, el host responde el ‘saludo’ y espera la confimación de la otra parte, pero en un ataque SYN Flood, esto no sucede, ya que el objetivo del ataque, es que el host receptor quede a la espera, y al quedar a la espera de muchas conexiónes… crush! DoS!

Como lo solucionamos? Ok, NetFilter al rescate!

iptables -A INPUT -p tcp --syn -m limit --limit 2/second  --limit-burst 5 -j DROP

Esto se traduce a: Una vez que se hayan recibido una rafaga (burst) de 5 paquetes TCP con el Flag SYN activado, se comenzaran a recibir los paquetes si se reciben de a 2 por segundos, los demas se dropearan.

Length

Interesante y simple modulo, que mide el largo de los paquetes.

Ejemplo:

iptables -A INPUT -p tcp -m length –length 64:1500 -j ACCEPT

Dejamos pasar los paquetes que solo tengan un tamaño entre 64 y 1500 bytes.

Ip Range

Match super útil, en particular si se convina con otros matches, permite establecer rangos ip, tanto de destino como de origen.

Ejemplo:

iptables -A INPUT -m iprange --src-range 192.168.1.1-192.168.1.14 -j DROP

Simple, dropea todos los paquetes provenientes del rango 192.168.1.1 al 1.14

Helper

Helper, es un módulo, que puede resultar un tanto místico, sin embargo, si se tiene en cuenta, le trabajo que hace el módulo conntrack, resulta evidente su forma de trabajo.
El ejemplo más común, para explicar este match, es hablar de FTP, que como es sabido, utiliza dos puertos para realizar una transferencia de archivos.
En el primer puerto, generalmente el 21, se establece una sesión donde se ejecutan comandos, y si es necesario, se abre un segundo puerto (generalmente el 20), el cual sirve para la transferencia de los datos de los archivos.
Helper, entonces, serviría para reconocer, cuando una conexión hecha en el puerto 20, es hija de otra conexión, es decir esta relacionada, o creada, por otra conexión.
Entonces usando “-m helper –helper ftp-20″ le diremos a NetFilter, que una conexión en el puerto 20, puede ser hija de una conexión de protocolo FTP.

ECN

ECN es par de bits dentro de la cabecera IP (v4), especificado, para el aviso de congestion de una red o host. La funcionalidad de este match, es detectar, si un paquete contiene estos bits activados

[ ! ] –ecn-tcp-cwr : Matchea si el bit Congestion Window Received esta activado
[ ! ] –ecn-tcp-ece : Detecta el ECN Echo
[ ! ] –ecn-ip-ect : Seguido de un número (entre 0 y 3) espesifica al ECN-Capable Transport

Si no entendes bien para que sirve el ECN, te puede quedar claro, pensando que IP no tiene un sistema de control de recepción de paquetes, y lo mismo pasa para udp, como en este mundo abunda la tecnodiversidad, no todos los nodos aplican esta opción y no es muy posible que te encuentres en un caso que necesites usar este modulo, pero si en algun momento lo necesitas, espero se te venga a la mente que netfilter , si esta preparado para ello.

En fin, hemos dado un vistaso a una serie de herramientas, que nos dan mucho, muchisimo control sobre todo lo que atravieza nuestro host, y hemos demostrado que NetFilter es uno de los mas completos firewalls existentes…

Aún me queda por mostrar los posibles targets y herramientas para comprobar todo este tipo de utilidades que nos da NetFilter, pero por ahora hay bastante por leer. Espero en un futuro cercano compilar todo en un solo doc.

Pero como saber mover las piezas de un tablero de ajedrez, no te convierte en un gran ajedrecista, esto es solo el comienzo……

NetFilter / IPTables IV

Antes de comenzar te recomiendo ver los post anteriores ( NetFilter / IPTables I, II, III, V)

IPTables el un amigo del usuario

Esta entrega sobre Netfilter / Iptables, vamos a dejar atras ya a las cadenas y las tablas, para centrarnos un poco mas en los comandos para ingresar, borrar, remplazar y ordenar las reglas y  la primera parte de los Matchs!

Sentencia de muerte!

Hace tiempo venimos ‘tuneando’ nuestro firewall y estamos muy conformes, sin embargo, hay cosas que aun no sabemos hacer y quedaremos encantados cuando conozcamos como usarlas.

Para adentrarnos en el tema, tenemos que ver cual es la forma en que usamos iptables por costumbre:

iptables [ -t table ] command [ match ] [ target ]

donde
[ -t table ]: table puede ser filter, nat, mangle o raw, lo vimos en el articulo anterior

command: Indica que es lo que queremos hacer con la regla (hasta ahora usamos -A y -I para insertar las reglas en un cadena, pero se puede hacer mas que eso.

[ match ]: Son las condiciones que debe reunir un paquete para quedar ‘atrapado’ en esa regla, y por consiguiente dispararse hacia el correspondiente objetivo (target)

[ target ]: Es la definición de que es lo que haremos con los paquetes que coincidan con la regla

Como vemos hay una sola restricción en cuanto a la sintaxis de iptables, y es que ‘comando’ debe estar primero que todo o a lo sumo, después de  “-t table”. Si bien podemos  ‘desordenar’ el orden de las opciones que estan entre paréntesis, no se recomienda, ya que es complicado de leer.

Sobre lo que incumbe a “-t table”, ya podemos darnos por satisfecho, pero como podrían pensar, si las demás opciones son igual o mas profundas que el “-t table”, sabremos que hay mucho por ver.

“Un camino de mil leguas, se comienza con el primer paso”

Estudiemos que se puede hacer desde “command”:

Un comando, tiene dos partes, una acción y una cadena donde se realiza la acción, y esto es muy tangible cuando miramos el siguiente comando:

iptables -t filter -A INPUT -s 192.168.0.0/24 -j ACCEPT

El comando, seria “-A INPUT”, donde “-A” pide que la regla se inserte en la cadena INPUT
Si quisiéramos borrarla,  de la misma forma que en muchos routers, para borrar una regla, hay que escribirla nuevamente indicando que queremos borrar esa regla.

iptables -t filter -D INPUT -s 192.168.0.0/24 -j ACCEPT

Este es un momento importante para recordar, que en NetFilter, es importantísimo el orden que ingresamos las reglas.
Por lo cual, veremos que el “-A” simplemente agrega una regla a la cadena, en el último lugar, haciendo de cada cadena un FIFO (First In, First Out, Primero ingresado Primero en salir) por así decirlo.
Y ya vimos que podemos querer insertar un regla primero que todas las demás, para lo cual usábamos “-I”

iptables -t filter -I INPUT -s 192.168.0.0/24 -j ACCEPT

Esto es casi todo lo necesario, para manejar nuestras reglas, sin embargo sería mejor tener un manejo mas ordenado de las reglas.

Pues desde iptables podemos manejar las reglas con números de identificación, y tan solo para probar que esto es cierto podemos hacer lo siguiente:

Onix:~# iptables -t filter -A INPUT -s 192.168.0.0/24 -j ACCEPT
Onix:~# iptables -t filter -A INPUT -s 10.0.0.0/24 -j ACCEPT
Onix:~# iptables -t filter -S INPUT
-P INPUT ACCEPT
-A INPUT -s 192.168.0.0/24 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT
Onix:~# iptables -D INPUT 1 #En esta linea borramos la regla numero 1 de la cadena input
Onix:~# iptables -t filter -S INPUT
-P INPUT ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT #Aqui vemos que solo quedo la segunda linea

Así mismo, con la opción “-I” podemos elegir el numero de orden donde será insertada la regla:
(continuando con el ejemplo anterior)

Onix:~# iptables -t filter -I INPUT -s 10.0.0.1 -j DROP #Insertamos la regla primero que todas
Onix:~# iptables -t filter -I INPUT 2 -s 10.0.0.2 -j DROP #Insertamos en segundo lugar
Onix:~# iptables -t filter -I INPUT 3 -s 10.0.0.3 -j DROP # etc..
Onix:~# iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -s 10.0.0.1/32 -j DROP
-A INPUT -s 10.0.0.2/32 -j DROP
-A INPUT -s 10.0.0.3/32 -j DROP
-A INPUT -s 10.0.0.0/24 -j ACCEPT

Para finalizar este punto, podemos observar que existe una opción que sirve para el remplazo:

Onix:~# iptables -t filter -R INPUT 2 -s 10.0.0.5 -j DROP
Onix:~# iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -s 10.0.0.1/32 -j DROP
-A INPUT -s 10.0.0.5/32 -j DROP # Aqui vemos como el reemplazo fue efectivo
-A INPUT -s 10.0.0.3/32 -j DROP
-A INPUT -s 10.0.0.0/24 -j ACCEPT



Bien, ya hicimos el primer paso, vamos con el segundo:
Esta es la parte mas divertida, al menos para mi.
Los matches, son las condiciones que el paquete tiene que 'matchear' para que el paquete
'atrapado' en la regla. Si bien habría mucho leña para cortar aquí, no puedo detenerme en explicar los conceptos que se deben manejar sobre los protocolos (IP, TCP, UDP, ICMP), por lo cual, lo que a estos sea
referente, me restringiré a mencionarlo solamente.

Matches Genericos:

-p o --protocol : Número o nombre del protocolo, para saber el numero habrá que mirar /etc/protocols,
ya dijimos que las opciones son 4, tcp, udp, icmp y all, que involucra a los 3 anteriores. Vale usar el ! para denotar 'lo contrario', es decir si escrivo "! udp" quiere decir todo lo que no sea udp, osea tcp y icmp.

-s o --source : Orgien IP del paquete, se puede usar una IP, una red con notacion CDIR o bien un dominio, pero, tengamos en cuenta, que lo que se carga en las reglas es el numero IP resulto a la hora de ingresar la regla, dado que seria imposible que se resuelva en cada paquete que reciva o envie la pc. Vale usar "!".

-d o --destination : Funciona de la misma manera que -s solo que matche sobre la dirección de destino.

-i o --in-interface : Verifica si el paquete ingresó por la interfaz pasad como argumento, solo sirve en las cadenas INPUT, FORWARD y PREROUTING, lo que es lógico. Vale usar "!".

-o o --out-interface : Al igual que -i pero sobre la interfaz de salida, y solo vale para OUTPUT, FORWARD y POSTROUTING. Es importante aclarar que especifica las interfaces de entrada y salida permite poner una barrera mas a un ataque spoofeado.

-f o --fragment :  Cuando se fragmenta un paquete, dependiendo del protocolo, no contiene en su cabezera toda la información necesaria, para que quede atrapado en algunas reglas de NetFilter, para eso se creo este match, pero es importantisimo saber que mientras . Sin embargo, ecepto que uses la tabla raw para macthear NOTRACK, NetFilter no detectara los paquetes fragmentados.

Matches para protocolos (debe existir "-p tcp" o "-p udp" para que valga )

--sport o --source-port : Indica que puerto de origen debe tener, se puede utilizar rangos, por ejemplo son validos: 80 (puerto 80), 1:1023 (puerto desde el 1 al 1023), 1025: (desde el 1025 al 65535), :21 (desde el 0 al 21), y vale usar "!" que indicará todo lo contrario.

--dport o --destination-port : Igual que --sport (eceptuando que no maneja rangos cuando se usa "-p tcp, esto se debe hacer con otra opcion que veremos mas adelante, pero si funciona con "-p udp").

--tcp-flags (solo con "-p tcp", requiere conocimientos de TCP ): Este match nos permite matchear paquetes con ciertas configuracioens de flags activados/desactivados.
Como funciona?
Primero que nada los flags posibles son: SYN, ACK, PSH, RST, FIN (de forma especial se puede usar ALL para indicar todas las flags, o NONE para indicar ninguna)
Para usar --tcp-flags primero se indica las flags que Netfilter revisará, y luego, se indican las flags que pretendemos esten activadas para que entren en la regla.
Ejemplo, si queremos DROPear solo los paquetes que contengan el flag SYN activado, se usaría:
iptables -A INPUT -p tcp --tcp-flags ALL SYN -j DROP, o bien
iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN -j DROP.
O si quisieramos matchear un paquete que no tenga ningun flag activado (el cual es invalido):
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK,PSH,RST,FIN

--tcp-options : Este match, busca matchea por el largo de los bits usados para 'options' en la cabecera TCP, aclaro que NetFilter no lee las opciones, solo matchea por el largo. Vale usar "!".
iptables -A INPUT --tcp-options 8 -j DROP, dropea todas los paquetes que tengan 8 bits usados par las opciones.

Para icmp ("-p icmp")

--icmp-type : Con iptables -p icmp --help, obtenemos una lista de los tipos de paquetes icmp.

Todos estos matches, son implicitos, es decir, no hace falta indicar que se use un modulo especial, para que los matches funcionen. Existen otros matches, que deben ser cargados con la opción -m o --match.

Estos son: ttl, dscp, multiport, tos, recent, tcpmss, ah/esp, state, owner, packet type, mark, mac, limit, length, ip range, helper, ecn, conntrack.
Luego de estos, estan los modulos de extensiones que se pueden cargar con patch-o-matic....
Como les dije, vamos por el segundo paso y aún hay mucho por recorrer!

Hasta el próximo! agradesco sus comentarios y acepto cualquier corrección ( de conceptos o de ortográfia :D )

/* A partir de marzo nos estamos mudando a http://netsecure.com.arhttp://www.netvulcano.com.ar */

NetFilter / IPTables III

Antes de comenzar te recomiendo que también visites lo siguientes posts ( NetFilter / IPTables I , II, IV, V)

NetFilter el manipulador

El diseño de NetFilter puede parecer un poco complejo si no se tiene un conocimiento completo del manejo de las tablas, y se pierde mucho si no se sabe todas las opciones que existen, por lo que revisaremos el funcionamiento de cada tabla, para saber que y como podemos hacer cada cosa.

Las otras ‘tables’ de iptables

Ya habíamos dicho que existen 4 tablas (filter, nat, mangle y raw), filter es la mas común, y se la suele obviar cuando usamos iptables, y nat la usamos cuando teniamos que ‘enmascarar’ una conexion, lo que comunmente se llama natear (actuar como router), pero ni por asomo sule mencionarse las otras 2 tablas, de hecho, muchas personas ni saben que existen, y los que lo saben, tienen entendido que son ‘tablas de un uso especial’.
Trataremos de desmitificarlas aquí!

Filter
Esta tabla, tiene a su cargo, la responsabilidad de filtrar TODOS los paquetes que el sistema maneje.
Para su uso, existen 3 cadenas predefinidas:

INPUT: Todos los paquetes, que ingresen al host deberan atravezar esta cadena
OUTPUT: Todos los paquetes generados por el host, con destino saliente, deberan atravezarla
FORWARD: Todos los paquetes que ingresen al host con el fin de atravezarlo como pasarela (gateway) seran controlados por esta cadena.

Como veran, a esta tabla, ‘no se le escapa nada’, desde ella se puede filtrar de forma eficiente cualquier paquete, sin embargo, aveces, filtrar no es suficiente, y necesitamos ‘manipular’ los paquetes de red…

Nat

La tabla Nat, se hace responsable de manipular, configurar o reescribir las direcciones y puertos de los paquetes, antes de que los paquetes ‘entren’ y ‘salgan’ del host.
Como es esto posible?
Bueno, obviamente, esta tabla no hace magia y modifica los paquetes mientras aun están en el cable de red, si no, a lo que nos referimos, es que antes que el paquete sea filtrado por la tabla filter (FORWARD), podra manipularse desde la tabla Nat, con las siguientes cadenas.

PREROUTING: Los paquetes atraviezan esta cadena antes que tengan que atravezar la tabla local (filter) y desde aqui se pude cambiar la dirección de destino e incluso el puerto. Como ejemplo, podemos decir que si entra un paquete destinado a la ip 192.168.1.2 puerto 80, podemos redirigirlo a la ip 192.168.1.3 puerto 8080, cosa muy útil para los firewalls que hacen DMZ (conocido como Destination NAT)

OUTPUT: Figurita repetida? Si Esta es la misma cadena que en la tabla filter, solo que desde la tabla nat podremos, como ya dijimos, manipular los paquetes.
En este caso, no hablamos de paquetes que esten siendo encaminados por el host, si no los paquetes de origen local, y a estos podremos aplicarles una redireccion (cambio de direccion de orgine) al igual que en la cadena PREROUTING.

POSTROUTING: Como dice su nombre, pasado el routeo de la tabla filter, esta es la ultima cadena a atravezar, y sirve para modificar la dirección y puerto de origen.
Ejemplos? Si un paquete a atravezado el host, y se dirige hacia un host en internet, y lleva como direccion de origen (por ejemplo una privada) y queremos cambiarsela, usaremos esta cadena.
Esto es super usado, por todos los que usan ADSL y hacen NAT, ya veremos por que.

Para acentuar un poco esto del ‘NAT’ y sus cadenas observemos un poco…

#Redireccionaremos todo el trafico web a un proxy cache (Destination NAT)
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.1.99:8080

#Tenemos a nuestro firewall con una ip fija, y hemos habilitado el router, pero si solo habilitamos
#el routeo, los paquetes salen hacia internet con una direccion de origen de una red privada,
#por lo que cambiamos la dirección de origen antes de que salga, por nuestra dirección ip pública
iptables -t nat POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT –to-source 200.34.43.3x

Ahora bien, en este último ejemplo, funcionaría siempre y cuando tengamos una IP estática, sin embargo, muchos (la gran mayoria) utiliza ADSL para conectarse a internet, por lo cual, si nuestra IP cambiara, esto no funcionaría. Para lo cual, NetFilter diseño un tipo de SNAT especial: MASQUERADE

iptables -t nat POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

Masquerade, significa, que haga SNAT con la dirección ip que tenga asignada la interfaz de red, por la cual saldrá el paquete, por lo cual, si nuestra dirección de internet cambia, automaticamente los paquetes saldran con el SNAT correcto.

Mangle

Ahora si, ya entramos en un camino hacia una comprensión un poco mas importante del funcionamiento de NetFilter.

Observemos que si ejecutamos ‘iptables -t magle -L’, veremos que esta tabla parece poseer, todos las cadenas de las tablas anteriores, y asi es. Por que esta tabla, es omnipresente.
Mangle, utiliza cada una de las cadenas, para modificar ciertos parámetros antes que filter o nat lean esa cadena.
Es decir que, si un paquete ingresa para ser routeado, antes que ingrese al PREROUTING de NAT, ingresa ‘al PREROUTING’ de MANGLE, y desde alli, puede ser modificado. Lo mismo sucederá con todas las demas cadenas,

Si esto no te queda 100% claro, es entendible, pero tampoco es tan complicado si seguiste todo hasta aquí, pero si no estas seguro de tus ideas, te ofrezco un gráfico para que te quedes tranquilo.

Tablas y cadenas
Tablas y cadenas

Pero.. un ejemplo práctico?

Ok, a ver si esto te convence:
(advertencia: para entender lo que hacemos aquí deberás conocer conceptos acerca del manejo de los protocolos a vajo nivel, para lo que te recomiendo que leas los RFC correspondientes)

#Cambiamos el TOS (Type Of Service)

iptables -t mangle -A PREROUTING -s 192.168.0.1 -i eth0 –dport 1950  -j TOS –set-tos 0×10

#TCPMSS

iptables -t mangle -A FORWARD -p tcp -j TCPMSS –clamp-mss-to-pmtu

#Cambiar el TTL

iptables -t mangle -A FORWARD -d 0.0.0.0/0 -i eth0 -p tcp –dport 1234 -j TTL –ttl-set 1
#Bueno… cada uno sabe lo que hace no?

En fin hay varias opciones que podemos cambiar con la tabla mangle, pero no podemos detenernos en cada una de ellas, lo importante es ver, que desde ella se puede modificar ciertos aspectos de los paquetes de red, insisto nuevamente hay mucha info en el man de iptables.

raw

Esta es una tabla nueva, y no tiene mucha variedad de uso, pero no puedo limitarme a decir, simplemente que es ‘de un uso especial’, pero si he de recalcar, no que la mayoria de los kernels no la poseen ecepto que esten parcheados.

Esta tabla, existe para un solo objetivo: NOTRACK
Vale aclarar algo: NetFilter y el Kernel en si, tienen un control de las conexiones, por ejemplo no es lo mismo, que una conexión TCP, este en estado NEW (cuando se manda el SYN y se espera el SYN/ACK), que este en ESTABLISHED (cuando se recibe el SYN/ACK y se envia el SYN de respuesta).
Todo esto lo vigila NetFilter, tanto en tcp, como udp, e icmp, ahora, esto conlleva un gasto significativo de recursos, cuando hablamos de muchas conexiones simultaneas.

Para que NetFilter no lleve ese control, y economice recursos, quizas querramos que ciertas conexiones no las ‘vigile’, para lo cual podriamos usar esta tabla:

iptables -t raw -A PREROUTING -s 192.168.0.0/24 -j NOTRACK

El problema deveniente es que no podremos controlar las conexiones que se establescan de esta forma.

Y hasta ahora solo estamos viendo lo ‘bàsico’ de iptables, y aun queda mas de lo ‘bàsico’, por lo que no te pierdas el proximo articulo sobre este mounstruo del filtrado!

Netfilter / IPTables II

Antes de comenzar te recomiendo que también visites lo siguientes posts ( NetFilter / IPTables  I, III, IV, V)

NetFilter y las cadenas de Adromeda

En este artículo haremos un repaso sobre el sistema de manejo de cadenas dentro de una tabla de iptables. Esto nos dara una poderosa herramienta para idear nuestro propio script de firewall.

Repasando

En el articulo anterior vimos el manejo de netfilter atravez de iptables.
Vimos que existen cuatro tablas: filter, raw, nat, y mangle.
Vimos que dentro de filter, existen 3 cadenas: INPUT, OUTPUT, y FORWARD.

Y vimos que podemos ingresar reglas en una cadena en particular usando “-A” ó “-I”.

Hagamos un ejemplo primero que nada para poder creer:

#!/bin/bash
alias iptables=’/sbin/iptables’

iptables -t filter -F #Borra todas las reglas de las cadenas de la tabla filter
iptables -t filter -Z #Borra los contadores de la tabla filter
iptables -t filter -X #Borra las cadenas definidas por el usuario

iptables -t nat -F #Adivinen….
iptables -t nat -Z
iptables -t nat -X

#Establecemos las políticas por defecto en reject
#Apartir de ingresar estas reglas nuestra maquina queda completamente aislada
iptables -P INPUT REJECT
iptables -P OUTPUT REJECT
iptables -P FORWARD REJECT
#En linux el la mayoria de las aplicaciones funcionan con el paradigma de cliente-servidor
#lo que involucra en muchos casos usar la interfaz de loopback, por lo que la desbloquearemos
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -i lo -j ACCEPT
#Habilitamos el SSH solo para la red interna (lo que además deberíamos hacerlo desde el sshd_config)
iptables -A INPUT -s 192.168.4.0/24 -i eth0 -d 192.168.4.1 -p tcp –dport 22 -j ACCEPT
#Aunque paresca redundante especificar algunas cosas. Por ejemplo -i eth0, si se supone que solo esa
#esa interfaz tiene una direccion en ese rango, sin embargo, estamos evitando posibles ataques
#de spoofing

iptables -A OUTPUT -d 192.168.4.0/24 -i eth0 -p tcp –sport 22 -j ACCEPT

#Como establecimos anteriormente las políticas cerradas por defecto, debemos habilitar a los paquetes,
#tanto a entrar como a salir, por eso la regla anterior.

#Habilitamos las consultas a los servidores dns
servidor_dns=”200.200.200.20x” #Variable que contiene el servidor dns (/etc/resolv.conf)
iptables -A INPUT -p udp -sport 53 -s $servidor_dns –dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -p udp -dport 53 -d $servidor_dns –sport 1024:65535 -j ACCEPT
#Como vemos, nuevamente, habilitamos el ingreso y el egreso.
#Es importante tener en cuenta, que las consultas dns se hacen desde nuestro host,
#al puerto 53 del servidor dns (en este caso $servidor_dns) y se hacen desde los puertos 1024 al 65535.
#y obviamente la respuesta, la recivimos desde el puerto 53 al puerto desde el cual fue hecha la consulta

#Habilitamos el ICMP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
#Existen distintas posturas en cuanto al icmp (si habilitarlo o no, y para donde) pero lo cierto, es que,
#la idea ahora es aprender iptables y no discutir las distintas escuelas de firewalling

# Y habilitamos NAT, es decir el ruteo a travez de nuestro servidor
echo 1 > /proc/sys/net/ipv4/ip_forward
#Esto habilita al kernel a reenviar los paquetes que vienen con intención de ser routeados

#Habilitamos mediante firewall al rango de la lan interna para ser reenviados
iptables -A FORWARD -s 192.168.4.0/24 -i eth0 -d 0.0.0.0/0 -j ACCEPT
# y luego habilitamos el nat
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -i eth0 -d 0.0.0.0/0 -j MASQUERADE
#Quizas esta regla no la entiendas del todo, pero lo que dice es que a todos los paquetes que son
#routeados, los envie con la direccion ip publica del servidor, y ademas guarda una tabla
#con las conexion que son nateadas, para que cuando lleguen las reenvie al host correspondiente

De aquí podemos empezar a comprender de forma un poco mas práctica como trabaja NetFilter.
Con un poco de trabajo, y aplicando lo que ya vimos podrías armar un firewall funcional y podría ser muy bueno, si aplicas tus conocimientos de scripting, sin embargo, no estarías utilizando todo el potencial de NetFilter.

Comentamos ya, en el artículo anterior, que podemos crear nuestras propias cadenas, y que esto brindaba una mayor flexibilidad a nuestro firewall.
Veamos exactamente de que estamos hablando…

Las cadenas hechas de reglas para las tablas!!!

Para visualizar de forma simple lo que queremos ver, vamos a suponer, que simplemente, tenemos un host especial, el cual, queremos tratar de forma única. Podemos suponer, que sera un host desde el cual controlaremos el servidor, o bien un host destinado a cierto tipo de testeo, en cualquier caso, lo importante sera, que este host en particular va a tener un tratamiento especial.

Siguiendo el metodo del script anterior, tendríamos que ingresar varias reglas para darle un tratamiento especial en cuanto a los puertos habilitados, y eso no seria demasiado complicado, sin embargo, si tubieramos varios tipos de host especiales, quizas se complicaría un poco.
Vuelvo a aclarar, que el escenario que estoy proponiendo es solo uno de los ejemplos posibles.

Definimos entonces a 204.34.33.3x como a la cual, queremos darle un tratamiento especial
Vamos a meter un poco de mano, para que se vea más:

#!/bin/bash
alias iptables=’/sbin/iptables’

#omito la seccion del flush para acortar
iptables -P INPUT REJECT
iptables -P OUTPUT REJECT
iptables -P FORWARD REJECT

#imaginemos que tenemos las mismas reglas que antes…
iptables -N tratamiento_especial
#Hemos creado una cadena nueva, y podemos verla, invocando el siguiente conjuro: iptables -L -n
#ó bien iptables -L tratamiento_especial

#Como queremos tratar de forma especial a este host, haremos que antes de aplicar
#alguna regla, verifiquemos si el paquete proviene de 204.34.33.3x
#para lo cual insertaremos la regla arriba de todas para que sea la primera en comparar
iptables -I INPUT -s 204.34.33.3x -j tratamiento_especial
#Recordemos que “-I” sin ningún numero, inserta la regla por ensima de las demas regla de la cadena
#Por lo que lisa y llanamente, todo lo que provenga de 204.34.33.3x, se comparará con
#las reglas de la cadena tratamiento_especial
#De la misma manera que agregamos (-A) reglas a las cadenas INPUT ó OUTPUT ó bien FORWARD
#podemos agregar reglas a las cadenas que creemos nosotros
iptables -A tratamiento_especial -p tcp –dport 1:1023 -j ACCEPT
iptables -A tratamiento_especial -p udp –dport 1:1023 -j ACCEPT

Bien, te recomiendo que hagas un iptables -L -n, para ver como las reglas se insertan una tras otra en la cadena tratamiento_especial, además podes insertar una regla a mano (desde la consola) con la opción “-I” y ver como se posiciona en el primer lugar.

Lo que sucederá aquí, es lo siguiente:
#A todos los paquetes que ingresen (no destinados a ser routeados) ( INPUT )
Si el paquete proviene de la ip 204.34.33.3x saltamos a la tabla de tratamiento_especial
SI la interfaz es “lo”, es aceptado
Si el paquete proviene de la red 192.168.4.0/24 y viene hacia el puerto 22 tcp a travez de la interfaz eth0, es aceptado
Si el paquete es udp y proviene del puerto 53 del servidor DNS y tiene como destino un puerto entre
el 1024 y el 65535, es aceptado
Si no cumple con ninguna la politíca es REJECTarlo

Por lo cual, cualquier paquete que ingrese al host, verificará si se cumple la primer regla, si se cumple,
automaticamente pasará a comprobar las reglas establecidas en tratamiento especial, y estas indican que:
Si es un paquete tcp entre el puerto 1024 y el 65535, es aceptado
Si es un paquete udp entre el puerto 1024 y el 65535, es aceptado

Si el paquete no proviene del host 204.34.33.3x, entonces seguira las comprobaciones (si proviene de la interfaz lo, si proviene de 192.168.4.0/24.. etc)

Ahora bien, si suponemos que ingresa un paquete icmp proveniente del paquete 204.34.33.3x, este ingresará en la tabla de tratamiento especial, pero no coincidirá con ninguna de las reglas allí establecidas… que pasará?
Se aplica la politica por defecto de rechazarlo?
Se aplica continua con las comprobaciones de la cadena INPUT?

La respuesta a la primera pregunta es NO
Simplemente por que las cadenas creadas personalmente no tienen politica, para ver esto, pueden ejecutar,
el conocido comando de listado iptables -L ó bien iptables -L tratamiento_especial. Donde podemos diferenciar de las cadenas pre establecidas que no existe una política (Policy)
La respuesta a la siguiente pregunta es SI,
si el paquete fuera icmp, ‘cruzaría’ la tabla tratamiento_especial y seguiría nuevamente por las reglas de la cadena INPUT, donde llegaria hasta la regla que dice que si el paquete es icmp, sin importar de donde venga o vaya, es aceptado.
Sin embargo, si esto no es lo que Uds esperaban, no se preocupen, por que se puede arreglar.
Como habran visto, cada vez que mandamos un paquete hacia un objetivo (“-j ACCEPT, o -j tratamiento_especial)
usamos la opción “-j”, que viene de “jump”, saltar.
Pero existe otra opción, similar a sentencias de los lenguajes de programación modulares, y esta es “-g” ó “–goto”.
Si usaramos:
iptables -I INPUT -s 204.34.33.3x -g tratamiento_especial
en lugar de
iptables -I INPUT -s 204.34.33.3x -j tratamiento_especial
En tonces, el paquete icmp, que no queda atrapado en ninguna regla de la cadena tratamiento_especial, simplemente, se le aplica la politica por defecto de INPUT.

Antes de terminar, hagamos unas pruebas para que todo esto sea verdaderamente comprobable y ya no creas mas por fe, si no antes bien, que prácticamente lo palpes.

Haremos pruebas con una herramienta muy util y ancestral… el ping.

#!/bin/bash
iptables -P INPUT DROP #Por política rechazo todo
iptables -A INPUT -i lo -j ACCEPT #acepto todo lo que pase por la interfaz de loopback
iptables -A INPUT -p tcp -j ACCEPT #acepto todo lo que sea tcp
iptables -A INPUT -p udp -j ACCEPT #acepto todo lo que sea udp
#Es decir que lo unico que queda bloqueado es el imcp

iptables -N tratamiento_icmp #creamos la cadena tratamiento_icmp
iptables -A tratamiento_icmp -i lo -j ACCEPT #ingresamos una regla a la cadena que acepta
#todo lo que ingresa por la interfaz loopback

iptables -I INPUT -p icmp -g tratamiento_icmp
#Ingresamos una regla en INPUT para que todo lo que sea ICMP lo envie a la cadena tratamiento_icmp
#hubiese sido lo mismo, definir la cadena tratamiento_icmp primero, y luego usar
# iptables -A INPUT -p icmp -g tratamiento_icmp

Ahora bien, con este script, podemos modificar la opcion -g por -j para probar los distintos funcionamientos
La primera prueba seria, correr el script así solito, y usar el comando: ping localhost, y como todo lo que sea icmp que venga por la interfaz “lo”, sera enviado (con –goto) a la cadena tratamiento_icmp, el ping responderá , ya que queda atrapado en la primera (y única) regla de la cadena, la cual acepta el icmp.

Ahora es cuestion que uses tu imaginación y observes si los cambios que haces en el script son los esperados o no, hasta que tu mente comienze ver iptables como el mejor amigo de un segu-geek!

Hay mas pruebas, pero la idea no es darte todo masticado… :D
Si se te ocurre algun aporte o algo te parece confuso comentamelo.
Hasta el proximo!!!

Seguir

Get every new post delivered to your Inbox.