16 mar 2011

Shorewall en Linux Debian Squeeze 6.0

Shorewall es un software que permite crear más o menos fácil un firewall a partir del firewall interno de Linux (IPTables). Shorewall viene en casi todas las distribuciones de Linux, pero este post es basado en la distribución de Linux Debian Squeeze 6.0 (está probado!!!!)

Nuestro escenario va hacer tres interfaces de red, con un ancho de banda de 4mbit/s de descarga y subida de 512kbit/s de acceso a Internet
Interface 0 = eth0 = Internet (IP: 88.66.77.99 = int)
Interface 1 = eth1 = DMZ (IP: 10.0.0.1 = dmz)
Interface 2 = eth2 = Red Interna (IP: 172.16.0.1 = lan)
nota: los nombres declarados de las interfaces, no deben excederse de 5 caracteres y las IPs expuestas aquí no están ligadas a una red en particular, solo es para tener un escenario un poco más real y así tener un mejor entendimiento de nuestra configuración

1. Instalar el shorewall y copiar ficheros de configuración, que nos harán falta para extender nuevas funcionalidades al firewall nuestro
aptitude install shorewall

2. Copiar configuración estándar que necesites para la carpeta shorewall
cp /usr/share/doc/shorewall/default-config/interfaces /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/zones /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/policy /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/routestopped /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/rules /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/accounting /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/blacklist /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/hosts /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/masq /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/tcclasses /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/tcdevices /etc/shorewall/
cp /usr/share/doc/shorewall/default-config/tcrules /etc/shorewall/


3. Configurar para que el Shorewall arranque, cuando se reinicie la Pc y cambiar donde va debuguear nuestro shorewall
Editar /etc/shorewall/shorewall.conf
(Viene así por defecto) STARTUP_ENABLED=No
(Debemos ponerlo así) STARTUP_ENABLED=Yes
(Viene así por defecto) ROUTE_FILTER=No
(Debemos ponerlo así) ROUTE_FILTER=Yes

(Viene así por defecto) LOGFILE=/var/log/messages
*(Debemos ponerlo así) LOGFILE=/var/log/shorewall/firewall.log

(Viene así por defecto) STARTUP_LOG=/var/log/shorewall-init.log
(Debemos ponerlo así) STARTUP_LOG=/var/log/shorewall/shorewall-init.log

(Viene así por defecto) LOG_MARTIANS=Yes
**(Debemos ponerlo así) LOG_MARTIANS=No
#LAST LINE -- DO NOT REMOVE
## NO QUITE esta -- Última línea

Editar /etc/default/shorewall
***(Viene así por defecto) startup=0
(Debemos ponerlo así) startup=1

*Nota: para que esto ocurra debemos ir a la configuración del syslog, ya que si no se hacen los cambios pertinentes, el shorewall seguirá logueando en el fichero /var/log/syslog o /var/log/messages
**Nota: para que no debugué el shorewall, las entradas marcianas (no sé qué cojones es esto), si no se comenta esta linea, sale unos logs un poco incomodos y constantes
***Nota: Por último, fue un problema que me sucedió y que no lo dicen en todos los tutoriales de Debian con respecto a que el shorewall arranque por sí solo, cuando se reinicie la Pc

4. Configuración de las Interfaces, Zonas, Políticas por defectos para que estas últimas se puedan usar y configurar de una forma más facil.

nano /etc/shorewall/interfaces
#SOURCE DEST POLICY ***LOG LEVEL LIMIT:BURST
## Este archivo define las políticas de nivel alto para las conexiones entre las zonas definidas en el fichero "zones"
int eth0 detect tcpflags,nosmurfs,routefilter
dmz eth0 detect tcpflags,nosmurfs,routefilter
lan eth1 detect tcpflags,nosmurfs,routefilter
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
## NO QUITE esta Última línea -- agregar entradas ARRIBA DE ESTA LÍNEA --
***Nota:
tcpflags = Esta opción hace que Shorewall revise los paquetes por combinaciones ilegales de FLAGS (o banderas) TCP. Nunca está de más tenerlo.
nosmurfs = Filtra paquetes smurfs (paquetes que tienen como dirección de origen una dirección de broadcast)
routefilter = Indica al núcleo que debe rechazar los paquetes de la interfaz cuya dirección de origen se haya encaminada de fuera. Es decir, con otra interfaz distinta.
logmartians = Esta opción hace que Shorewall registre paquetes con direcciones de origen imposibles, para esto tenemos que tener habilitado el routefilter en la interfaz lo cual veremos (ROUTE_FILTER=Yes) /etc/shorewall/shorewall.conf.
blacklist = Analiza los paquetes contra la lista negra que definiremos más adelante en el archivo blacklist del shorewall.
dhcp = Esta opción se debe colocar si tu computadora obtiene su dirección IP vía DHCP, o si tu firewall está instalado en un servidor DHCP.
routeback = Permite que Shorewall filtre paquetes que se devuelven a esta misma interfaz

nano /etc/shorewall/zones
#ZONE TYPE OPTIONS IN OUT
# OPTIONS OPTIONS
fw firewall
int ipv4
dmz ipv4
lan ipv4
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
## NO QUITE esta Última línea -- agregar entradas ARRIBA DE ESTA LÍNEA --

nano /etc/shorewall/policy
#SOURCE DEST POLICY LOG LEVEL LIMIT:BURST
all all DROP info
#Por defecto todo está denegado y será registrado en los LOGs(info)
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
## NO QUITE esta Última línea -- agregar entradas ARRIBA DE ESTA LÍNEA --

Nota. Las zonas es un alias o variables que crea el shorewall de las interfaces físicas de Red en el sistema y que estas estarían ligadas a las políticas aplicar por el usuario y así brindar un mejor entendimiento de para donde iría o de donde vendría tráfico.

5. Configuración de las Reglas de acceso del FireWall - Shorewall
nano /etc/shorewall/rules
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK
# PORT PORT(S) DEST LIMIT GROUP
ACCEPT $FW dmz tcp 22,25,20,21,53,80,110,143,443,3128
ACCEPT $FW lan tcp 22,25,20,21,53,80,110,143,443,3128
ACCEPT $FW dmz tcp 53
ACCEPT $FW dmz udp 53

# Esta Macro permitir que desde el Firewall se pueda hacer telnet a cualquiera de las Zonas
Telnet/ACCEPT:info $FW all

# Esta Macro permitir que desde el Firewall se pueda hacer traceroute a cualquiera de las Zonas
Trcrt/ACCEPT:info $FW all

# Esta Macro permitir que desde el Firewall se pueda hacer Whois a cualquiera de las Zonas
Whois/ACCEPT:info $FW all

# Esta Macro permitir que desde el Firewall se pueda hacer Ping a cualquiera de las Zonas
Ping/ACCEPT:info $FW all

# Esta acl permite que esta ip del servidor de DNS que está en la DMZ, responda a las consultas hechas por los usuarios de la Lan y que el servidor # de DNS pueda alcanzar Internet y que responda a los servidores que estan en Internet por los dominios que están controlados por él.
# Nota: (Hoy en día, casi todos los servidores de DNS, responden por TCP y por UDP)
ACCEPT:info dmz:10.0.0.35 int tcp 53
ACCEPT:info dmz:10.0.0.35 int udp 53
ACCEPT:info lan dmz:10.0.0.35 tcp 53
ACCEPT:info lan dmz:10.0.0.35 udp 53

# Esta acl permite que esta ip del servidor de MX y asu vez tiene los buzones de los usuarios en la red que está en la DMZ, responda a las consultas hechas por los usuarios de la Lan y que pueda alcanzar Internet y que responda a los servidores que están en Internet por los dominios que están controlados por él.
ACCEPT:info dmz:10.0.0.37 int tcp 25 # para que el servidor de correo responda y envie correos a internet
ACCEPT:info dmz:10.0.0.37 int tcp 80 # para que el servidor de correo actualice sus bases de anti-virus y las del spamassassin

DNAT:info lan dmz:10.0.0.34 tcp 3128 - - 40/sec:5 #Publicar puertos del servidor Proxy a la Lan
DNAT:info lan dmz:10.0.0.36 tcp 5222 - - 40/sec:5 #Publicar puertos del servidor Jabber a la Lan
DNAT:info lan dmz:10.0.0.36 tcp 5223 - - 40/sec:5 #Publicar puertos del servidor Jabber a la Lan
DNAT:info lan dmz:10.0.0.37 tcp 25 - - 20/sec:5 #Publicar puertos del servidor de Correo a la Lan
DNAT:info lan dmz:10.0.0.37 tcp 80 - - 20/sec:5 #Publicar puertos del servidor de Correo a la Lan
DNAT:info lan dmz:10.0.0.37 tcp 110 - - 20/sec:5 #Publicar puertos del servidor de Correo a la Lan
DNAT:info lan dmz:10.0.0.37 tcp 143 - - 20/sec:5 #Publicar puertos del servidor de Correo a la Lan

# (40/sec:5) limitar la taza de conexiones a vente por segundo con ráfagas de hasta cinco conexiones para cada servicio:
# (20/sec:5) limitar la taza de conexiones a vente por segundo con ráfagas de hasta cinco conexiones para cada servicio:

# Esta acl permite que esta ip que estaria en la Lan, pueda alcanzar el puerto 25(smtp), 110(pop3), 143(imap) y 80(http) del servidor de correo de Gmail (4.4.8.8) esta IP de gmail es solo un ejemplo.
ACCEPT:info lan:172.16.0.5 int:4.4.8.8 tcp 25,80,110,143

# Esta acl permite que esta ip que estaria en la Lan, pueda alcanzar el puerto 80(http), 443(https) 20(ftp-data) y 21(ftp) de un servidor que esta en la DMZ.
ACCEPT:info lan:172.16.0.5 dmz:10.0.0.39 tcp 20,21,80,443
ACCEPT:info dmz:10.0.0.39 lan:172.16.0.5 tcp - 20
#notece que hay un guion y despues es que esta escrito puerto 20(ftp-data), que es para indicar que el puerto que se acepta es de la Fuente o mejor #dicho del servidor consultado, si este no se pone. la conexion no se realizara.
DNAT:info int dmz:10.10.10.35 tcp 53 - - 20/sec:5 #Publicar puertos del servidor de correo para Internet
DNAT:info int dmz:10.10.10.35 udp 53 - - 20/sec:5 #Publicar puertos del servidor de correo para Internet
DNAT:info int dmz:10.10.10.36 tcp 5269 - - 20/sec:5 #Publicar puertos del servidor de correo para Internet
DNAT:info int dmz:10.10.10.37 tcp 25 - - 20/sec:5 #Publicar puertos del servidor de correo para Internet
DNAT:info int dmz:10.10.10.38 tcp 20 - - 20/sec:5 #Publicar puertos del servidor de correo para Internet
DNAT:info int dmz:10.10.10.38 tcp 21 - - 20/sec:5 #Publicar puertos del servidor de correo para Internet
DNAT:info int dmz:10.10.10.39 tcp 80 - - 20/sec:5 #Publicar puertos del servidor de correo para Internet

# (20/sec:5) limitar la taza de conexiones a vente por segundo con ráfagas de hasta cinco conexiones para cada servicio:

# :info (Debe de tener en cuente que info es para hacer debuguear el shorewall en caso de que la lista de acceso coincida con la antes puesto por UD.)
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
## NO QUITE esta Última línea -- agregar entradas ARRIBA DE ESTA LÍNEA --

6. Configuración de las Reglas de acceso de las IPs únicas para no perder la comunicación con el firewall en caso de problemas.
nano /etc/shorewall/routestopped
#INTERFACE HOST(S)
eth0 172.16.0.6,172.16.0.7 # IPs de los Admin de redes
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
## NO QUITE esta Última línea -- agregar entradas ARRIBA DE ESTA LÍNEA --

7.
nano /etc/shorewall/tcdevices
eth0 4096kbit 512kbit

#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
## NO QUITE esta Última línea -- agregar entradas ARRIBA DE ESTA LÍNEA --

nano /etc/shorewall/tcclasses
#INTERFACE MARK RATE CEIL PRIORITY OPTIONS
eth0 1 full/2 full 1 tcp-ack,tos-minimize-delay
eth0 2 full/6 full 2 tcp-ack,tos-minimize-delay
eth0 3 full/7 full/4 3 tcp-ack,tos-minimize-delay
eth0 4 full/8 full/4 4 tcp-ack,tos-minimize-delay
eth0 5 full/21 full/2 5 tcp-ack,tos-minimize-delay
#tcp-ack (todos los paquetes de menos de 64 bytes entran esta clase)
#tos-minimize-delay (*TOS con mínima demora)
#default (predeterminado) para indicar que será la clase predeterminada.

#* TOS: Es usado para definir o cambiar el tipo de servicio de un paquete que puede ser usado para configurar políticas en la red considerando a ser # enrutados los paquetes, trata de no usarlo para paquetes que vayan hacia internet. En mi caso lo use y me fue de maravilla.

# full (100%) todo el ancho de banda si esta disponible. = 4096 kbit
# full/2 = 1/2 (50%) del ancho de banda si esta disponible. = 2048 kbit
# full/3 = 1/3 (33%) del ancho de banda si esta disponible. = 1365 kbit
# full/4 = 1/4 (25%) del ancho de banda si esta disponible. = 1024 kbit
# full/5 = 1/5 (20%) del ancho de banda si esta disponible. = 819 kbit
# full/6 = 1/6 (16%) del ancho de banda si esta disponible. = 682 kbit
# full/7 = 1/7 (14%) del ancho de banda si esta disponible. = 585 kbit
# full/8 = 1/8 (12.5%) del ancho de banda si esta disponible. = 512 kbit
# full/21 = 1/21 (4.76%) del ancho de banda si esta disponible. = 195 kbit

#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
## NO QUITE esta Última línea -- agregar entradas ARRIBA DE ESTA LÍNEA --

nano /etc/shorewall/tcrules
## Traffic Shaping de Descarga
#MARK SOURCE DEST PROTO DEST SOURCE USER TEST LENGTH TOS
# PORT(S) PORT(S)
2:F 10.0.0.34 0.0.0.0/0 tcp 80,443 # Servidor Proxy
5:F 0.0.0.0/0!172.16.0.0/24 10.0.0.35 tcp 53 # Servidor DNS
5:F 0.0.0.0/0!172.16.0.0/24 10.0.0.35 udp 53 # Servidor DNS
5:F 10.0.0.35 0.0.0.0/0 tcp 53 # Servidor DNS
5:F 10.0.0.35 0.0.0.0/0 udp 53 # Servidor DNS
4:F 0.0.0.0/0 10.0.0.36 tcp 5269 # Servidor Jabber (Mensajeria corporativa)
4:F 10.0.0.36 0.0.0.0/0 tcp 5269 # Servidor Jabber (Mensajeria corporativa)
3:F 10.0.0.37 0.0.0.0/0 tcp 25 # Servidor de Correo
3:F 0.0.0.0/0!172.16.0.0/24 10.0.0.37 tcp 25 # Servidor de Correo
4:F 0.0.0.0/0!172.16.0.0/24 10.0.0.38 tcp 20 # Servidor FTP
4:F 0.0.0.0/0!172.16.0.0/24 10.0.0.38 tcp 21 # Servidor FTP
2:F 0.0.0.0/0!172.16.0.0/24 10.0.0.39 tcp 80 # Servidor Web
#
En donde:
(MARK)marca de clase corresponde al número de marca de la clase definida en tcclasses. Opcionalmente se puede definir el tipo de paquete, que puede ser :F (FORWARD), :P (PRETROUTING) y :T (POSTROUTING). Para efectos prácticos, y en la mayoría de los casos, :F (POSTROUTING) es la opción más adecuada, pues define el tipo de paquetes utilizados en un NAT.

(SOURCE)origen corresponde a la red o dirección IP de origen a la cual se quiere aplicar la clase.

(DEST)destino corresponde a la red o dirección IP de destino. Para fines prácticos, si se define 0.0.0.0/0, se estará definiendo todas las redes y direcciones IP.

(PROTO)protocolo se utiliza para definir si el protocolo de comunicación será TCP (tcp), UDP (udp) o ICMP (icmp).

(PORT(S))puertos de destino se refiere a los nombres o números de los servicios que se desea controlar. Si se define all como valor, se estará refiriendo a todos los puertos disponibles.

En el siguiente ejemplo, se define que las peticiones TCP a los puertos 20,21,25,53,80,443,5269 y UDP al puerto 53 desde un origen, hacia otro destino, se les aplicará las clases marcadas, para todo el tráfico cuya cadena sea FORWARD:

# (0.0.0.0/0!172.16.0.0/24) Este control de trafico es aplicable para todas las redes excepto para el segmento 172.16.0.0/24 de la red local
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
## NO QUITE esta Última línea -- agregar entradas ARRIBA DE ESTA LÍNEA --