1. Firewall con Iptables
Arturo Borrero González
arturo.borrero.glez@gmail.com
Febrero 2011
Documento bajo licencia “"CC-BY-SA 3.0"”.
Usted es libre de copiar, modificar y redistribuir este
documento, bajo la misma licencia.
Este documento o uno muy similar puede encontrarse en http://www.ral-arturo.blogspot.com/.
2. Firewall con iptables Febrero 2011
INTRODUCCIÓN
Este documento trata de explicar una manera (de las muchas que hay) de montar un firewall
“de tres patas” para alojar una configuración de red similar a la que puede verse en el esquema de
abajo.
El software usado es Debian Squeeze (amd64) e iptables (incluidas en el kernel de linux).
Arturo Borrero González Pag. 2/6
3. Firewall con iptables Febrero 2011
CUESTIONES PREVIAS
Los elementos principales son la máquina con 3 interfaces que hace de router y los dos
servidores en la DMZ.
Vamos a suponer unas cuantas cuestiones previas, que nuestro firewall debe cumplir:
1. Los clientes de la red local deben tener acceso a internet transparente. Todos los servicios y
protocolos.
2. En SERV1 hay un servidor WEB y SSH. En SERV2 hay un servidor SSH y un servidor
WEB escuchando en el puerto 1312.
3. Aunque el router que nos conecta a internet hace NAT entre la dirección pública y nuestra
red privada, es necesario hacer otra vez NAT en la interfaz eth1, dado que no podemos
modificar la tabla de encaminamientos de router.
4. El la máquina router servirá SSH a internet a través del puerto 22220 y por el resto de
interfaces por el puerto 22.
5. El puerto 22 de la máquina router será reenviado al puerto 22 de SERV2.
6. Debe de estar controlado el tráfico entrante/saliente de la DMZ hacia la LAN para evitar
sorpresas.
En el ejemplo que voy a mostrar vamos a crear un script para el servicio en /etc/init.d/. Este script
nos permitirá alternar rápidamente entre poner y quitar el firewall, dejando siempre las reglas de
encaminamiento y redirecciones intactas.
El script es el siguiente (debe tener permisos de ejecución):
/etc/init.d/iptables
#!/bin/bash
RETVAL=0
# Función iniciar firewall
start() {
echo "Adding hard firewall rules..."
# fichero con reglas de iptables de firewall restrictivo
sh /etc/iptables_close.conf
RETVAL=0
}
# Funcioón detener firewall
stop() {
echo "Removing hard firewall rules..."
# fichero con reglas de iptables de firewall abierto
sh /etc/iptables_open.conf
RETVAL=0
}
# Analizando parámetro recibido
case $1 in
start)
start
;;
stop)
Arturo Borrero González Pag. 3/6
4. Firewall con iptables Febrero 2011
stop
;;
restart)
stop
start
;;
status)
/sbin/iptables -L
/sbin/iptables -t nat -L
RETVAL=0
;;
*)
echo "Usage: firewall {start|stop|restart|status}"
RETVAL=1
esac
exit
Para añadir el script de init.d al arranque del sistema y que nuestro debian lo adapte, tendremos que
hacer:
#uptade-rc.d /etc/init.d/iptables defaults
EL SCRIPT DE IPTABLES
Ahora tendremos que crear los siguientes ficheros de configuración de iptables. Uno con las
reglas de encaminamiento y no las de firewall y otro con ambas.
/etc/iptables_open.conf
#!/bin/bash
# Variables
IF_INET='eth1'
IF_LAN='eth2'
IF_DMZ='eth0'
IP_ROUTER_INET='192.168.0.2'
IP_ROUTER_DMZ='192.168.2.1'
IP_ROUTER_LAN='192.168.1.1'
IP_SERV1='192.168.2.150'
IP_SERV2='192.168.2.151'
RED_LAN='192.168.1.0/24'
RED_DMZ='192.168.2.0/24'
# Borrado de reglas anteriores
iptables -F
iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING
iptables -t filter -F
# Politica por defecto
Arturo Borrero González Pag. 4/6
5. Firewall con iptables Febrero 2011
iptables -P FORWARD ACCEPT
##################
# Nat y redirecciones #
##################
# Nat en la interfaz eth1 hacia internet
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 192.168.0.2
# Redirección de puertos para SERV1 (desde internet) a web
iptables -t nat -A PREROUTING -i $IF_INET -p tcp --dport 80 -j DNAT --to-destination 192.168.2.150:80
# Redirecciones de puertos para SERV2 (desde cualquier sitio) a web
iptables -t nat -A PREROUTING -i $IF_INET -p tcp --dport 1312 -j DNAT --to-destination 192.168.2.151:1312
iptables -t nat -A PREROUTING -i $IF_LAN -p tcp --dport 80 -d 192.168.2.151 -j DNAT --to-destination
192.168.2.151:1312
# El puerto 22 recibido desde internet será redireccionado a SERV2
iptables -t nat -A PREROUTING -p tcp -i $IF_INET --dport 22 -j DNAT --to-destination 192.168.2.151:22
A continuación, el fichero con la configuración de iptables “fuerte”:
/etc/iptables_close.conf
#!/bin/bash
# Variables
IF_INET='eth1'
IF_LAN='eth2'
IF_DMZ='eth0'
IP_ROUTER_INET='192.168.0.2'
IP_ROUTER_DMZ='192.168.2.1'
IP_ROUTER_LAN='192.168.1.1'
IP_SERV1='192.168.2.150'
IP_SERV2='192.168.2.151'
RED_LAN='192.168.1.0/24'
RED_DMZ='192.168.2.0/24'
# Borrado de reglas anteriores
iptables -F
iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING
iptables -t filter -F
#################
# Nat y redirecciones #
#################
# Ejecuto el fichero de iptables_open.conf, que tiene la configuración de NAT y redirecciones.
sh /etc/iptables_open.conf
##########
# Firewall #
##########
# Politicas por defecto
iptables -P FORWARD DROP
Arturo Borrero González Pag. 5/6
6. Firewall con iptables Febrero 2011
# Se permite el trafico TCP desde internet a la DMZ (web, ssh)
iptables -t filter -A FORWARD -i $IF_INET -p tcp --dport 80 -d $IP_SERV1 -j ACCEPT
iptables -t filter -A FORWARD -i $IF_INET -p tcp --dport 22 -d $IP_SERV2 -j ACCEPT
iptables -t filter -A FORWARD -i $IF_INET -p tcp --dport 1312 -d $IP_SERV2 -j ACCEPT
# Se permite el tráfico TCP desde la DMZ a internet (web, ssh)
iptables -t filter -A FORWARD -i $IF_DMZ -p tcp --sport 80 -s $IP_SERV1 -j ACCEPT
iptables -t filter -A FORWARD -i $IF_DMZ -p tcp --sport 22 -s $IP_SERV2 -j ACCEPT
iptables -t filter -A FORWARD -i $IF_DMZ -p tcp --sport 1312 -s $IP_SERV2 -j ACCEPT
# Podriamos especificar puertos concretos como:
#80 http, 443 https, 143 imap, 220 imap3, 993 imap3, 110 pop3, 995 pop3s, 110 pop3
iptables -t filter -A FORWARD -i $IF_INET -p tcp -d $RED_LAN -m state --state ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -i $IF_INET -p udp --dport 1024: -d $RED_LAN -j ACCEPT
# Se permite el tráfico TCP/UDP desde LAN a internet
iptables -t filter -A FORWARD -i $IF_LAN -s $RED_LAN -p tcp --sport 1024: -j ACCEPT
iptables -t filter -A FORWARD -i $IF_LAN -s $RED_LAN -p udp --dport 53 -j DROP
iptables -t filter -A FORWARD -i $IF_LAN -s $RED_LAN -p udp --sport 1024: -j ACCEPT
# Se permite el tráfico TCP desde LAN a DMZ
iptables -t filter -A FORWARD -i $IF_LAN -s $RED_LAN -d $IP_SERV1 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A FORWARD -i $IF_LAN -s $RED_LAN -d $IP_SERV2 -p tcp --dport 1312 -j ACCEPT
iptables -t filter -A FORWARD -i $IF_LAN -s $RED_LAN -d $RED_DMZ -p tcp --dport 22 -j ACCEPT
# Se permite el tráfico TCP desde DMZ a LAN
iptables -t filter -A FORWARD -i $IF_DMZ -s $IP_SERV1 -d $RED_LAN -p tcp --sport 80 -m state --state
ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -i $IF_DMZ -s $IP_SERV2 -d $RED_LAN -p tcp --sport 1312 -m state --state
ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -i $IF_DMZ -s $RED_DMZ -d $RED_LAN -p tcp --sport 22 -m state --state
ESTABLISHED -j ACCEPT
Tendremos que gestionar los permisos adecuados de lectura/escritura/ejecución para estos ficheros.
Copiando el script y sustituyendo las variables puede adaptarse rápida y fácilmente a las
necesidades de otra red u otra configuración similar.
Los firewall con Iptables pueden llegar a ser muy restrictivos y muy concretos en el tráfico que se
permite/deniega. Esta es una configuración bastante rápida y permisiva, pero eficaz como punto de
partida para un ajuste mucho más fino.
Arturo Borrero González Pag. 6/6