Informática
Iptables
2º ASI
ÍNDICE
-
IPTABLES
-
CONSTRUCCIÓN DE REGLAS
-
ESTRUCTURA BASICA DEL COMANDO
-
CREAR UN FIREWALL CON IPTABLES
-
ACTIVAR EL FUNCIONAMIENTO DE LAS IPTABLES
-
PROTEGER LA PROPIA MÁQUINA
-
CÓMO DEPURAR EL FUNCIONAMIENTO DEL FIREWALL
Iptables
IPtables es un sistema de firewall vinculado al kernel de linux que se ha extendido normemente a partir del kernel 2.4 de este sistema operativo. Al igual que el anterior sistema ipchains, un firewall de iptables no es como un servidor que lo iniciamos o detenemos o que se pueda caer por un error de programación (esto es una pequeña mentira, ha tenido alguna vulnerabilidad que permite DoS, pero nunca tendrá tanto peligro como las aplicaciones que escuchan en determinado puerto TCP): iptables esta integrado con el kernel, es parte del sistema operativo. ¿Cómo se pone en marcha? Realmente lo que se hace es aplicar reglas. Para ellos se ejecuta el comando iptables, con el que añadimos, borramos, o creamos reglas. Por ello un firewall de iptables no es sino un simple script de shell en el que se van ejecutando las reglas de firewall.
Nota: Bueno, se puede implementar un script de inicio en /etc/rc.d/INIT.d (o /etc/INIT.d ) con el que hagamos que iptables se “inicie o pare” como un servidor más. Lo podemos hacer nosotros o es probable que venga en la distribución (como en redhat por ejemplo). También se pueden salvar las reglas aplicadas con el comando iptablessave en un fichero y gestionar ese fichero con una aplicación o front-end desde la X o desde webmin.
Vale, tenemos una máquina linux con soporte para iptables, tiene reglas aplicadas y empiezan
a llegar/salir/pasar paquetes. No nos liemos: olvidemos cuantas tarjetas de red hay, que
direcciones ip tiene la máquina y olvidemos si el paquete entra o sale. Las reglas de firewall
están a nivel de kernel, y al kernel lo que le llega es un paquete y tiene que decidir que hacer con él. El kernel lo que hace es, dependiendo si el paquete es para la propia maquina o para otra maquina, consultar las reglas de firewall y decidir que hacer con el paquete según mande el firewall. Este es el camino que seguiría un paquete en el kernel:
Como se ve en el gráfico, básicamente se mira si el paquete esta destinado a la propia maquina o si va a otra. Para los paquetes (o datagramas, según el protocolo) que van a la propia maquina se aplican las reglas INPUT y OUTPUT, y para filtrar paquetes que van a otras
redes o maquinas se aplican simplemente reglas FORWARD.
INPUT, OUTPUT y FORWARD son los tres tipos de reglas de filtrado. Pero antes de aplicar
esas reglas es posible aplicar reglas de NAT: Estas se usan para hacer redirecciones de
puertos o cambios en las IPs de origen y destino.
E incluso antes de las reglas de NAT se pueden meter reglas de tipo MANGLE, destinadas a
modificar los paquetes; son reglas poco conocidas y es probable que no las usen.
Por tanto tenemos tres tipos de reglas en iptables:
- MANGLE
- NAT: reglas PREROUTING, POSTROUTING
- FILTER: reglas INPUT, OUTPUT, FORWARD.
Construcción de reglas
Estructura básica del comando:
Iptables [tabla] <comando> <filtro> <objetivo/salto>
-t MANGLE: sirve para alterar el estado de un paquete.
-t NAT: reglas PREROUTING, POSTROUTING. (masquerading) para hacer que otros ordenadores se conecten a través del nuestro a una serie de servicios pero con nuestra ip, pareciendo que esas conexiones vienen de nuestro equipo.
-t FILTER: reglas INPUT, OUTPUT, FORWARD. Aquí se produce el filtrado de paquetes; (esta tabla no hace falta nombrarla).
Comando
"A cadena "> Añadir regla al final
"D cadena "> Borrar
"R cadena num "> Reemplazar
"I cadena num "> Insertar
"L "> Listar
"F "> Limpiar
"N cadena "> Crear cadena
"X "> Eliminar cadena
"P "> Cambiar política
Filtro: especificación de qué paquetes se verán afectados por la regla
Genéricos
"p protocolo
TCP
""sport o -s puerto origen
""dport o -d puerto destino
"tcp"flags
UDP
""sport o -s y ""dport o -d.
ICMP
""icmp"type "> tipo de paquete icmp (echo"reply, echo - request...) "> identificados por valor o nombre
"s dirección IP fuente
"d dirección IP destino
"i interfaz de entrada
"o interfaz de salida
Objetivo/Salto: Qué hacer con el paquete (parámetro "j)
ACCEPT
DROP
REJECT
LOG
Cadena definida por el usuario
Crear un firewall con iptables
Lo primero es asegurarse de que los siguientes módulos están cargados, y si no están, entonces insertamos los módulos que necesitamos para que funcione el script, ya que seguramente queramos utilizar el control de estado de la conexión, o usar el log. Habrá que poner algo como esto.
/sbin/modprobe ip_conntrack
/sbin/modprobe ipt_state
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ip_tables
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_MASQUERADE
Activar el funcionamiento de las Iptables
Abrimos consola y tecleamos:
#cd /usr/src/linux; make xconfig
Nos aparecerá un bonito menú con todas las opciones del kernel. Miramos lo que nos interesa.
Vamos a "networking options" y activamos:
Packet socket, netlink device emulation, network packet filtering, socket filtering y unix domain sockets, activados.
Le damos a Netfilter configuration y en el menú que nos aparece ponemos todo lo habido y por haber COMO MODULO.
Para tenerlos disponibles, salimos guardando los cambios, y básicamente se trata de compilar los módulos, es decir, make dep, make clean, make modules make modules_install
Y ya tendremos disponibles todos los módulos. Sólo quedará cargarlos para hacer uso de ellos.
Se recomienda ir practicando estas reglas en alguna maquina linux disponible, y especialmente hacer uso de la herramienta iptraf para depurar y comprobar el funcionamiento de iptables. Con iptraf podemos comprobar si las conexiones TCP/IP se llegan a establecer o no. Una conexión tcp/ip empieza con el three-way-handshake:
- La maquina que desea conectarse a otra envia un paquete con flan SYN
- Si la otra maquina acepta, envia un SYN/ACK
- Entonces la máquina establece la conexión.
Si el firewall esta denegando la conexión, con iptraf veremos que la maquina origen solo manda paquetes con el flan S (de SYN), y que del otro lado no sale nada. Saber usar iptraf nos
ayudará mucho.
Nota: Las Iptables se pueden usar para proteger la propia máquina, gestionar un firewall de una LAN con salida a internet, un firewall de una LAN con salida a internet con DMZ (zona desmilitarizada o zona expuesta a internet), un firewall de una LAN con salida a internet y VPNS, un firewall puro entre redes y/o un firewall con política por defecto DROP (Denegar).
En el presente trabajo, solo expondré la configuración de Iptables para proteger la propia máquina.
Proteger la propia máquina
Muy bien, tenemos una máquina linux pinchada en internet y queremos protegerla con su propio firewall. Lo único que tenemos que hacer es crear un script de shell en el que se van
aplicando las reglas.
¡Ojo con el orden de las reglas!
Los scripts de iptables pueden tener este aspecto, con esta estructura:
* Borrado de las reglas aplicadas actualmente (flush)
* Aplicación de políticas por defecto para INPUT, OUPUT, FORWARD
* Listado de reglas iptables.
#Inicio del script
#!/bin/sh
## SCRIPT de IPTABLES
## Ejemplo de script para proteger la propia máquina
echo -n Aplicando Reglas de Firewall...
## FLUSH de reglas
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
## Establecemos politica por defecto
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
## Empezamos a filtrar
# El localhost se deja (por ejemplo conexiones locales a mysql)
iptables -A INPUT -i lo -j ACCEPT
# A nuestra IP le dejamos todo
iptables -A INPUT -s 195.65.34.234 -j ACCEPT
# A un colega le dejamos entrar al mysql para que mantenga la BBDD
iptables -A INPUT -s 231.45.134.23 -p tcp --dport 3306 -j ACCEPT
# A un diseñador le dejamos usar el FTP
iptables -A INPUT -s 80.37.45.194 -p tcp -dport 20:21 -j ACCEPT
# El puerto 80 de www debe estar abierto, es un servidor web.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Y el resto, lo cerramos
iptables -A INPUT -p tcp --dport 20:21 -j DROP
iptables -A INPUT -p tcp --dport 3306 -j DROP
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 10000 -j DROP
echo “ OK . Verifique que lo que se aplica con: iptables -L -n“
# Fin del script
Nota: se puede mejorar este script usando variables, se puede poner el comando con el path completo. No olvidarse de ponerle flags de ejecución: chmod +x firewall1.sh o chmod
750 firewall1.sh
En fin, ya se ve, un script de los más simple, con unas pocas reglas con las que cerramos
puertos al público a los que no tienen porque tener acceso, salvo el 80. Pero cualquiera con
algo de ojo se habrá dado cuenta de que ni se filtra el UDP ni el ICMP. Apostaría cualquier
cosa a que el sistema tiene algún puerto udp abierto, y además peligroso como el SNMP.
Como he dicho anteriormente, en este tipo de firewall es recordable hacer un netstat para ver
que puertos están en estado de escucha (abiertos), y salve que un rootkit nos haya modificado
los binarios, netstat nos dará la información precisa que necesitamos. Hay gente que se
decanta por hacerse un nmap así mismos. Cuidado: dependiendo de cómo lo ejecutemos
quizá no nos muestre todos los puertos, ya que suele mirar los bien conocidos.
Imaginemos que hemos dado un repaso a nuestro sistema, y ahora si que tenemos mejor identificados los puertos tcp y udp abiertos. Pero por si acaso nos curamos en salud y al
final del script cerraremos el rango de puertos del 1 al 1024, los reservados tanto para tcp
como udp.
#Inicio del script
#!/bin/sh
## SCRIPT de IPTABLES
## Ejemplo de script para proteger la propia máquina
echo -n Aplicando Reglas de Firewall...
## FLUSH de reglas
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
## Establecemos politica por defecto
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
## Empezamos a filtrar
# El localhost se deja (por ejemplo conexiones locales a mysql)
iptables -A INPUT -i lo -j ACCEPT
# A nuestra IP le dejamos todo
iptables -A INPUT -s 195.65.34.234 -j ACCEPT
# A un colega le dejamos entrar al mysql para que mantenga la BBDD
iptables -A INPUT -s 231.45.134.23 -p tcp --dport 3306 -j ACCEPT
# A un diseñador le dejamos usar el FTP
iptables -A INPUT -s 80.37.45.194 -p tcp -dport 20:21 -j ACCEPT
# El puerto 80 de www debe estar abierto, es un servidor web.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Cerramos rango de los puertos privilegiados. Cuidado con este tipo de
# barreras, antes hay que abrir a los que si tienen acceso.
iptables -A INPUT -p tcp --dport 1:1024
iptables -A INPUT -p udp --dport 1:1024
# Cerramos otros puertos que estan abiertos
iptables -A INPUT -p tcp --dport 3306 -j DROP
iptables -A INPUT -p tcp --dport 10000 -j DROP
iptables -A INPUT -p udp --dport 10000 -j DROP
echo “ OK . Verifique que lo que se aplica con: iptables -L -n“
# Fin del script
Cómo depurar el funcionamiento del firewall
Programas útiles
IPTRAF: Sin duda alguna uno de los programas más prácticos para depurar el firewall es iptraf,
ya que con él podemos observar si la conexiones se establecen o no; es un programa de
consola que es aconsejable controlar ya que muestra en tiempo real el tráfico que atraviesa
nuestra máquina con todo lujo de detalles: origen/destino de IPs y puertos, tráfico total o tráfico
total según el interfaz de red, etc… Si vemos muchas conexiones simultaneas y nos
perdemos, existe la posibilidad de aplicar filtros para captar solo aquello que nos interesa.
NMAP: La herramienta para escanear puertos por excelencia. Es una herramienta de consola rápida, efectiva y con multitud de opciones. Podemos usarla desde máquinas ajenas a nuestra red para comprobar si realmente el firewall esta filtrando correctamente y en cierta manera para hacernos una idea de que “visión” pueden tener los hackers de nuestro sistema.
SHELL: En el propio script del firewall podemos añadir algunas opciones para descubrir fallos
de sintaxis en las reglas. Claro, imaginemos que tenemos un firewall de 40 lineas y una de
ellas falla cuando ejecutamos el script. ¿Cuál es? Es probable que el mensaje de error no
aclare lo suficiente, por eso se puede añadir algo así al final de cada regla:
...
iptables -A INPUT -s 195.55.234.2 -j ACCEPT && echo “ regla-21 ok”
iptables -A INPUT -s 213.62.89.145 -j ACCEPT && echo “ regla-22 ok”
...
Si la regla se ejecuta bien mostrará el mensajito de ok.
Otra opción algo mas cutre sería ir eliminando o comentando reglas hasta dar con la regla que
tiene la sintaxis incorrecta. Cabe reseñar que puede fallar una regla, pero a partir de ella el
resto se ejecutan con normalidad.
IPTABLES 2º ASI
1
Descargar
Enviado por: | Daniel Benito |
Idioma: | castellano |
País: | España |