Net Tools vs IPRoute2 – Parte I

 

Linux es una excelente plataforma para experimentar  y trabajar sobre networking. Las herramientas más básicas han sido heredadas de Unix (ifconfig,netstat,arp.. etc) y a decir verdad, estamos bastante cómodos con ellas. Sin embargo, hace años que el desarrollo de linux ha creado nuevas herramientas, mas poderosas aunque no tan populares; Como sabrán, me refiero, al set de herramientas iproute2.

La pregunta es: ¿Vale la pena el esfuerzo de cambiar a iproute2?

Veremos en los siguientes posts, ventajas y desventajas, uso y desusos…

Net Tools

Net Tools, también llamado mas precisamente NET-3 Networking toolkit, es un set de herramientas heredado históricamente de Unix.
Estas son: arp, hostname, ifconfig, netstat, rarp, route, plipconfig, slattach, mii-tool,  iptunnel  y ipmaddr.
A que algunas te han sorprendido eh!?
Hagamos un apropos:

arp (8): manipulate the system ARP cache
hostname (1): show or set the system's host name
ifconfig (8): configure a network interface
netstat (8):  Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
rarp (8): manipulate the system RARP table
route (8): show / manipulate the IP routing table
plipconfig (8): fine tune PLIP device parameters
slattach (8): attach a network interface to a serial line
mii-tool (8): view, manipulate media-independent interface status
iptunnel (8): creates, deletes, and displays configured tunnels
ipmaddr (8): adds, deletes, and displays multicast addresses

Ahora bien, si utilizas linux dia a dia, muy difícilmente no conozcas arp, netstat, ifconfig, hostname y route, si no conoces algunos de esos comandos, este artículo no es para vos; Sin embargo, el resto de los comandos se utilizan en situaciones mas especificas.
Convenimos pues, en que la costumbre y la simplicidad histórica de estos comandos nos gustan.
Sin embargo, veamos ahora, como una comparación con IPRoute2 nos da una mejor idea de las diferencias que hay entre ambos.

IPRoute 2

El protagonista de iproute2 es el comando ip, en el cual se resumen la mayoría de las tareas que solíamos hacer con net-tools.
Aquí tenemos una pequeña tabla de referencia:

ifconfig ip addr show
arp ip neigh show
route -n ip route show

Hay mas, pero esto sirve para que veas que el comando ip se robará el protagonismo. Desde el comando ip podremos configurar prácticamente todo lo relacionado con las redes en linux.

Veamos como usar iproute en el día a día y dejaremos para mas adelante, las opciones mas avanzadas:

Rutas

Listar rutas:

Con net-tools usabamos:

route -n

Ahora con ip route podemos usar:
ip route | ip route ls | ip route show
Cualquiera de estos tres comandos nos da como resultado algo como lo siguiente:

default via 192.168.1.1 dev eth0 proto static
10.42.0.0/24 dev wlan0 proto kernel scope link src 10.42.0.1 metric 9
148.91.164.0/24 dev eth0 proto kernel scope link src 148.91.164.131 metric 1
169.254.0.0/16 dev eth0 scope link metric 1000

Mas adelante veremos como hacer un filtrado por tipo de ruta y otras caracteristicas, pero sigamos por lo básico.

Agregar una ruta:

Con net-tools usabamos:

route add -host ip ip-gw
route add -net netip-gw

Ahora utilizamos:

ip route add ip/net via ip-gw

Por ejemplo:

ip route add 10.1.1.0/24 via 192.168.4.1

o bien:

ip route add 10.1.1.20 via 192.168.4.1

Como verán, es indistinto si es un host o una red. Nos es muy diferente en principio, pero mas adelante veremos cuantas otras opciones tenemos para agregar.

Quitar una ruta:

Con net-tools usabamos:

route del -host ip gw ip_dw
route del -net net gw ip_gw

Ahora utilizamos:

ip route del ip via ip_gw
ip route del net via ip_gw

Direcciones IP

Es dificil pensar en no usar el ‘ifconfig’, pero hagamos un intento y veamos que sale:

Listar interfaces

Con net-tools usabamos
ifconfig | ifconfig -a

Con iproute utilizamos

ip addr | ip addr list | ip addr show

Que nos devolverá un output como el siguiente:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN group default
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 63:34:55:66:11:3a brd ff:ff:ff:ff:ff:ff
inet 123.41.14.135/24</strong> brd 123.41.14.255 scope global eth0
inet6 fe80::6531:50ff:fe68:1d34/64 scope link
valid_lft forever preferred_lft forever
3: wlan0: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:26:82:dc:9d:51 brd ff:ff:ff:ff:ff:ff

En principio, el output de ip addr tiene mas info del que acostumbramos con ifconfig, pero nada de que preocuparse. Verán señalado en el output anterior, alguna data interesante señalada.

Asignar direcciones:

Con net-tools usabamos ifconfig de la siguiente manera para asignar una dirección IP:

ifconfig eth0 ip netmask netmask

Con iproute usaremos:

ip addr add ip/prefix dev eth0

Y para eleminar una ip de manera similar:

ip addr del ip/prefix dev eth0

Primeras conclusiones

Si bien iproute no parece incrementar la dificultad de configurar básicamente nuestras redes, no deja de ser cierto que la costumbre tira para seguir usando el viejo set de utilidades unix-like, sin embargo, en los próximos posts veremos usos mas avanzados y útiles que haran inclinar la balanza.

~have fun

ZMap mas rápido que NMap

ZMap es un escaner de redes (tal como lo es el famosísimo nmap) que sirve para auditorias de seguridad, testings, monitoring etc etc. Sin embargo, a diferencia de otros scanners, ZMap es muy veloz y tiene un potencial muy interesante dado sus cualidades. Según sus autores, tiene la capacidad de scanear todas las ip de ipv4 en 45 minutos desde una PC normal y fue creado con el fin de encontrar vulnerabilidades en forma masiva.
Como explican en el WashintongPost:

In contrast, ZMap is “stateless,” meaning that it sends out requests and then forgets about them. Instead of keeping a list of oustanding requests, ZMap cleverly encodes identifying information in outgoing packets so that it will be able to identify responses. The lower overhead of this approach allows ZMap to send out packets more than 1,000 times faster than Nmap. So while an Internet-wide scan with Nmap takes weeks, ZMap can (with a gigabit network connection) scan the entire Internet in 44 minutes.

ZMap no tiene un registro de los paquetes enviados, simplemente envía los paquetes con data que al ser devuelta puede identificar y decodificar, haciéndolo 1300 veces mas rápido que nmap.

Instalación

Su instalación no debería serte en absoluto un problema, ya que esta portado para varias distribuciones, como se documente en su sitio:

Debian or Ubuntu: sudo apt-get install zmap
Fedora, CentOS, and RHEL: sudo yum install zmap
Gentoo: sudo emerge zmap
Mac OS (brew): brew install zmap
Arch Linux: Available through AUR

Por otro lado, lo puedes descargar/clonar desde GitHub
La información para compilarlo, puedes verla aquí

En particular, en Debian 7, necesitaras tener entre tus repositorios, los backports:

deb  http://http.debian.net/debian  wheezy-backports main contrib non-free

Uso

La rapidez de zmap hace que sea ideal para escanear una gran cantidad de hosts (syn scan) en poco tiempo (de hecho, lo hace tan rápido, que hemos de tener cuidado al usarlo). El output generado por zmap, es simple, una lista de las IPs, que pueden servir como input para otro programa. Veamos su uso más básico:

# zmap -p 22 -o iplist.txt 200.0.0.0/8

Obtendremos un output en la consola similar al siguiente:

 Mar 02 21:27:12.301 [INFO] zmap: output module: csv
0:01 1%; send: 148953 149 Kp/s (135 Kp/s avg); recv: 0 0 p/s (0 p/s avg); drops: 0 p/s (0 p/s avg); hits: 0.00%
0:02 2%; send: 297811 149 Kp/s (142 Kp/s avg); recv: 0 0 p/s (0 p/s avg); drops: 0 p/s (0 p/s avg); hits: 0.00%
0:03 2%; send: 446588 149 Kp/s (144 Kp/s avg); recv: 1 0 p/s (0 p/s avg); drops: 0 p/s (0 p/s avg); hits: 0.00%
0:04 3%; send: 595473 149 Kp/s (145 Kp/s avg); recv: 1 0 p/s (0 p/s avg); drops: 0 p/s (0 p/s avg); hits: 0.00%

Como vemos, vamos recibiendo un update del estado del escaneo en la consola a cada segundo, y en el archivo iplist.txt tendremos una lista de ips con el puerto 22.

Pero esto no es todo, hay algunas características dignas de ser recalcadas:

Control del ancho de banda:

zmap nos permite ajustar el ancho de banda que queremos utilizar con la opción -B:

zmap -B 512K -o list.txt -p 8080 83.0.0.0/8

Scan ICMP:

Podemos hacer un scan sólo utilizando ICMP con:

zmap -M icmp_echoscan -o list.txt 91.0.0.0/8

Scan UDP:

También podemos utilizar el módulo de UDP , casi con la misma velocidad que TCP, lo que es mucho:

zmap -M udp -o list.udp.txt -p 53 91.0.0.0/8

Output en JSON:

Utilizando la opción -O json podemos obtener el archivo de resultado en formato json, lo que puede ser muy útil para alguna herramienta de monitoreo o algún tipo de webservice:

zmap -O json -o list.json -p 23 15.0.0.0/16

Output en standard output:

Podemos pedirle a zmap, que la lista de IPs no las tire en el standard error con el fin de conectarlo mediante pipes a otra aplicación. Por ejemplo en la versión compilada (no la que instalamos con apt u otro gestor) tenemos un programa llamado banner-grab-tcp que sirve para obtener los banners y como sugiere el sitio de zmap podemos utilizarlo de la siguiente manera:

zmap -p 80 -N 1000 -B 10M -o - | ./banner-grab-tcp -p 80 -c 500 -d ./http-req > out 

Esta misma idea puede traspolarse a scripts hechos por nosotros mismos u otros programas que puedan recibir el input desde el standard input.

Abuso

  • A tener cuidado, zmap es una tentación a escanear grandes segmentos de red (de ips públicas).
  • Incluso si lo ejecutas en una red privada puedes llegar a generar una cantidad de tráfico indeseado que puede ser un problema para la red, por lo que mide bien los paramatros que utilizas.
  • Nunca olvides la parte ética del hacking

Extensiones

Por como si fuera poco, zmap puede ser facilmente extendido, te recomiendo le des una pasada a este link para obtener mas info de como hacerlo, verás que simple.

Conclusiones

Claramente zmap es digno de salír en las noticias (WashingtonPost article) ya que supone un gran avance y es un arma peligrosa de dos filos. Además es un proyecto muy maduro para su corta vida.
Por otro lado, me hace pensar sobre una versión de zmap para ipv6, cuya características (las de ipv6) nos hacia suponer que un escaneo masivo sería muy complejo, sin embargo esta simple herramienta nos abre un poco la cabeza. Aunque nmap tiene muchas mas cualidades, y creo yo, sigue siendo el rey de los scanners, zmap, es una herramienta que puede complementar muy bien muchas de las tareas que realizarmos en un pentesting o en auditorias internas. Definitivamente zmap no puede faltar entre tus herramientas de pentesting, hacking y auditoria. De seguro pronto la veremos en los top 10 de herramientas de hacking.

Fuentes:
Web de zmap

~have fun

Redes con Subnetting

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

Flags del Kernel para Firewall o Tuneando el /proc

Opciones de Seguridad en el kernel de Linux (proc)

 

IpTables es la herramienta en espacio de usuario, que permite establecer filtros con NetFilter, el cual es parte del kernel de Linux. Pero independientemente de las herramientas en espacio de usuario, existe una forma de indicar al kernel, como manejar ciertas cosas. Esta forma es, a saber, mediente variables del kernel que pueden modificarse desde el directorio /proc.

/proc

No tengo que detenerme mucho sobre le directorio /proc, ya que basta googlear para encontrar información sobre este pseudo sistema de ficheros. Solo hay que decir que mediante el proc podemos acceder a información del kernel, y modificar “on the fly” ciertas configuraciones.

Por ejemplo en /proc/sys/kernel/hostname encontramos el hostname de nuestro linux, y lo cambiamos haciendo

echo otroHostname > /proc/sys/kernel/hostname

De esta misma manera, podremos cambiar “a mano” ciertos valores del funcionamiento del kernel, y consecuentemente, el comportamiento del networking del mismo. Sin embargo, existe una manera mas “prolija”: sysctl

Sysctl, nos permite configurar las mismas variables (ver mas abajo) que esten configuradas en el /proc/sys , de forma centralizada en el archivo /etc/sysctl.conf. Siendo su sintaxis muy simple:

clave.a.configurar = valor

Para no ahondar mucho sobre el tema, simplemente hagamos un breve repaso y vayamos a lo importante

Breve repaso:

 

sysctl -a # muestra todas las variables configurada
sysctl -w kernel.hostname=MyHaxorName # asigna "MyHaxorName" como hostname del sistema
sysctl kernel.hostname # muestra el valor asignado a la variable
echo "kernel.hostname = MyHaxorName" >> /etc/sysctl.conf # cada vez que se inicie el sistema, sysctl configurará
las variables como se encuentran en este archivo 

A continuación, una lista de las variables mas importantes a tener en cuenta para la seguridad de nuestro firewall

Filtro anti-spoof

/proc/sys/net/ipv4/conf/eth0/rp_filter

En /proc/sys/net/ipv4/conf tenemos una carpeta por cada interfaz de red (eth0, lo, wlan0.. etc, además de las carpetas default y all). En cada una de ellas, encontramos archivos que configuran comportamiento especifico de cada interfaz, en el caso de rp_filter, es un filtro anti spoof: solo permite que la respuesta a un paquete sea enviada por la misma interfaz por la cual se recibió el paquete.

Habilitamos con 1, deshabilitamos con 0.

Ignorar pings

/proc/sys/net/ipv4/icmp_echo_ignore_all

Bastante conocido, con un 1 en este archivo, ignoramos todos los paqutes ICMP tipo echo, es decir, los pings.

El no responder pings, permite que pasemos desapercibidos en algunos escaneos simples, pero también nos bloquea la posibilidad de hacer pruebas de pings.

Syn Cookies

/proc/sys/net/ipv4/tcp_syncookies

El ataque syncooky conciste en enviar muchos paquetes TCP con el flag SYN activado,  pero no completa el HandShake, por lo que ocupa memoria en conexiones que quedan a la espera, causando un DoS. Colocando un 1 en este archivo, le pedimos al kernel, que no abra un buffer hasta que la conexión este abierta.

Paquetes Marcianos

/proc/sys/net/ipv4/conf/all/log_martians

Envia señales a syslog cuando entran paquetes de redes ilegales (cuando el kernel no sabe como rutearlas).

Paquetes Icmp Redirect

/proc/sys/net/ipv4/conf/all/accept_redirects

Un paquete ICMP Redirect, informa cuando hemos mandado un paquete a travez de una ruta que no es la optima.

Un ejemplo casero, es cuando tenemos ROUTER1 conectado a internet y a la LAN, en la cual existen 2 pc (PC1 y PC2), la configuración normal seria configurar a PC1 y PC2 con Default Gatewat en ROUTER1. Si cometieramos la tontera configurar PC2 con su default gateway en PC1 (teniendo por Default Gateway a ROUTER1 en esta pc) PC1 nos informaria que hay una ruta mas directa, y es atravez de ROUTER1. Esa funcion de anunciar esa ruta la cumple los paquetes ICMP Redirect. Con este tipo de paquetes, “alguien” podría realizarte un MITM.

ICMP Send_Reditect

/proc/sys/net/ipv4/conf/all/send_redirects

La explicación de esta variable esta explicada en Paquetes ICMP Redirect, pero en este caso, implica no enviar dichos paquetes ICMP.

Si tu linux no actua como ruter, en una red con varios routers, lo mas aconsejable es deshabilitarlo, poniendo un 0.

Ip Connection Tracking

/proc/sys/net/ipv4/ip_conntrack_max ó

/proc/sys/net/ipv4/netfilter/ip_conntrack_max

En este archivo podemos colocar un numero, el cual será la cantidad máxima de conexiones IP que el kernel puede manejar. Este numero suele estar fijado segun la cantidad de memoria ram que poseamos. Esto puede ser un punto clave a la hora de lidiar con DoS. Asi mismo, podemos encontrar unos cuantos archivos similares, pero más especificos, haciendo ls /proc/sys/net/ipv4/netfilter/ip_conntrack*, los nombres de cada uno dan una idea de funcionalidad, y si conoces bien el funcionamiento del protocolo IP podrás retocar estos valores.

Source Route

/proc/sys/net/ipv4/conf/all/accept_source_route

Cuando internet nacio, inocentemente creia que todos serían buenas personas, por lo que sus protocolos, permitian a cualquiera obtener mucha información, en este caso, Ipv4,  permite que solicitemos a un determinado host, una ruta especifica por donde enviar paquetes, pudiendo ser utilizada esta información para conocer las “Relaciones de Confianza” entre routers. Fuera de eso, hoy en dia no se usa. Lo deshabilitamos con un 0

ICMP Broadcasting  (protección smurf)

/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

ICMP tiene la facultad de poder enviar paquetes Broadcast, es decir, enviar un paquete, el cual todos los hots reconoceran como enviados hacia si mismos, ya que el destino de dicho paquete es una dirección de broadcast. Al recibir este paquete, el host actua en consecuencia y lo responde. Si todo funcionara como corresponde, no habria problema con esta funcionalidad… pero si “alguien” decide enviar paquetes ICMP Broadcast a una gran lista de IPs con un “source” spoofeado, todos los IPs de la lista enviarian una respuesta a la IP inocente (la spoofeada), causandole probablemente un DoS. Para evitar que nos usen como “reflector” enviandonos paquetes broadcast, ignoramos dichos paquetes colocando un 1 en este archivo.

ICMP Dead Error Messages

/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

El RFC 1122, nos pide que los paquetes ICMP erroneos sean completamente descartados silenciosamente, para no probocar tormentas de broadcast.  Para cumplir con dicho requerimiento, colocamos un 1 en dicho archivo.

IP Forward

/proc/sys/net/ipv4/ip_forward

Conocida por todos, esta variable, habilita o deshabilita el reenvio de paquetes. En los casos donde nuestro linux haga NAT, debe estar habilitada, en caso contrario, es recomendable deshabilitarlo.

TCP FIN TimeOut

/proc/sys/net/ipv4/tcp_fin_timeout

Tiempo en segundos que esperaremos antes de descartar una conexión parcialmente cerrada, por defecto 60 segundos, ya que así lo pide el RFC correspondiente a TCP, pero si queremos podemos disminuirlo a fin de evitar algún DoS.

TCP KeepAlive Time

/proc/sys/net/ipv4/tcp_keepalive_time

Cantidad de segundos que esperará el kernel, antes de enviar un paquete para mantener abierta la conexión, a pesar de que no esta siendo utilizada momentaneamente. Por defecto el valor es 7200 (2 horas),  pudiendo ser reducido en algunos casos a 1 hora o 1/2 hora, en segundos 3600 o 1800.

Proxy Arp

/proc/sys/net/ipv4/conf/all/proxy_arp

Con un 0 podemos deshabilitar esta funcionalidad, que no suele ser necesaria, a menos que seamos servidor de VPN, Firewall o Router que lo requiera.

Cache ARP

/proc/sys/net/ipv4/neigh/[interfaz de red]/gc_stale_time

Los segundos que configuremos en esta variable, definiran el tiempo en que se actualiza el cache ARP. Dicho cache, es el que se envenena cuando se realiza un ARP Poisoning Attack, por lo que cuanto mas bajo sea, mas vulnerable a este ataque, pero al mismo tiempo,  mas rapido sabremos cuando una IP quedo fuera de servicio o una MAC cambio de IP (arp -n para verificar las entradas del cache y su estado)

Escalado de Ventana

/proc/sys/net/ipv4/tcp_window_scaling

Dicha variable, habilita (con un 1) o deshabilita (con un 0) la posibilidad de que la conexión TCP negocie el tamaño de la ventana. Dependiendo del segmento de la red y la topologia de la misma, suele ser conveniente que esté habilitada, sin embargo, nos expone a ciertos escaneos (nmap windows scaling) y a posibles DoS.

Algoritmo SACK

/proc/sys/net/ipv4/tcp_sack

SACK es un algoritmo para detectar perdidas de paquetes. Si habilitamos dicha opción (colocando un 1) siempre y cuando pueda, TCP lo utilizará, en caso contrario, ignorará dicha opción. Es recomendable habilitar dicha opción, ecepto que nuestras conexiones TCP las hagamos en un ambito sin demasiadas perdidas de paquetes.

Rango de Puertos Locales

/proc/sys/net/ipv4/ip_local_port_range

En este archivo no colocaremos ni un 1 ni un 0, si no que colocaremos de números, que definiran un rango de puertos, el cual será utilizado para puertos locales, es decir, puertos desde donde comenzaremos conexiones hacia el exterior. En general el rago es 1024 a 4999, pero es conveniente ejecutar:

#echo "32768 61000" > /proc/sys/net/ipv4/ip_local_port_range

en sistemas donde se usen los puertos 1024 a 4999 para brindar servicios.

TTL de nuestros paquetes

/proc/sys/net/ipv4/ip_default_ttl

TTL es Time To Live, o bien, el tiempo de vida que le otorgaremos a los paquetes generados por nuestro host. Este “tiempo” no se cuenta en segundos, sino en cantidad de routers que puede atravesar antes de ser descartado (morir). Es asi que cada router, descuenta uno a dicho valor.

Llegar de sudamerica a china nos cuesta de 12 a 20 saltos, por lo que un paquete que tenga mas de 30 saltos es un tanto raro. El valor mas recomendado en general es 64 (traceroute y a sacarnos las dudas)

Explicit Congestion Notification

/proc/sys/net/ipv4/tcp_ecn

Como lo recita su nombre, ECN es una opción de TCP que permitenotificar cuando un host esta congestionado, para que se busque otra ruta. Algunos firewalls o routers pueden llegar a filtrar los paquetes que tengan esta opción habilitada, pero son los menos. Habilitamos con un 1, que sería lo mas recomendable.

Conclusión:

A la hora de armar un Firewall para nuestro linux, no es cuestión de ejecutar cualquier script a fin, si no conocer bien que es lo que necesitamos, para que y como. El conocer estas variables nos permite conocer donde debemos tocar en caso de ser necesario.

IPtables AutoCompletion

Una de mis herramientas favoritas es iptables. Si bien no me es muy difícil armar las lineas de memoria, muchas personas tienen problemas con iptables justamente por no recordar los parámetros posibles. Por eso quiero compartirles esta útil herramienta.

iptables-bash_completion-1.3.tar

Al descomprimirlo obtendremos el archivo “iptables-bash_completion”. Basta con copiarlo en /etc/bash_completion.d/ y de ahí en mas la tecla TAB hará su trabajo.

Sencillo pero muy útil.

~have fun