6/6/2021 Taller de NETFILTER/iptables Taller de NETFILTER/iptables CDA 2013/14 Índice General 1 Entorno de prácticas 1.1 Software de virtualización VIRTUALBOX 1.2 Imágenes a utilizar 1.3 Establecer el entorno virtualizado 2 Ejemplo: Configuración de un firewall NETFILTER/IPTABLES 2.1 Descripción 2.2 Restriciones de acceso a implementar 2.3 Esquema general del script a emplear 2.4 Tareas a realizar 1 Entorno de prácticas 1.1 Software de virtualización VIRTUALBOX En estas prácticas se empleará el software de virtualización VIRTUALBOX para simular pequeñas redes formadas por equipos GNU/Linux. Página principal: http://virtualbox.org Más información: http://es.wikipedia.org/wiki/Virtualbox 1.2 Imágenes a utilizar Imagen genérica (común a todas las MVs) base.dvi Contiene un sistema Debian 6.0 (Squeeze) con herramientas gráficas y un entorno gráfico ligero LXDE (Lighweight X11 Desktop Environment) [LXDE]. Imagen comprimida: base.vdi.gz [462 MB comprimida] Imagen del área de intercambio (SWAP): swap.vdi [3 MB Usuarios configurados: login password root purple usuario1 usuario1 usuario2 usuario2 1.3 Establecer el entorno virtualizado Creación de las redes donde se realizarán los ejercicios: Red interna (10.10.10.0 ... 10.10.10.255): máquina dentro (eth0) + interfaz eth0 de firewall Red externa (193.147.87.0 ... 193.147.87.255): máquina fuera (eth0) + interfaz eth1 de firewall 1. Se partirá de las imágenes base gunzip base.vdi.gz 2. Configurar y registrar las máquinas virtuales en VIRTUALBOX Script de configuración y arranque: ejercicio-iptables.sh Nota: ejecutar desde el directorio donde se hayan descomprimido las imágenes $ bash ejercicio-iptables.sh 3. Arrancar las instancias VIRTUALBOX (desde el interfaz gráfico o desde la línea de comandos) VBoxManage VBoxManage VBoxManage VBoxManage startvm startvm startvm startvm FUERA DENTRO SERVIDOR FIREWALL 4. Arrancar los servicios a utilizar (el servidor ssh está activado por defecto). Nota: Habilitar acceso exterior a MySQL en la máquina dentro(10.10.10.11) antes de arrancar el servidor dentro~# leafpad /etc/mysql/my.cnf (comentar la linea donde aparece bind-address 127.0.0.1) ... # bind-address 127.0.0.1 ... dentro:~# /etc/init.d/mysql start dentro:~# /etc/init.d/openbsd-inetd start https://ccia.esei.uvigo.es/docencia/CDA/1314/practicas/taller-iptables/index.html 1/5 6/6/2021 Taller de NETFILTER/iptables servidor:~# /etc/init.d/apache2 start servidor:~# /etc/init.d/postfix start servidor:~# /etc/init.d/dovecot start (servidor web [80]) (servidor smtp [25]) (servidor pop3 [110]) fuera:~# /etc/init.d/apache2 start fuera:~# /etc/init.d/openbsd-inetd start 2 Ejemplo: Configuración de un firewall NETFILTER/IPTABLES 2.1 Descripción Se desarrollarán una serie de ejercicios para comprobar el funcionamiento y la configuración del firewall del kernel de Linux NETFILTER/IPTABLES. El entorno de trabajo contará con un firewall con 2 interfaces que separa una red externa insegura de una red interna (confiable). Sobre este cortafuegos se experimentará con políticas de filtrado y traducción de direcciones. El ejemplo consistirá en la configuración de las reglas de filtrado y NAT de NETFILTER empleando la herramienta de línea de comandos IPTABLES. Resumen: Tutorial iptables Página del proyecto NETFILTER: http://netfilter.org Manual y opciones detalladas: http://iptables-tutorial.frozentux.net (Versión PDF en español: http://ccia.ei.uvigo.es/docencia/SSI/practicas/iptables-tutorial.es.pdf) Manual y ejemplos de uso de IPTABLES (en español): http://www.pello.info/filez/firewall/iptables La configuración se hará mediante scripts BASH que contendrán los comandos IPTABLES necesarios. 2.2 Restriciones de acceso a implementar 1. Enmascaramiento (SNAT) de la red interna (10.10.10.0/24) 2. Redireccionamiento (DNAT) de los servicios públicos que ofrecerá la red hacia la máquina servidor (10.10.10.22) 1. peticiones WEB (http y https) 2. tráfico de correo saliente (smtp) y entrante (pop3) 3. Control de tráfico con política ''denegar por defecto'' (DROP) 1. desde la red externa sólo se permiten las conexiones hacia el servidor contempladas en las redirecciones del punto anterior (http, https, smtp, pop3) 2. desde la red interna hacia la red externa sólo se permite tráfico de tipo WEB y SSH 3. se permite la salida a la red externa de las consultas DNS originadas en la red interna 4. firewall sólo admite conexiones SSH desde la red interna 4. Registro (log) de intentos de acceso no contemplados desde red externa a firewall (193.147.87.47) y a equipos internos con la etiqueta Acceso no autorizado 5. Limitar el tráfico de control ICMP recibido desde la red externa para mitigar posibles ataques DOS (denial of service) 2.3 Esquema general del script a emplear Estructura del script BASH - Borrado de la reglas actuales y reinicio de contadores Establecimiento de políticas por defecto Reglas de NAT Reglas de filtrado (red interna, firewall, ...) 2.3.1 Script de partida (''firewall-iptables.sh'') Importante: En este ejemplo se emplearán políticas de filtrado con comportamiento de denegar por defecto (DROP). Se complica ligeramente la definición de la reglas: Hay que habilitar explícitamente los servicios y redirecciones admitidos Es necesario tener en cuenta el tráfico en ambos sentidos, tenemos 2 opciones: Opción 1: habilitar explícitamente el tráfico en ambos sentidos Para cada servicio autorizado definiremos un par de reglas: una para permitir el tráfico de peticiones y otra para el tráfico de sus respectivas respuestas Opción 2: usar las capacidades de connection tracking (firewall con estado) de netfilter El filtrado de servicios se realizará controlando los paquetes de inicio de tráfico/conexión. El tráfico de respuesta o relacionado con tráfico/conexiones ya inicadas se aceptará todo. En este ejemplo usaremos la aproximación 2. #!/bin/bash #VARIABLES eth_INT=eth0 eth_EXT=eth1 RED_INTERNA=10.10.10.0/24 # IPTABLES=/sbin/iptables # Comando iptables case "$1" in start) # Borrar reglas anteriores iptables -F iptables -X iptables -Z y reiniciar las tablas actuales https://ccia.esei.uvigo.es/docencia/CDA/1314/practicas/taller-iptables/index.html 2/5 6/6/2021 Taller de NETFILTER/iptables iptables -t nat -F # Establecer politicas por defecto (DESCARTAR) iptables -P INPUT DROP # descartar entradas al firewall iptables -P OUTPUT DROP # descartar salidas del firewall iptables -P FORWARD DROP # descartar reenvios a traves del firewall # Habilitar retransmisión de paquetes echo 1 > /proc/sys/net/ipv4/ip_forward # Permitir todo al interfaz local del firewall (loopback) iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Permitir el trafico de conexiones ya establecidas (el control de tráfico se hace al inicar las conexiones) iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT # 2.1 Establecer NAT de red interna # <<< COMPLETAR AQUI # 2.2 Establecer redireccionamientos # <<< COMPLETAR AQUI (SNAT, enmascaramiento) (DNAT) # 3 Reglas de filtrado del tráfico # <<< COMPLETAR AQUI ;; stop) # Borrar iptables iptables iptables iptables reglas anteriores -F -X -Z -t nat -F y reiniciar las tablas actuales # Establecer politicas por defecto (ACEPTAR) iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; restart) $0 stop $0 start ;; status) iptables -L iptables -t nat -L ;; *) echo "Uso: ;; firewall-iptables.sh {start|stop|restart|status}" esac 2.3.2 Uso e instalación (opcional) del script Bash Recibe un parámetro (start y stop) firewall:~# ./firewall-iptables.sh stop firewall:~# ./firewall-iptables.sh start firewall:~# ./firewall-iptables.sh status (recupera la configuración inicial de netfilter) (lanza los comandos iptables que definen las reglas del firewall) (muestra las reglas del firewall) [opcional] Podría utilizarse directamente como un script de arranque Para Debian (como root) firewall:~# cp firewall-iptables.sh /etc/init.d firewall:~# update-rc.d firewall-iptables.sh defaults firewall:~# update-rc.d firewall-iptables.sh remove (copia el script en /etc/init.d) (crea los links desde /etc/rcX.d) (elimina los links desde /etc/rcX.d) 2.4 Tareas a realizar 1. Comprobar la configuración actual de firewall firewall:~# iptables -L firewall:~# iptables -t nat -L Asegurarse de que el ip_forwarding está activado en firewall 2. Comprobar el tipo de tráfico admitido inicialmente Probar conexión telnet hacia el exterior y conexión WEB hacia el interior dentro~# telnet 193.147.87.33 fuera:~# lynx 193.147.87.47 fuera:~# lynx 10.10.10.22 Comprobar servicios abiertos fuera:~# nmap -T4 10.10.10.11 10.10.10.22 193.147.87.47 dentro:~# nmap -T4 10.10.10.22 193.147.87.33 servidor:~# nmap -T4 10.10.10.11 193.147.87.33 3. Añadir reglas para establecer NAT (SNAT source NAT) eth0: interfaz conectado a la red interna (10.10.10.0/24) eth1: interfaz conectado a la red externa (193.147.87.0/24) https://ccia.esei.uvigo.es/docencia/CDA/1314/practicas/taller-iptables/index.html 3/5 6/6/2021 Taller de NETFILTER/iptables # 2.1 Establecer NAT de red interna (SNAT, enmascaramiento) # SNAT (enmascaramiento de lo que sale de red interna 10.10.10.0/24) hacia exterior iptables -t nat -A POSTROUTING -s $RED_INTERNA -o $eth_EXT -j MASQUERADE 4. Añadir reglas para redireccionamiento de puertos (DNAT destination NAT) # 2.2 Establecer redireccionamientos hacia SERVIDOR (DNAT) # DNAT (redireccionamiento servicio HTTP [puerto 80, 443] a SERVIDOR) iptables -t nat -A PREROUTING -i $eth_EXT -p tcp --dport 80 -j DNAT --to-destination 10.10.10.22 iptables -t nat -A PREROUTING -i $eth_EXT -p tcp --dport 443 -j DNAT --to-destination 10.10.10.22 # DNAT (redireccionamiento servicio SMTP [puerto 25] y POP3 [puerto 110] a SERVIDOR) iptables -t nat -A PREROUTING -i $eth_EXT -p tcp --dport 25 -j DNAT --to-destination 10.10.10.22 iptables -t nat -A PREROUTING -i $eth_EXT -p tcp --dport 110 -j DNAT --to-destination 10.10.10.22 ## NOTA: Con el módulo multiport podría hacerse con una sola regla ## iptables -t nat -A PREROUTING -i $eth_EXT -p tcp -m multiport --dports 80,443,25,110 \ ## -j DNAT --to-destination 10.10.10.22 Nota: Temporalmente se añadirá una regla para pruebas y depuración que permita cualquier tipo de tráfico a través de firewall # 3 Reglas de filtrado del tráfico # REGLA TEMPORAL: permite todo el tráfico a través del firewall (sólo para pruebas con NAT) iptables -A FORWARD -j ACCEPT 5. Comprobaciones: 1. Guardar el script (como firewall-iptables.sh), dar permiso de ejecución y lanzarlo firewall:~# chmod +x firewall-iptables.sh firewall:~# ./firewall-iptables.sh start 2. Comprobar la configuración actual de firewall firewall:~# iptables -L firewall:~# iptables -t nat -L 3. Realizar conexión TELNET desde dentro (10.10.10.11) a fuera (193.147.87.33) dentro:~# telnet 193.147.87.33 Trying 193.147.87.33 ... Connected to fuera. Escape character is '^]'. Linux 2.6.18-6-686 (193.147.87.33) (pts/18) login: usuario1 Password: usuario1 4. En fuera (193.147.87.33), verificar las conexiones establecidas actualmente y verificar de dónde provienen fuera:~# netstat -t ó fuera:~# w 5. Realizar conexion WEB desde el equipo fuera (193.147.87.33) hacia firewall (193.147.87.47) fuera:~# lynx 193.147.87.47 6. Realizar escaneo de puertos desde el equipo fuera (193.147.87.33) hacia firewall (193.147.87.47) fuera:~# nmap -T4 193.147.87.47 7. Comprobar con tcptraceroute los ''saltos'' que se realizan desde la máquina fuera (193.147.87.33) en los distintos protocolos fuera:~# tcptraceroute 193.147.87.47 25 fuera:~# tcptraceroute 193.147.87.47 80 fuera:~# tcptraceroute 193.147.87.47 110 Nota: más información sobre tcptraceroute en http://michael.toren.net/code/tcptraceroute/ 6. Script final (''firewall-iptables.sh'') Sobre el script anterior: Quitar la regla temporal (iptables -A FORWARD -j ACCEPT) Añadir las siguientes reglas para filtrado de tráfico: # 3. Reglas de filtrado del tráfico # Limitar tráfico ICMP (permitir hasta un maximo de 5 peticiones/segundo) iptables -A INPUT -p icmp -m limit --limit 5/second -j ACCEPT iptables -A OUTPUT -p icmp -m limit --limit 5/second -j ACCEPT iptables -A FORWARD -p icmp -m limit --limit 5/second -j ACCEPT # FILTRADO ENTRADA RED SERVIDOR # - permitir paso de servicios redireccionados (solo peticiones, las respuestas siempre iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -p tcp --dport 80 -m state --state NEW iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -p tcp --dport 443 -m state --state NEW iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -p tcp --dport 25 -m state --state NEW iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -p tcp --dport 110 -m state --state NEW se -j -j -j -j autorizan) ACCEPT ACCEPT ACCEPT ACCEPT ## NOTA: Con el módulo multiport podría hacerse con una sola regla ## iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -p tcp \ ## -m multiport --dports 80,443,25,110 -m state --state NEW -j ACCEPT \ # - log de otros accesos a red interna (se denegaran por defecto) iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -j LOG --log-prefix "Acceso red interna:" https://ccia.esei.uvigo.es/docencia/CDA/1314/practicas/taller-iptables/index.html 4/5 6/6/2021 Taller de NETFILTER/iptables # FILTRADO SALIDA RED INTERNA # - permitir conexiones salientes HTTP (solo peticiones, las respuestas siempre se autorizan) iptables -A FORWARD -o $eth_EXT -s $RED_INTERNA -p tcp --dport 80 -m state --state NEW -j ACCEPT iptables -A FORWARD -o $eth_EXT -s $RED_INTERNA -p tcp --dport 443 -m state --state NEW -j ACCEPT # - permitir conexiones salientes SSH (solo peticiones, las respuestas siempre se autorizan) iptables -A FORWARD -o $eth_EXT -s $RED_INTERNA -p tcp --dport 22 -m state --state NEW -j ACCEPT # - permitir consultas DNS salientes (sobre TCP y UDP) iptables -A FORWARD -o $eth_EXT -s $RED_INTERNA -p tcp --dport 53 -m state --state NEW -j ACCEPT iptables -A FORWARD -o $eth_EXT -s $RED_INTERNA -p udp --dport 53 -m state --state NEW -j ACCEPT # - rechazar los demás intentos de salida informando con ICMP (por defecto se haría simplemente DROP) iptables -A FORWARD -s $RED_INTERNA -m state --state NEW -j REJECT --reject-with icmp-port-unreachable # FILTRADO CONEXIONES HACIA EL FIREWALL # - permitir conexione SSH desde red interna, resto bloqueado por politica por defecto iptables -A INPUT -i $eth_INT -s $RED_INTERNA -p tcp --dport 22 -m state --state NEW -j ACCEPT # - log de los intentos de acceso al firewall desde exterior (serán denegados) iptables -A INPUT -i $eth_EXT -j LOG --log-prefix "Acceso firewall:" 7. Comprobaciones: 1. Lanzar el script del firewalll firewall:~# /root/iptables/firewall-iptables.sh start 2. Comprobar la configuración actual de firewall firewall:~# iptables -L firewall:~# iptables -t nat -L 3. Realizar conexiones SSH a firewall desde fuera (193.147.87.33), dentro (10.10.10.11) y servidor (10.20.20.22) dentro:~# ssh usuario1@10.10.10.1 servidor:~# ssh usuario1@10.10.10.1 fuera:~# ssh usuario1@193.147.87.47 Otra posibilidad (más rápida): realizar escaneo NMAP al puerto 22. dentro:~# nmap -T4 10.10.10.1 -p 22 servidor:~# nmap -T4 10.10.10.1 -p 22 fuera:~# nmap -T4 193.147.87.47 -p 22 4. Realizar conexión TELNET desde dentro (10.10.10.11) hacia fuera (193.147.87.33). dentro:~# telnet 193.147.87.33 ... 5. Realizar conexión WEB desde dentro (10.10.10.11) hacia fuera (193.147.87.33). interno:~# lynx 193.147.87.33 ... 6. Comprobar el fichero de log (/var/log/syslog) de firewall firewall2:~# tail /var/log/syslog ... 7. Comprobar servicios abiertos fuera:~# nmap -T4 10.10.10.11 10.10.10.22 193.147.87.47 dentro:~# nmap -T4 10.10.10.22 193.147.87.33 servidor:~# nmap -T4 10.10.10.11 193.147.87.33 Nota: Otra alternativa cómoda para comprobar las reglas de filtrado de un firewall es la herramienta hping3. hping3 emula el funcionamiento de la utilidad ping generalizándolo, al permitir realizar sondeos con la posibilidad de especificar los puertos origen y/o destino, las flags TCP, etc. 8. Comprobar con tcptraceroute los ''saltos'' que se realizan desde la máquina fuera (193.147.87.33) en los distintos protocolos fuera:~# fuera:~# fuera:~# fuera:~# tcptraceroute tcptraceroute tcptraceroute tcptraceroute 193.147.87.47 193.147.87.47 193.147.87.47 193.147.87.47 80 22 25 110 ribadas 2013-09-18 https://ccia.esei.uvigo.es/docencia/CDA/1314/practicas/taller-iptables/index.html 5/5