Firewall con Debian

De WikiSalud
Saltar a: navegación, buscar
Existe una versión de esta guía por el mismo creador en Firewall para pequeñas organizaciones que se actualiza con mayor frecuencia

Contenido

Resumen:

Instalación, configuración y mantenimiento de Debian como Firewall, usando Iptables, Squid y SquidGuard.

Introducción

El objetivo de los siguiente artículos es configurar un servidor como Firewall para realizar tareas de filtrado dentro de su Establecimiento. Dicho Firewall se encargará de administrar el tráfico de red mediante Iptables y filtrará el contenido a los que sus usuarios acceden en la web mediante Squid3/SquidGuard.

Guía de configuración

Ya que esta es una guía más que un procedimiento rígido, intentaremos separar tanto las distintas fases de la configuración como sea posible:

Configuraciones sobre el sistema

Configuración de Red

El mejor consejo que podemos dar antes de configurar la red es que se asegure de como ha conectado físicamente los cables. Esto le evitará molestos dolores de cabeza más adelante

/etc/network/interfaces
# Configuración de la interfaz Loopback. 
auto lo 
iface lo inet loopback 
 
# RED WAN. Acá debe configurarse Gateway y DNS. 
# Con esta interfaz accede hacia su enlace a internet. 
# Revise las conexiones físicas de los puertos de red 
auto eth0 
iface eth0 inet static 
        address 192.168.17.13 
        netmask 255.255.255.224 
        network 192.168.17.0 
        broadcast 192.168.17.31 
        gateway 192.168.17.1 
 
# RED LAN. Basta con hacer accesible la red hacia la red Local 
# Revise las conexiones físicas de los puertos de red 
auto eth1 
iface eth1 inet static 
        address 10.20.20.1 
        netmask 255.255.255.0 
        network 10.20.20.0 
        broadcast 10.20.20.255 
 
        # Este script iniciara el firewall. Recuerde que al menos root debe tener permisos de ejecución 
        # Pese al espacio, recuerde que se encuentra vinculada a eth1, comportamiento que puede cambiar al mover las siguiente líneas
        # dentro del fichero.
        post-up /root/fws/firewall.sh 
        # Este otro script iniciara las rutas necesarias. Recuerde los permisos de ejecución 
        post-up /root/fws/rutas.sh


Configure para que el $HOSTNAME resuelva hacia la interfaz de la red LAN, útil para mostrar los mensajes de error para squidGuard

/etc/hosts
127.0.0.1     localhost 
10.20.20.1    dmz.salud.gob.sv  dmz


Configure los siguientes

/etc/resolv.conf
search salud.gob.sv 
nameserver 192.168.20.20 
nameserver 192.168.20.21


Si bien suponemos que este es el comportamiento por defecto según la documentación, se recomienda configurar explicítamente

/etc/host.conf
order hosts,bind 
multi on

Instalación de software

Suponemos que su instalación de Debian es lo más mínima posible, sin entorno gráfico sobre todo.

  • Instalamos los paquetes necesarios para toda la configuración posterior
aptitude -y install squid3 squidGuard apache2 apache2-mpm-prefork ipset nmap php5 sarg

Modificamos varias al kernel

  • Agregar los módulos de FTP para su carga en el arranque del sistema:
sed -i '$a ip_conntrack_ftp\nnf_nat_ftp ' /etc/modules
  • Activar el reenvío de paquetes a través de interfaces:
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
  • Active la configuración anterior sin necesidad de reiniciar el sistema
sysctl -p /etc/sysctl.conf

Directorio de Trabajo

  • Creamos un directorio donde almacenar los ficheros de configuración.
mkdir ~/fws
cd ~/fws 
touch firewall.sh rutas.sh infraestructura.sh
chmod 744 firewall.sh rutas.sh infraestructura.sh

Firewall en capa 3 con Iptables

Es posible crear más grupos ipset dentro de este fichero. Basta con agregar un índice en listados. El nombre del índice se convierte en el nombre del nuevo grupo ipset que estará disponible para crear las reglas de iptables

/root/fws/infraestructura.sh
#!/bin/bash 
#### Archivo de configuración #### 
 
#### IP con acceso a la administración remota. Omita aquellos equipos dentro de la red LAN
declare -A listados
 
listados["admins"]=" 
        192.168.30.5
        192.168.30.10
        192.168.30.15
"
#### Infraestructura de red ##### 
## Interfaz LAN
INL='eth0' 
## IP Interfaz de Red LAN 
SRV='192.168.106.1' 
## Red LAN 
LAN='192.168.106.0/24' 
## Interfaz WAN 
WAN='eth1' 
# Gateway hacia Hacienda 
#GWH='192.168.10.1' 
# Gateway que se usa hacia MINSAL 
GWS='172.16.106.1'
## Interfaz hacia Red de Hacienda. Con toda seguridad, es virtual 
## Si tiene una fisica, debió configurarla antes en el archivo /etc/network/interfaces 
#VIR='eth0:0'


En la seccion ### FORWARD ###, se configuran los servicios a los que la red interna podrá acceder. Si necesita agregar otro servicios, basta con agregar una regla de este tipo:

iptables -t filter -A FORWARD -i $INL -s $LAN -o $WAN -p tcp --dport !Plantilla:Puerto   -j ACCEPT 
/root/fws/firewall.sh
#!/bin/bash -x 
#### Archivo de configuración firewall.sh #### 
## El presente archivo configurará la tabla filter del Firewall. 
# Leemos el archivo de configuración 
source /root/fws/infraestructura.sh 
 
# Borramos las reglas de filtrado, reinicializamos los contadores y borramos las cadenas personalizadas que pudieran haber 
iptables -t filter -F 
iptables -Z 
iptables -X 
 
# Configuramos las reglas por defecto en DROP 
iptables -t filter -P INPUT   DROP 
iptables -t filter -P OUTPUT  DROP 
iptables -t filter -P FORWARD DROP 
 
## Cremos y configuramos los grupos Ipset que hemos de usar dentro de iptables, por defecto, existe sólo admins
for grupo in ${!listados[*]}
do
        ipset -exist create $grupo hash:ip
        for ipa in ${listados[$grupo]}
        do
                ipset -exist add $grupo $ipa
        done
done
 
# Reglas para localhost 
# ¿Tiene servicios que corren en localhost? De hecho, ninguno 
#iptables -t filter -A INPUT -i lo -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT 
#iptables -t filter -A OUTPUT -s 127.0.0.0/8 -o lo -d 127.0.0.0/8 -j ACCEPT 
 
# Condición necesaria para que SQUID funcione 
iptables -t filter -A INPUT -s $SRV -d $SRV -j ACCEPT 
iptables -t filter -A OUTPUT -s $SRV -d $SRV -j ACCEPT 
 
#### INPUT ##### 
## Aceptamos el tráfico HTTPS hacia el servidor. 
iptables -t filter -A INPUT -s $LAN -d $SRV -p tcp --dport 80   -j ACCEPT 
## Disponemos el puerto de SQUID 
iptables -t filter -A INPUT -s $LAN -d $SRV -p tcp --dport 3128 -j ACCEPT 
## Aceptamos el PING y otro ICMP desde LAN 
iptables -t filter -A INPUT -s $LAN -d $SRV -p icmp -j ACCEPT 
## El tráfico entrante desde internet que nosotros hayamos iniciado 
iptables -t filter -A INPUT -i $WAN -s 0.0.0.0/0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
## El tráfico entrante desde la red de Hacienda que nosotros hayamos iniciado 
iptables -t filter -A INPUT -s 192.168.0.0/16  -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
 
## Abrimos los puertos de administración: 
# SSH para el mismo servidor. 
iptables -t filter -A INPUT -m set --match-set admins src -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT 
iptables -t filter -A INPUT -i $INL -s $LAN -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT 
 
 
### OUTPUT ### 
## Conexiones establecidas de salida 
# Permite todas las conexiones que este equipo ya haya establecido hacia Internet
iptables -t filter -A OUTPUT -d $LAN -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
# Todo lo que salga a internet por la interfaz WAN es permitido. 
# Sobre todo por el tráfico que se origine del mismo servidor, que no es poco 
iptables -t filter -A OUTPUT -d 0.0.0.0/0 -o $WAN -j ACCEPT 
iptables -t filter -A OUTPUT -d 0.0.0.0/0 -o $INL -j ACCEPT 
iptables -t filter -A OUTPUT -d 0.0.0.0/0 -p icmp -o $WAN -j ACCEPT 
iptables -t filter -A OUTPUT -d 0.0.0.0/0 -p icmp -o $INL -j ACCEPT 
 
# Este es el comportamiento más extraño e inexplicable que puedo hallar. Si esto, no servirá Squid 
# ¿Sobre la misma interfaz? 
iptables -t filter -A OUTPUT -s $SRV -d $SRV -j ACCEPT 
iptables -t filter -A INPUT -s $SRV -d $SRV -j ACCEPT 
 
### FORWARD ### 
# Buscando el problema 
#iptables -t filter -A FORWARD -i $INL -s $LAN -o $WAN -j ACCEPT 
## Abrimos los puertos de administración: 
# 3389 para Escritorio Remoto en Windows 
iptables -t filter -A FORWARD -m set --match-set admins src -p tcp --dport 3389 -m conntrack --ctstate NEW -j ACCEPT 
# Ping y otras opciones 
iptables -t filter -A FORWARD -i $INL -s $LAN -o $WAN -p icmp -j ACCEPT 
# Consultas al DNS. Nótese que con la opción -d puede especificarse un tan sólo servidor DNS a consultar
iptables -t filter -A FORWARD -i $INL -s $LAN -o $WAN -p udp --dport 53  -j ACCEPT 
# Tráfico web 
# No hay forwarding de los clientes web: Squid3 se encarga de administrar este tráfico 
# NOTA: Deshabilitar el uso de proxy en el cliente de correo. Aquí no somos proxy SOCKS ni ninguna de esas cosas raras
# Cliente de correo POP3. Si quiere forzar el uso de SSL, abra solo el 995 
iptables -t filter -A FORWARD -i $INL -s $LAN -o $WAN -p tcp --dport 110   -j ACCEPT 
iptables -t filter -A FORWARD -i $INL -s $LAN -o $WAN -p tcp --dport 995   -j ACCEPT 
# Cliente de correo SMTP. Si se quiere forzar el uso de SSL, abra solo el 465 
iptables -t filter -A FORWARD -i $INL -s $LAN -o $WAN -p tcp --dport 465   -j ACCEPT 
iptables -t filter -A FORWARD -i $INL -s $LAN -o $WAN -p tcp --dport 587   -j ACCEPT 
# Cliente de FTP 
iptables -t filter -A FORWARD -s $LAN -p tcp --dport 21    -j ACCEPT 
# Modo activo de FTP. Su uso será poco común 
iptables -t filter -A FORWARD -s $LAN -p tcp --dport 20    -j ACCEPT 
# Modo pasivo de FTP 
iptables -t filter -A FORWARD -p tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
# Acceso remoto al servidor de Hacienda 
iptables -t filter -A FORWARD -i $INL -s $LAN -o $WAN -p tcp --dport 63231 -j ACCEPT 
# Bastente especifica hacia el tráfico ya establecido desde internet hacia la LAN 
iptables -t filter -A FORWARD -i $WAN -s 0.0.0.0/0 -o $INL -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT


/root/fws/nat.sh
#!/bin/bash -x 
#### Archivo de configuración firewall.sh #### 
## El presente archivo configurará la tabla NAT de iptables 
# Leemos el archivo de configuración 
source /root/fws/infraestructura.sh 
# Borramos las reglas de nateo 
iptables -t nat -F 
iptables -t nat -Z 
 
#### Rutas #### 
## Creación de la interfaz virtual. Borre en caso de tener una fisica dedicada y haberla configurado antes
## o de no necesitarla 
# ifconfig $VIR 192.168.10.126/24 
## Creación de las rutas Hacia el Ministerio de Salud 
route add -net 192.168.83.0/24 gw $GWH 
 
#### NAT #### 
# Las especificaciones de la cadena POSTROUTING se hace en el archivo de rutas, 
#para mayor comprensión de su trabajo, y facilitar la modificación en el futuro 
### Prerouting ### 
# Forzamos el uso de nuestro Firewall para acceder a internet. 
iptables -t nat -A PREROUTING -s $LAN -i $INL -p tcp --dport 80  -j REDIRECT --to-port 3128 
iptables -t nat -A PREROUTING -s $LAN -i $INL -p tcp --dport 443 -j REDIRECT --to-port 3128 
## Creación de Interfaz Virtuales para NATEO IP a IP 
## Recuerde que existe configurada al menos una interfaz eth0:0 
#iptables -t nat -A PREROUTING -d 192.168.17.20 -p all -j DNAT --to-destination 10.20.20.5 
## Para mantener la configuración simple, tendrá que agregar manualmente cada host que necesite. Tome el siguiente ejemplo 
#ifconfig 'eth0:2' 192.168.17.21/27 
#iptables -t nat -A PREROUTING -d 192.168.17.20 -p all -j DNAT --to-destination 10.20.20.10 
 
### Postrouting ### 
## Vamos hacia las red LAN interna para otra organización 
#iptables -t nat -A POSTROUTING -s $LAN -d 192.168.1.0/24 -o $VIR -j MASQUERADE  
## Vamos hacia INTERNET 
iptables -t nat -A POSTROUTING -s $LAN -o $WAN -j MASQUERADE


Configuración en capa 7 con Squid3 / SquidGuard

/etc/squid3/squid.conf
# Integración con squidGuard 
# Esta se supone la nueva version de redirector_program
url_rewrite_program /usr/bin/squidGuard 
# Números de procesos de SquidGuard que abrirá. Revisar cuántos puede soportar 
# El valor por defecto es 20, parece sin embargo que 12 ha sido un n[umero favorable para nosotros
url_rewrite_children 15 startup=0 idle=1 concurrency=3
# Se supone una opción para terminar de habilitar el correcto funcionamiento con HTTPS, pero no resulta como debiera 
dns_v4_first on 
# Controla el tiempo que squid espera a que las conexiones se cierran cuando esta se apague administrativamente 
shutdown_lifetime 2 seconds 
# Se reduce el tiempo de espera para las respuestas HTTP. 
connect_timeout 10 seconds 
# Configuraciones por defecto necesarias 
acl manager   proto   cache_object 
# ACL por Red. 
acl usuarios src 192.168.106.0/24 
# Estos puertos representan los servicios que el proxy administrará 
acl Safe_ports port 80  # http 
acl Safe_ports port 443 # https 
acl CONNECT method CONNECT 
http_access deny !Safe_ports 
# ACL de 
http_access allow usuarios 
http_access deny  all 
# Intercept se supone como proxy transparente, lástima que solo sea posible con HTTPS. Use la IP de la interfaz LAN del Firewall 
http_port 192.168.106.1:3128 intercept
# Agregar el hecho de crear este directorio 
coredump_dir /var/spool/squid3/dump
refresh_pattern .   0 20% 4320 
# Cualquier mensaje de error tienen el mínimo de información relevante 
httpd_suppress_version_string on 
# Opciones varias para seguir en observación 
emulate_httpd_log on 
always_direct allow all 
# Útil si no se planea otra forma de sacar log, tal como sarg
# logformat squid %tl %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt 
# Cambie este por el nombre del firewall, para mostrarse amigable y bien configurado con el usuario. 
# Dejar las opciones por defecto de cara al usuario es de pésima educación 
visible_hostname FwMaxBloch.salud.gob.sv 
# Deben usarse el del Ministerio. 
dns_nameservers 10.10.20.20 
# Un poco de caché que no le hace mal a nadie. El primer valor representa en MB el espacio usado Recuerde que necesita espacio en memoria RAM por cada gigabyte usado
#cache_dir aufs /var/spool/squid3 500 16 256 
# Usar la octava parte de la memoria RAM
cache_mem 128 MB


/etc/squidguard/squidGuard.conf
########################################################################### 
#### Archivo de configuración para squidGuard #### 
## Directorio de listas negras y log 
dbhome /var/lib/squidguard/db 
logdir /var/log/squidguard 
 
### ACL de tiempo. 
## ¿Son estos los horarios que necesita? 
time laboral { 
  weekly mtwhf 07:15 - 12:29 
  weekly mtwhf 13:15 - 16:00 
} 
 
time almuerzo{ 
  weekly mtwhf 12:30 - 13:14 
} 
 
time noche { 
  weekly mtwhf 15:45 - 23:55 
  weekly mtwhf 00:01 - 07:14 
} 
 
########################################################################### 
### Clases de Filtrado 
## Para agregar más, busque en el directorio especificado en dbhome, y revise el contenido de cada directorio. 
dest sca-sitios { 
    urllist custom/sca-sitios.lst
    log sitio-dest 
} 
 
dest dropbox-sitios {
    domainlist custom/dropbox.lst
    log sitio-dest
}
 
dest sitios { 
    urllist custom/sitios.lst 
    log sitio-dest 
} 
 
dest archivos { 
    expressionlist custom/extensiones.lst 
    log archivo-dest 
} 
 
dest porn { 
    domainlist BL/porn/domains 
    log adulto-dest 
} 
 
dest sexo { 
    domainlist BL/sex/lingerie/domains 
    log adulto-dest 
} 
 
dest compras { 
  domainlist BL/shopping/domains 
  log ocio-dest 
} 
 
dest warez { 
  domainlist BL/warez/domains 
  log ocio-dest 
} 
 
dest peliculas { 
  domainlist BL/movies/domains 
  log ocio-dest 
} 
 
dest musica { 
  domainlist BL/webradio/domains 
  log ocio-dest 
} 
 
dest redes { 
  domainlist BL/socialnet/domains 
  log redes-dest 
} 
 
dest descargas { 
  domainlist BL/downloads/domains 
  log ocio-dest 
} 
 
dest proxy { 
  domainlist BL/anonvpn/domains 
  log proxy-dest 
} 
 
dest web-proxy { 
  domainlist BL/redirector/domains 
  log proxy-dest 
} 
 
dest tracker { 
        domainlist BL/tracker/domains   
        log proxy-dest 
} 
 
dest adv { 
        domainlist BL/adv/domains    
        log proxy-dest 
} 
 
###########################################################################
## ACL de redes 
## Combine acá las ACL de tiempo y redes. 
## Especifique en el archivo /var/lib/squidguard/db/irrestrictos aquellas IP que puedan navegar sin restricciones 
 
src lista-youtube{
    iplist custom/youtube.lst
}
 
src lista-dropbox{
    iplist custom/dropbox-users.lst
}
 
src sca{
    iplist custom/sca.lst
}
 
src lista-blanca{ 
    iplist custom/irrestrictos.lst 
} 
 
src lista-negra{ 
  iplist custom/restrictos.lst
} 
 
src usuarios_laboral { 
  ip  192.168.106.0/24 
  within  laboral 
} 
 
src usuarios_almuerzo { 
  ip  192.168.106.0/24 
  within  almuerzo 
} 
 
src usuarios_noche { 
  ip  192.168.106.0/24 
  within  noche 
} 
 
# ACL RULES: 
# Propiamente dichas, los nombres se corresponden con las ACL de redes. 
# Falta la cuestión de listas negras
acl { 
 
    lista-blanca {
            pass any
    }else{
            pass any
    }
 
    lista-negra {
            redirect http://fwmaxbloch.salud.gob.sv/index.php?purl=%u&razon=%t
    }else{
            redirect http://fwmaxbloch.salud.gob.sv/index.php?purl=%u&razon=%t
    }
 
    sca {
        pass    sca-sitios !in-addr !archivos !proxy !web-proxy !porn !redes !peliculas !musica !warez  !descargas !compras !sexo !any
        redirect http://fwmaxbloch.salud.gob.sv/index.php?purl=%u&razon=%t
    }else{
        pass !any
        redirect http://fwmaxbloch.salud.gob.sv/index.php?purl=%u&razon=%t
    }
 
    lista-dropbox {
        pass    dropbox-sitios !in-addr !archivos !proxy !web-proxy !porn !redes !peliculas !musica !warez  !descargas !compras !sexo !any
        redirect http://fwmaxbloch.salud.gob.sv/index.php?purl=%u&razon=%t
    }else{
        pass !any
        redirect http://fwmaxbloch.salud.gob.sv/index.php?purl=%u&razon=%t
    }
 
    lista-youtube {
        pass     sitios !in-addr !archivos !proxy !web-proxy !porn !redes !peliculas !musica !warez  !descargas !compras !sexo !any
        redirect http://fwmaxbloch.salud.gob.sv/index.php?purl=%u&razon=%t
    }else{
        pass !any
        redirect http://fwmaxbloch.salud.gob.sv/index.php?purl=%u&razon=%t
    }
 
    usuarios_laboral  { 
        pass   !in-addr !archivos !proxy !web-proxy !porn !redes !peliculas !musica !warez  !descargas !compras !sexo !any 
        redirect http://FwMaxBloch.salud.gob.sv/index.php?purl=%u&razon=%t 
    } 
 
    usuarios_almuerzo  { 
        pass   !in-addr !archivos !proxy !web-proxy !porn !peliculas !sexo !compras !any 
        redirect http://FwMaxBloch.salud.gob.sv/index.php?purl=%u&razon=%t 
    } 
 
    usuarios_noche { 
        pass  !in-addr !archivos !proxy !web-proxy !porn !redes !peliculas !musica !warez  !descargas !compras !sexo !any 
        redirect http://FwMaxBloch.salud.gob.sv/index.php?purl=%u&razon=%t 
    } 
 
    default { 
        pass   none 
        redirect http://FwMaxBloch.salud.gob.sv/index.php?purl=%u&razon=%t 
    } 
}

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas