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/.
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
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
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
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
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

Firewall iptables

  • 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