Iptables

Informática. Construcción de reglas. Estructura básica del comando. Crear firewall con iptables. Funcionamiento de las iptables. Depurar el funcionamiento del firewall

  • Enviado por: Daniel Benito
  • Idioma: castellano
  • País: España España
  • 8 páginas
publicidad
publicidad

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:

      'Iptables'

      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