Firewall con Debian
- 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
# 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
127.0.0.1 localhost 10.20.20.1 dmz.salud.gob.sv dmz |
|
Configure los siguientes
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
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
#!/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
#!/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 |
|
#!/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
# 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 |
|
########################################################################### #### 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 } } |
|