Imagen genérica (común a todas las MVs) base.dvi
Usuarios configurados:
login | password |
---|---|
root | purple |
usuario1 | usuario1 |
usuario2 | usuario2 |
Creación de las redes donde se realizarán los ejercicios:
gunzip base.vdi.gz
Script de configuración y arranque:
Nota: ejecutar desde el directorio donde se hayan descomprimido las imágenes
$ bash ejercicio-iptables.sh
VBoxManage startvm FUERA VBoxManage startvm DENTRO VBoxManage startvm SERVIDOR VBoxManage startvm FIREWALL
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 servidor:~# /etc/init.d/apache2 start (servidor web [80]) servidor:~# /etc/init.d/postfix start (servidor smtp [25]) servidor:~# /etc/init.d/dovecot start (servidor pop3 [110]) fuera:~# /etc/init.d/apache2 start fuera:~# /etc/init.d/openbsd-inetd start
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.
(Versión PDF en español: http://ccia.ei.uvigo.es/docencia/SSI/practicas/iptables-tutorial.es.pdf)
La configuración se hará mediante scripts BASH que contendrán los comandos IPTABLES necesarios.
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, ...)
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:
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
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.
#!/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 y reiniciar las tablas actuales iptables -F iptables -X iptables -Z 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 (SNAT, enmascaramiento) # <<< COMPLETAR AQUI # 2.2 Establecer redireccionamientos (DNAT) # <<< COMPLETAR AQUI # 3 Reglas de filtrado del tráfico # <<< COMPLETAR AQUI ;; stop) # Borrar reglas anteriores y reiniciar las tablas actuales iptables -F iptables -X iptables -Z iptables -t nat -F # 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
firewall:~# ./firewall-iptables.sh stop (recupera la configuración inicial de netfilter) firewall:~# ./firewall-iptables.sh start (lanza los comandos iptables que definen las reglas del firewall) firewall:~# ./firewall-iptables.sh status (muestra las reglas del firewall)
Para Debian (como root)
firewall:~# cp firewall-iptables.sh /etc/init.d (copia el script en /etc/init.d) firewall:~# update-rc.d firewall-iptables.sh defaults (crea los links desde /etc/rcX.d) firewall:~# update-rc.d firewall-iptables.sh remove (elimina los links desde /etc/rcX.d)
firewall:~# iptables -L firewall:~# iptables -t nat -L
Asegurarse de que el ip_forwarding
está activado en firewall
dentro~# telnet 193.147.87.33 fuera:~# lynx 193.147.87.47 fuera:~# lynx 10.10.10.22
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
# 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
# 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
firewall:~# chmod +x firewall-iptables.sh firewall:~# ./firewall-iptables.sh start
firewall:~# iptables -L firewall:~# iptables -t nat -L
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
fuera:~# netstat -t ó fuera:~# w
fuera:~# lynx 193.147.87.47
fuera:~# nmap -T4 193.147.87.47
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/
Sobre el script anterior:
iptables -A FORWARD -j ACCEPT
)
# 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 se autorizan) iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -p tcp --dport 80 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -p tcp --dport 443 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -p tcp --dport 25 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -p tcp --dport 110 -m state --state NEW -j 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:" # 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:"
firewall:~# /root/iptables/firewall-iptables.sh start
firewall:~# iptables -L firewall:~# iptables -t nat -L
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
dentro:~# telnet 193.147.87.33 ...
interno:~# lynx 193.147.87.33 ...
/var/log/syslog
) de firewall
firewall2:~# tail /var/log/syslog ...
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.
fuera:~# tcptraceroute 193.147.87.47 80 fuera:~# tcptraceroute 193.147.87.47 22 fuera:~# tcptraceroute 193.147.87.47 25 fuera:~# tcptraceroute 193.147.87.47 110