Ejemplo de uso del generador de cortafuegos iptables/NETFILTER Shoreline Firewall (Shorewall)
En estas prácticas se empleará el software de virtualización VIRTUALBOX para simular los equipos GNU/Linux sobre los que se realizarán las pruebas.
alumno@pc: $ sh ejercicio-dmz-openvpn.sh
Powershell.exe -executionpolicy bypass -file ejercicio-dmz-openvpn.ps1
Notas:
$DIR_BASE
especifica donde se descargarán las imágenes y se crearán las MVs.
Por defecto en GNU/Linux será en $HOME/CDA2223 y en Windows en C:/CDA2223.
Puede modificarse antes de lanzar los scripts para hacer la instalación en otro directorio más conveniente (disco externo, etc)
.vdi.zip
de http://ccia.esei.uvigo.es/docencia/CDA/2223/practicas/ y copiarlos en el directorio anterior ($DIR_BASE
) para que el script haga el resto.
VBoxManage startvm <nombre MV>_<id>
Contiene un sistema Debian 11 con herramientas gráficas y un entorno gráfico ligero LXDE (Lighweight X11 Desktop Environment) [LXDE].
login | password |
---|---|
root | purple |
usuario | usuario |
(con permisos para sudo ) |
root@datos:~# startx
Dispositivos -> Portapapeles compartido -> bidireccional
de la ventana de la máquina virtual.
iptables
a partir de una especificación expresada en un conjunto ficheros en formato texto (ubicados por defecto en /etc/shorewall
).
zones, interfaces, hosts
policy
y rules
snat
, tunnels
, etc.
Recursos complementarios
zones
, interfaces
y hosts
permite a Shorewall identificar las zonas de origen y destino de cada paquete inspeccionado.
Internamente lo que hará Shorewall es crear una cadena iptables
para cada par (zona origen, zona destino)
.
Con la información presente en interfaces
y, opcionalmente, en hosts
, se crearán reglas en las cadenas por defecto input
, output
y forward
para capturar los paquetes con ese origen y ese destino y derivar el procesamiento de dichos paquetes a la correspondiente cadena (de nombre [origen]-[destino]
).
La estructura de las cadenas [origen]-[destino]
generadas es siempre la misma, por este orden:
iptables
resultado de traducir las entradas del fichero rules
aplicables a las correspondientes zonas de origen y destino
iptables
correspondientes al comportamiento por defecto entre las zonas origen y destino indicado en el fichero de configuración policy
Los ficheros de configuración complementarios (snat
, tunnels
, etc) son procesados y las respectivas reglas iptables
son generadas conforme a su contenido y añadidas al script de Shell final generado por el compilador de configuraciones de Shorewall.
shorewall
con diferentes subcomandos (ver man shorewall
ó https://shorewall.org/manpages/shorewall.html):
shorewall start
: Compila los ficheros de configuración de /etc/shorewall
, genera en /var/lib/shorewall/.start
el script de puesta en marcha del cortafuegos con los correspondientes comandos iptables
y lo ejecuta para configurar Netfilter con las reglas de filtado creadas.
shorewall clear
: Deshabilita el cortafuegos, devolviendo Netfilter a su configuración por defecto (sin reglas y con una política ACCEPT
por defecto en todas las cadenas)
shorewall stop
: Deshabilita el cortafuegos, estableciendo las reglas de filtrado generales indicadas en el fichero stoppedrules
shorewall check
: Comprueba la configuración de /etc/shorewall
para verificar que es correcta, informando de los posibles errores en el caso contrario
shorewall show
: Muestra distintos tipos de informaciones relativas al cortafuegos y a su estado actual.
Por ejemplo shorewall show connections
muestra la lista de conexiones sobre las que Netfilter hace ”seguimiento de conexiones” (connection tracking)
Adicionalmente, en entornos Debian, Ubuntu y derivados, se proporciona un script de arranque (/etc/init.d/shorewall
) que activa y desactiva el cortafuegos durante el inicio del sistema (ver https://wiki.debian.org/HowTo/shorewall) o desde línea de comandos con systemctl [accion] shorewall.service
.
startup = 1
en /etc/default/shorewall
Formato: (una línea por cada zona declarada)
ZONE TYPE OPTIONS IN OPTIONS OUT OPTIONS
firewall, ipv4,. ipv6, etc
)
firewall
Formato (versión 2, ?FORMAT 2
): (una línea por cada interfaz de red [indicando -
como zona si es necesario])
ZONE INTERFACE OPTIONS
-
(posteriormente se detallará en hosts
cómo se vinculan sus IPs a las diferentes zonas)
Formato:
ZONE HOST(S) OPTIONS
interfaces
, detallando la pertenencia a zonas
concretas de IPs individuales o de subredes (rangos de IPs)
:
(eth0:192.168.1.0/24
)
interfaces
. Sólo en casos donde esto no posible se requerirá definir este fichero.
Shorewall hace uso del módulo conntrack
de iptables
que permite hacer seguimiento de las conexiones, usando Netfilter como un filtro de paquetes con estado.
policy
y rules
se refiere únicamente los mensajes de inicio de conexión (paquetes SYN
en TCP o el primer paquete en UDP)
Formato: (una línea por combinación origen
y destino
)
SOURCE DEST POLICY LOG BURST:LIMIT
origen
a una zona destino
(el valor all
indica cualquier zona declarada).
ACCEPT
: acepta el tráfico de la zona origen
dejándolo pasar hacia la zona destino
DROP
: descarta el tráfico procedente de la zona origen
hacia la zona destino
REJECT
: igual que DROP
pero informando al origen del descarte del paquete con un mensaje del protocolo ICMP
origen
y destino
correspondientes.
RATE
) de paquetes permitidos para la combinación de tráfico indicada.
Formato: (una línea por regla)
ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST ...
policy
.
policy
: ACCEPT, DROP, REJECT
DNAT
e indicando el la columna DEST
la nueva dirección destino
REDIRECT
SOURCE
) y destino (columna DEST
) de las conexiones, bien forma de una zona o de una dirección IP o rango de direcciones dentro de una zona determinada (separando zona y dirección con :
)
PROTO
) usado en la conexión (tcp, udl, icpm, all, ...
)
SPORT
) y destino (columna SPORT
) de las conexiones
RATE
), máximo de conexiones (CONNLIMIT
), puerto destino original de una redirección (ORIGDEST
), etc
/usr/share/shorewall/
como ficheros macro.XXXX
macro.XXXX
reemplazando su parámetros (marcado con PARAM
) y fijando los valores ajustables (marcados con -
)
shorewall show macros
Formato:
ACTION SOURCE DEST ...
masq
de versiones anteriores de Shorewall
SOURCE
indica el orgigen de los paquetes a enmascarar, puede indicarse un nombre de interfaz de red o un rango de direcciones IP
DEST
indica el interfaz de red por donde pretenden ”salir” los paquetes a enmascarar
MASQUERADE
(hace enmascaramiento/SNAT con la dirección establecida en la interfaz de red de salida) o
SNAT(<direccion>)
(hace enmascaramiento/SNAT con la dirección IP indicada)
iptables
a la cadena POSTROUTTING
de Netfilter con las acciones SNAT/MASQUERADE
correspondientes.
Formato:
TYPE ZONE GATEWAY GATEWAY ZONES
ipsec, openvpn, pptp, ...
), la zona del firewall donde se origina la conexión VPN e información de la/s pasarela/s VPN (gateways) desde las que llega esa conexión.
Formato:
ACTION SOURCE DEST PROTO DPORT SPORT
shorewall stop
rules
, aunque simplificada
SOURCE
y DEST
se usa el símbolo comodín -
para indicar ”cualquier zona”
Se desarrollará un ejercicio de configuración básica de un firewall con DMZ empleando el generador de reglas iptables Shorewall. Se usará un equipo con tres interfaces para hacer el papel de firewall.
Nota: Esta restricción va contra el principio general de las DMZ, que establece que se deben impedir conexiones desde la DMZ hacia la zona interna. En este caso se asume una excepción a este princpio, que debería ser limitada lo máximo posible y convenientemente monitorizada. Una solución más robusta a este caso sería plantear una DMZ de dos niveles.
firewall3:~# echo 1 > /proc/sys/net/ipv4/ip_forward
Nota: Esta configuración no es permanente, se puede descomentar la línea #net.ipv4.ip_forward=1
en el fichero /etc/sysctl.conf
para que se habilite la redirección de tráfico cada vez que arranque la máquina.
fuera:~# nmap -T4 193.147.87.47 [escaneo de firewall3 (unica máquina visible desde fuera)] fuera:~# nmap -T4 10.10.10.11 [escaneo de dentro (fallará)] fuera:~# nmap -T4 10.20.20.22 [escaneo de dmz (fallará)]
dentro:~# nmap -T4 193.147.87.33 [escaneo de fuera] dentro:~# nmap -T4 10.20.20.22 [escaneo de dmz] dentro:~# nmap -T4 10.10.10.1 [escaneo de firewall3]
dmz:~# nmap -T4 193.147.87.33 [escaneo de fuera] dmz:~# nmap -T4 10.10.10.11 [escaneo de dentro] dmz:~# nmap -T4 10.20.20.1 [escaneo de firewall3]
firewall3:~# nmap -T4 193.147.87.33 [escaneo de fuera] firewall3:~# nmap -T4 10.10.10.11 [escaneo de dentro] firewall3:~# nmap -T4 10.20.20.22 [escaneo de dmz]
Nota 1: En un escenario real los escaneos desde la máquina de la red externa, fuera
, hacia dentro
y dmz
no darían ningún resultado, dado que en la Internet pública no se pueden utilizar direcciones de los rangos privados como 10.0.0.0/24
. Por la misma razón, los escaneos desde dentro
y dmz
tampoco tendría resultado, porque las conexiones no pasarían de firewall3
.
En este ejemplo ocurre lo mismo (fuera
no tiene acceso ni a dentro
ni a dmz
) aunque en este caso se debe a que no esa establecida en fuera
una ruta por defecto que le indique cómo llegar a las máquinas internas. Para el caso de los escaneos de dentro
y dmz
a fuera
tampoco se obtiene resultados. Los paquetes de inicio de conexión de nmap
sí llegan a salir y alcanzan fuera
, pero las respuestas de fuera
no vuelven por la razón anterior.
Nota: En la imagen común a todas las máquinas virtuales fue habilitado el acceso exterior al servidor MySQL (en principio sólo será relevante para la máquina dentro(10.10.10.11)) [ya hecho en las MV de prácticas]
dentro~# nano /etc/mysql/mariadb.conf.d/50-server.cnf (comentar la linea donde aparece bind-address 127.0.0.1) ... # bind-address 127.0.0.1 ...
Se usará el esquema three-interfaces incluido en la distribución estándar de Shorewall y descrito en http://www.shorewall.net/three-interface.htm.
La plantilla para configurar el firewall está en el directorio /usr/share/doc/shorewall/examples/three-interfaces/
Todas las tareas de configuración de Shorewall se realizarán en la máquina firewall3.
firewall3:~# cd /etc/shorewall firewall3:/etc/shorewall# cp /usr/share/doc/shorewall/examples/three-interfaces/* .
Tendremos 4 zonas:
firewall3:/etc/shorewall# nano zones ############################################################################### #ZONE TYPE OPTIONS IN OUT # OPTIONS OPTIONS fw firewall net ipv4 loc ipv4 dmz ipv4
Ajustar los interfaces de red de cada zona para que se ajusten a nuestra configuración (en columna INTERFACE)
firewall3:/etc/shorewall# nano interfaces ############################################################################### ?FORMAT 2 ############################################################################### #ZONE INTERFACE OPTIONS # net enp0s9 loc enp0s3 dmz enp0s8 #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
En nuestro ejemplo enmascararemos (SNAT: source NAT) el tráfico saliente de nuestras 2 redes internas (loc y dmz) para salga a la red pública con la IP del cortafuegos.
firewall3:/etc/shorewall# nano snat ######################################################################################################################### #ACTION SOURCE DEST PROTO PORT IPSEC MARK USER SWITCH ORIGDEST PROBABILITY # MASQUERADE 10.10.10.0/24 enp0s9 MASQUERADE 10.20.20.0/24 enp0s9Indica que el tráfico de la red 10.10.10.0 y de 10.20.20.0 que pretenda salir a través del interface enp0s9 (red externa) se ”reescribirá” su dirección origen con la dirección IP del interfaz enp0s9 (IP pública de firewall3 (193.147.87.47))
En nuestro caso fijaremos unas políticas restrictivas que descartarán por defecto todo el tráfico entre las zonas definidas. En el fichero /etc/shorewall/rules se ajustarán las excepciones pertinentes.
firewall3:/etc/shorewall# nano policy ############################################################################### #SOURCE DEST POLICY LOG LEVEL LIMIT:BURST # loc all DROP net all DROP info dmz all DROP # THE FOLLOWING POLICY MUST BE LAST all all REJECT info
Mantendremos las excepciones (reglas) incluidas en el fichero rules de muestra.
Nota: hace uso de macros como Ping(DROP), SSH(ACCEPT) (abrevian la notación ahorrando el escribir los puertos concretos)
Implementaremos las restricciones de tráfico descritas en la sección 4.2 y añadiremos al final del fichero las reglas correspondientes.
firewall3:/etc/shorewall# nano rules #################################################################################### #ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL ... # PORT PORT(S) DEST # Accept DNS connections from the firewall to the Internet ############### COMENTAR (no nos interesa) ################# # DNS(ACCEPT) $FW net ############################################################ # Accept SSH connections from the local network to the firewall and DMZ SSH(ACCEPT) loc $FW # Cubre parte de las restricciones 3c SSH(ACCEPT) loc dmz # Cubre parte de las restricciones 3c . . . (sigue) . . ######################################################################################## ## ## ANADIDOS para implementar reglas de filtrado (AÑADIR al final del fichero "rules" DESDE AQUI) ## ######################################################################################## ## Anadidos para 2a, 2b: redirec. puertos (servicios publicos: http, https, smtp, pop3) a DMZ DNAT net dmz:10.20.20.22 tcp 80,443 DNAT net dmz:10.20.20.22 tcp 25,110 ## Anadidos para 3b: acceso desde local a red externa (solo WEB y SSH) ACCEPT loc net tcp 80,443 ACCEPT loc net tcp 22 ## Anadidos para 3c: acceso desde local a servidores web y correo de DMZ y ssh a equipos DMZ ACCEPT loc dmz:10.20.20.22 tcp 80,443 ACCEPT loc dmz:10.20.20.22 tcp 25,110 ACCEPT loc dmz tcp 22 # No sería necesario, cubierto por una regla anterior ## Anadidos para 3d: acceso del servidor SMTP de DMZ a servidores SMTP externos para (re)envío de e-mails ACCEPT dmz:10.20.20.22 net tcp 25 ## Anadidos para 3e: acceso del servidor web de DMZ al servidor mysql ACCEPT dmz:10.20.20.22 loc:10.10.10.11 tcp 3306 ## Anadidos para 3f: acceso al exterior para consultas DNS desde red interna y dmz DNS(ACCEPT) loc net DNS(ACCEPT) dmz net ######## NOTA: Reglas 3f equivalen a: #ACCEPT loc net tcp 53 #ACCEPT loc net udp 53 #ACCEPT dmz net tcp 53 #ACCEPT dmz net udp 53 #################################### ## Anadidos para 3f: acceso al cortafuegos mediante SSH desde local ACCEPT loc fw tcp 22
Como mínimo debe establecerse la variable STARTUP_ENABLED a yes, para que el compilador Shorewall procese los ficheros y genere las reglas iptables.
También debe habilitarse el forwarding de paquetes: Asegurar que la variable IP_FORWARDING está a on (o Keep si se garantiza que se habilita ip forwarding antes de iniciar el firewall)
firewall3:/etc/shorewall# nano shorewall.conf ############################################################################### # S T A R T U P E N A B L E D ############################################################################### STARTUP_ENABLED=Yes . . . ############################################################################### # F I R E W A L L O P T I O N S ############################################################################### ... IP_FORWARDING=Yes ...
Nota: Se hará uso de Shorewall de forma manual con los subcomandos start
, clear
o compile
.
stoppedrules
usado por el subcomando shorewall stop
con el siguiente contenido (permite todo el tráfico)
firewall3:/etc/shorewall# nano stoppedrules ############################################################################### #ACTION SOURCE DEST PROTO DEST SOURCE # PORT(S) PORT(S) ACCEPT - -
firewall3:/etc/shorewall# shorewall start
Más detalles sobre inicio, parada y deshabilitación de Shorewall
iptables
o analizando el script generado por Shorewall en /var/lib/shorewall/.start
)
Opcion 1. Volcado de la configuración de iptables
firewall3:~# iptables -L -n firewall3:~# iptables -t nat -L -nOpcion 2. Volcado de los comandos iptables con
iptables-save
firewall3:~# iptables-save > /tmp/volcado.txt firewall3:~# mousepad /tmp/volcado.txtOpcion 3. Fichero de comandos generado por
shorewall
(incluye la salida de iptable-save
)
firewall3:~# mousepad /var/lib/shorewall/.start
Nota: También es posible ver el contenido a una cadena iptables
concreta de las generadas por Shorewall (cadena [origen]-[destino]
, por ejemplo loc-net
) [con shorewall show policies
se pueden ver las cadenas generadas]
firewall3:~# iptables -L loc-net ó firewall3:~# shorewall show loc-net
policy, rules, zones, interfaces, hosts, etc
) que dan soporte al tráfico redireccionado hacia la DMZ
policy, rules, zones, interfaces, host, etc
) que habilitan el acceso desde la DMZ al servidor MySQL de la red interna
fuera:~# nmap -T4 193.147.87.47 10.10.10.11 10.20.20.22 dentro:~# nmap -T4 193.147.87.33 10.20.20.22 10.10.10.1 dmz:~# nmap -T4 193.147.87.33 10.10.10.11 10.20.20.1 firewall3:~# nmap -T4 193.147.87.33 10.10.10.11 10.20.20.22
Nota: El escaneo desde firewall3
generará una serie de alertas por consola, dado que con las reglas de filtrado implementadas el cortafuegos no tiene permitido casi ningún tipo de tráfico de salida. En el entregablen no es necesario incluir esas salidas, basta con indicar qué ocurre.
fuera:~# tcptraceroute 193.147.87.47 80
who
y netstat
dentro:~# ssh usuario@193.147.87.33 (con la contraseña usuario) fuera:~# who fuera:~# netstat -at
netstat-nat -a
para ver las conexiones NAT establecidas actualmente (mientras esté abierta la conexión SSH anterior).
firewall3:~# netstat-nat -n -N
Esquema propuesto
Incluir los resultados obtenidos en Tarea 2 (reglas iptables generadas) y Tarea 3 (escaneo final)
Entrega: MOOVI
Fecha límite: 13/11/2022