Instalación de Servidor Firewall con Proxys transparentes

Imagen de Tonny

Instalación de Servidor Firewall con Proxys transparentes

(web proxy y pop3 proxy)
Debian GNU/Linux + iptables + squid + p3scan + clamav + spamassassin
Versión 1 - Enero de 2007

 

Copyright (c) 2007 Luis Miguel Armendáriz

Está permitido copiar, distribuir y/o modificar los documentos bajo los términos de la GNU Free Documentation License, Version 1.2

Para obtener una copia de la licencia "GNU Free Documentation License" visite http://www.fsf.org/licenses/fdl.txt

Índice


 

Resumen
El objetivo del documento es conseguir instalar un servidor que haga las veces de enrutador, cortafuegos, pasarela y proxy transparente de web y POP3, entre una red local (LAN) e Internet.

Es decir que sin tocar nada en los equipos clientes de la red local, podamos disponer de un cortafuegos que ademas filtre el tráfico http y analice la descarga de correo (POP3) en busca de spam y virus.



Todos los manuales que he encontrado para filtrar spam y antivirus se basan en instalar un servidor de correo y filtrar el protocolo SMTP. Eso te obliga a tener cuentas de correo, usuarios... Mi intención era únicamente analizar el tráfico en busca de virus y spam en los correos de los clientes, independientemente de cual sea su servidor (direcciones personales, empresariales...).

La solución es p3scan, un proxy transparente de POP3. Pero ni siquiera en su web he encontrado un manual de instalación.



El documento que estas leyendo pretende ser esa guía que yo no encontré que permita instalar y configurar un proxy transparente de POP3 integrado en un cortafuegos e integrado, por el mismo precio, con un proxy transparente de web y redireccionamientos NAT.



Para ello vamos a utilizar Debian GNU/Linux con, principalmente, iptables, squid, p3scan, clamav y spampd (SpamAssassin).

 

Notas sobre el documento
La mayoría de los ficheros de configuración se muestran incompletos. Generalmente las lineas aquí mostradas son únicamente las que ha sido necesario modificar.



Las versiones de los paquetes Debian utilizadas al realizar este documento han sido:

  • Debian Etch RC1 (2006-11-13)

  • kernel linux 2.6.18-3-686
  • iptables 1.3.6.0debian1-5
  • squid 2.6.5-2
  • p3scan 2.1-2
  • clamav 0.88.7-1
  • spampd 2.30-15
  • spamassassin 3.1.7-1
  • spamc 3.1.7-1

 

Instalación del sistema base
Vamos a utilizar un CD de netinstall de Debian Etch RC1 (2006-11-13) que nos permitirá de forma facil y sencilla instalar un sistema básico.

Recordemos que puesto que vamos a instalar un cortafuegos, es mejor no instalar paquetes innecesarios.

 

Realizamos una instalación minima arrancando desde el CD (sin utilizar repositorios en red) instalando solo el sistema base.

 

Generamos tres particiones:

  • una para el sistema

  • otra para swap
  • otra de respaldo en /copia

    en esta guardamos una imagen del sistema instalado datos de configuración que queramos conservar y copias de seguridad.

Una vez instalado el sistema desde el CD, configuramos algunos detalles.

 

Activación de framebuffer en consola (OPCIONAL)
# vi /boot/grub/menu.lst

(...)
kernel /boot/vmlinuz-2.6.18-3-686 root=/dev/hda3 ro vga=791
(...)

 

Configuración de la red
Configuramos las interfaces.

# vi /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#allow-hotplug eth0
#iface eth0 inet dhcp
### Interfaz EXTERNA
iface eth0 inet static
address 280.280.280.280 # Aquí debe ir la IP pública del equipo
# Esta es una IP ficticia. De hecho no es una IP válida.
# Es la que usaremos como ejemplo en el documento

netmask 255.255.255.0
gateway 280.280.280.1
up route add default gw 280.280.280.1

### Interfaz INTERNA
iface eth1 inet static
address 192.168.0.10
netmask 255.255.255.0

auto eth0
auto eth1

 

Configuramos la resolucion DNS.

Tengo disponible una lista de servidores de DNS. Aquí pongo un par de servidores de Telefónica de ejemplo.

# vi /etc/resolv.conf

#Telefonica
nameserver 80.58.0.33
nameserver 80.58.32.97

 

Actualización del sistema
Configuramos los repositorios utilizando el mirror de Francia, ya que el de España sigue dando problemas de vez en cuando (y van un montón de años...)

# vi /etc/apt/sources.list

#
# deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 Binary-1 (20061111)]/ etch main

#deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 Binary-1 (20061111)]/ etch main

deb http://ftp.fr.debian.org/debian/ etch main
deb-src http://ftp.fr.debian.org/debian/ etch main

deb http://security.debian.org/ etch/updates main
deb-src http://security.debian.org/ etch/updates main

 

Insertamos la clave del repositorio

# gpg --keyserver keyring.debian.org --recv-key 6070d3a1

# gpg --armor --export 6070d3a1 | apt-key add -

 

Actualizamos el sistema

# aptitude update

# aptitude upgrade

# aptitude dist-upgrade

 

Instalamos algunos paquetes utiles y/o necesarios

# aptitude install less vim lynx telnet tofrodos

# aptitude install openssh-server nmap iptables

... y el entorno grafico si lo deseamos (NO SE RECOMIENDA)

# aptitude install xserver-xorg xserver-common xfonts-base gnome

 

Quitamos servicios innecesarios

(El servicio portmap puede ser necesario matarlo con kill -9)

# /etc/init.d/portmap stop

# update-rc.d -f portmap remove

# update-inetd --disable chargen

# update-inetd --disable ident

# update-inetd --disable discard

Opcionalmente y según lo que hayamos instalado (RECOMENDADO)

# /etc/init.d/cups stop

# update-rc.d -f cups remove

# update-rc.d -f gdm remove

 

Servicios a quitar si no se ha realizado la instalación básica indicada

# /etc/init.d/lpd stop

# update-rc.d -f lpd remove

# /etc/init.d/nfs-common stop

# update-rc.d -f nfs-common remove

# /etc/init.d/pcmcia stop

# update-rc.d -f pcmcia remove

# /etc/init.d/ppp stop

# update-rc.d -f ppp remove

# /etc/init.d/exim4 stop

# update-rc.d -f exim4 remove

# /etc/init.d/bittorrent stop

# update-rc.d -f bittorrent remove

# update-rc.d -f ntpdate remove

# update-inetd --disable time

# update-inetd --disable daytime

# update-inetd --disable echo

 

Configuración de ssh
Para mayor seguridad cambiamos el puerto, reducimos el tiempo de login y no permitimos conexiones de root

# vi /etc/ssh/sshd_config

Port 2222
LoginGraceTime 45
PermitRootLogin no



Solo permitimos acceder por ssh a los usuarios indicados en el fichero /etc/loginusers

# vi /etc/pam.d/ssh

#auth required pam_env.so # [1]
auth required pam_listfile.so sense=allow onerr=fail item=user file=/etc/loginusers



Creamos el fichero /etc/loginusers

# vi /etc/loginusers

servi3



Como usuario (servi3 en el ejemplo) generamos las claves dsa y asignamos una passphrase

$ ssh-keygen -t dsa

 

Para cambiar (o des/asignar) una passphrase

$ ssh-keygen -p -f .ssh/id_dsa

Se recomienda cambiar la passphrase regularmente.

 

Autorizamos la clave publica

$ cat .ssh/id_dsa.pub > .ssh/authorized_keys



La clave privada (id_dsa) se tiene que copiar en los clientes de ssh a través de algún medio seguro. Por ejemplo en un disco de 2'5", pero NO a través de correo-e normal.



En este momento es posible conectarse desde otra maquina utilizando login y contraseña como siempre ($ ssh usuario@maquina -p 2222) o usando el fichero de clave privada y conociendo la passphrase ($ ssh usuario@maquina -p 2222 -i id_dsa_copiada).

 

Para permitir solo el uso de certificados reconfiguramos sshd desautorizando las autentificaciones por contraseña

# vi /etc/ssh/sshd_config

PasswordAuthentication no



Reiniciamos el servicio

# /etc/init.d/ssh restart

 

Para usar la clave en PuTTY (Windows):

  1. Copiamos la clave al equipo

  2. Usamos PuTTYGen para importar la clave y guardarla como .ppk
  3. Al hacer la conexión, en el menú SSH->Auth seleccionamos nuestro fichero .ppk

 

Instalación de la pasarela -gateway- con enrutador y cortafuegos
Copiamos los archivos para gestionar iptables en el directorio /etc/network/iptables.

# mkdir /etc/network/iptables

# cd /etc/network/iptables

# wget http://www.guimi.net/datos/tec-docs/firewall/guimi_iptables.tgz

# tar xzf guimi_iptables.tgz

 

Tendremos los siguientes ficheros:

  • ipflush.sh anula cortafuegos y enrutador. Es el script que se ejecuta al hacer "iptables stop".

  • ipgw_flush.sh activa el enrutador sin cortafuegos (permitiendo todo el tráfico). MUY PELIGROSO. Utilizar solo en entornos de prueba protegidos y controlados.
  • iprules.sh activa el enrutador y cortafuegos. Es el más importante y al que más tiempo habrá que dedicar para adaptarlo a nuestras necesidades. Es el script que se ejecuta al hacer "iptables start".
  • iptables utilizado para des/activar enrutador y cortafuegos.
  • iptables-check muestra las reglas de iptables activas en el sistema.
  • iptables.flush contiene la salida de iptables-save > iptables.flush tras ejecutar ipflush.sh



A continuación se puede ver el contenido de iprules.sh que nos permite:

  • generar un cortafuegos con todas las acciones por omisión a "DROP" (si un paquete no se ha aceptado explícitamente, se descarta)

  • hacer DNAT para un par de servidores FTP y web (redirige peticiones FTP y web de la dirección pública a servidores internos)
  • hacer NAT de salida para la intranet (los equipos de la LAN pueden navegar con la ip pública del servidor)
  • utilizar un par de proxys transparentes de web y POP3 redireccionando las peticiones de los equipos clientes (cuando un cliente pretende navegar o leer un correo el servidor "secuestra" la conexión y la analiza antes de permitirla)

#!/bin/bash
#
# Por Guimi 2007/01 - http://www.guimi.net
#
# Para guardar las reglas
#+ iptables-save > reglas
#+ iptables-restore < reglas
#

# Miramos si tenemos un parametro en linea de comando
if [ -n "$1" ] && [ "$1" = "q" ]
then
QUIET="1"
else
QUIET="0"
fi

# Registramos el inicio del firewall
#FECHA=$(date +"%C%y-%m-%d %H:%M")
#echo $FECHA
#/usr/bin/logger -p kern.notice -t NETFILTER \
# "====== Iniciado Cortafuegos: $FECHA ========="

if [ $QUIET = "0" ]; then
echo " Realizado por Guimi (http://www.guimi.net)"
echo " ------------------------------------------"
fi

# PARAMETRIZACION DEL SCRIPT
##########################################
### Definimos constantes para usar en el
###+ script
if [ $QUIET = "0" ]; then
echo " Cargando parametros..."
fi

# Binario de iptables
IPTABLES=/sbin/iptables

# INTERFACES
# eth0 - conectado a internet con IP FIJA
EXT_IF=eth0
EXT_IP=280.280.280.280
# eth1 - conectado a LAN
LAN_IF=eth1
LAN_IP=192.168.0.1
LAN_RED=192.168.0.0/24
# lo - interfaz de loopback
LOO_RED=127.0.0.0/8
# cualquier red
ANY_RED=0.0.0.0/0

# MAQUINAS INTERNAS
IP_SERVIDOR_FTP=192.168.0.2

if [ $QUIET = "0" ]; then
echo " Cargando modulos..."
fi
##########################################
### Nos aseguramos que tenemos cargados
###+ los modulos necesarios
modprobe ip_conntrack_irc
modprobe ip_conntrack_ftp
modprobe ip_nat_irc
modprobe ip_nat_ftp

if [ $QUIET = "0" ]; then
echo " Limpiando FW..."
fi
##########################################
### Limpiamos la configuracion existente

# Limpiamos (flush) las reglas
$IPTABLES -F
# Borramos 'cadenas' de usuario
$IPTABLES -X
# Ponemos a cero paquetes y contadores
$IPTABLES -Z
# Limpiamos las reglas de NAT
$IPTABLES -t nat -F
# Borramos 'cadenas' de usuario de NAT
$IPTABLES -t nat -X

if [ $QUIET = "0" ]; then
echo " Estableciendo politicas..."
fi
##########################################
### Establecemos las politicas por omision
###+ de las 'cadenas'

# Por omision descartamos los paquetes
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
# PREROUTING - NAT sobre la IP destino: normalmente desde inet hacia LAN
# POSTROUTING - NAT sobre la IP origen: normalmente desde LAN hacia inet
$IPTABLES -t nat -P PREROUTING DROP
$IPTABLES -t nat -P POSTROUTING DROP

# Relajamos la politica de salida
#+ Dejamos salir paquetes de LAN_IP por LAN_IF
$IPTABLES -A OUTPUT -o $LAN_IF -s $LAN_IP -j ACCEPT
#+ Dejamos salir paquetes de EXT_IP por EXT_IF
$IPTABLES -A OUTPUT -o $EXT_IF -s $EXT_IP -j ACCEPT

if [ $QUIET = "0" ]; then
echo " -> Denegacion de redes invalidas..."
fi
##########################################
# No admitimos desde el exterior redes locales (RFC 1918)
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 192.168.0.0/16 -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 10.0.0.0/8 -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 172.16.0.0/12 -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 224.0.0.0/4 -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 240.0.0.0/5 -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s $LOO_RED -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 0.0.0.0/8 -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 169.254.0.0/16 -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 255.255.255.255 -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s $EXT_IP -j DROP
# Desde el interior solo admitimos nuestra red LAN
$IPTABLES -t nat -A PREROUTING -i $LAN_IF -s ! $LAN_RED -j DROP

if [ $QUIET = "0" ]; then
echo " -> Denegacion de broadcast de NetBIOS..."
fi
##########################################
# Bloquear paquetes broadcast de NetBios salientes
iptables -A FORWARD -p tcp --sport 137:139 -o $EXT_IF -j DROP
iptables -A FORWARD -p udp --sport 137:139 -o $EXT_IF -j DROP
iptables -A OUTPUT -p tcp --sport 137:139 -o $EXT_IF -j DROP
iptables -A OUTPUT -p udp --sport 137:139 -o $EXT_IF -j DROP

if [ $QUIET = "0" ]; then
echo " Activando NAT..."
fi
##########################################
# Activamos el bit de forward
echo 1 > /proc/sys/net/ipv4/ip_forward
# Enmascaramos la salida de la LAN
$IPTABLES -t nat -A POSTROUTING -s $LAN_RED -o $EXT_IF -j MASQUERADE

if [ $QUIET = "0" ]; then
echo " Accesos a la maquina local permitidos..."
fi
##########################################
### Permitimos ciertos accesos a la maquina

if [ $QUIET = "0" ]; then
echo " -> loopback..."
fi
# Permitimos todas las conexiones del interfaz loopback
#$IPTABLES -A INPUT -i lo -j ACCEPT
#$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT -i lo -s $LOO_RED -d $LOO_RED -j ACCEPT
$IPTABLES -A OUTPUT -o lo -s $LOO_RED -d $LOO_RED -j ACCEPT
# Permitimos el PostEnrutado de paquetes enviados localmente
$IPTABLES -t nat -A POSTROUTING -o lo -s $LOO_RED -j ACCEPT

if [ $QUIET = "0" ]; then
echo " -> LAN..."
fi
# Damos acceso desde la red local
$IPTABLES -A INPUT -s $LAN_RED -i $LAN_IF -j ACCEPT
$IPTABLES -A OUTPUT -d $LAN_RED -o $LAN_IF -j ACCEPT

if [ $QUIET = "0" ]; then
echo " -> DNS..."
fi
# Aceptamos conexiones DNS
$IPTABLES -A INPUT -s $ANY_RED -i $EXT_IF -p udp -m udp --sport 53 --dport 1024:65535 -j ACCEPT
$IPTABLES -A OUTPUT -d $ANY_RED -o $EXT_IF -p udp -m udp --dport 53 --sport 1024:65535 -j ACCEPT

if [ $QUIET = "0" ]; then
echo " -> ntpd..."
fi
# Aceptamos conexiones ntpd
$IPTABLES -A INPUT -p udp -m udp --dport 123 -i $EXT_IF -s $ANY_RED -j ACCEPT
$IPTABLES -A OUTPUT -p udp -m udp --sport 123 -j ACCEPT

if [ $QUIET = "0" ]; then
echo " -> icmp..."
fi
# Permitimos paquetes ICMP (ping, traceroute...)
#+ con limites para evitar ataques de DoS
# Aceptamos ping y pong
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-request -m limit --limit 2/s -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-reply -m limit --limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-reply -m limit --limit 2/s -j ACCEPT
# Aceptamos redirecciones
$IPTABLES -A INPUT -p icmp --icmp-type redirect -m limit --limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type redirect -m limit --limit 2/s -j ACCEPT
# Aceptamos tiempo excedido
$IPTABLES -A INPUT -p icmp --icmp-type time-exceeded -m limit --limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type time-exceeded -m limit --limit 2/s -j ACCEPT
# Aceptamos destino inalcanzable
$IPTABLES -A INPUT -p icmp --icmp-type destination-unreachable -m limit --limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type destination-unreachable -m limit --limit 2/s -j ACCEPT

if [ $QUIET = "0" ]; then
echo " -> ssh..."
fi
# Abrimos el puerto 2222 para ssh
#$IPTABLES -A INPUT -p tcp -i $EXT_IF -s $ANY_RED -m tcp --dport 2222 --sport 1024:65535 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s $ANY_RED -m tcp --dport 2222 --sport 1024:65535 -m state --state NEW -j LOG --log-prefix "[FW - SSH] "
$IPTABLES -A INPUT -p tcp -s $ANY_RED -m tcp --dport 2222 --sport 1024:65535 -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -A OUTPUT -p tcp -m tcp --sport 2222 -m state --state RELATED,ESTABLISHED -j ACCEPT

if [ $QUIET = "0" ]; then
echo " Redirecciones..."
fi
##########################################
### Generamos redireccionamientos
###+ transparentes para el resto de maquinas

if [ $QUIET = "0" ]; then
echo " -> Proxy web transparente (Squid)..."
fi
#+ Con la redireccion activa (primera linea)
#+ no se llega a la segunda linea
#+ Para bloquear todo acceso a la web comentar
#+ solo la primera linea
#+ Para anular el proxy comentar las dos reglas
$IPTABLES -t nat -A PREROUTING -i $LAN_IF -s $LAN_RED -p tcp --dport 80 -j REDIRECT --to-port 3128
$IPTABLES -A FORWARD -i $LAN_IF -p tcp --dport 80 -j DROP

if [ $QUIET = "0" ]; then
echo " -> Filtro de correo (P3Scan)..."
fi
#+ Con la redireccion activa (primera linea)
#+ no se llega a la segunda linea
#+ Para bloquear todo acceso a POP comentar
#+ solo la primera linea
#+ Para anular el filtrado comentar las dos reglas
$IPTABLES -t nat -A PREROUTING -i $LAN_IF -s $LAN_RED -p tcp --dport 110 -j REDIRECT --to-port 8110
$IPTABLES -A FORWARD -i $LAN_IF -p tcp --dport 110 -j DROP
###$IPTABLES -t nat -A OUTPUT -p tcp --dport 110 -m owner --owner-id p3scan -j ACCEPT
###$IPTABLES -t nat -A OUTPUT -p tcp --dport 110 -j REDIRECT --to-port 8110

if [ $QUIET = "0" ]; then
echo " -> DNAT (21 y 20)..."
fi
# Redirigimos "$EXT_IP":2220-1 a "$IP_SERVIDOR_FTP":20-1
###$IPTABLES -t nat -A PREROUTING -i $EXT_IF -d $EXT_IP -p tcp --dport 21 -j LOG --log-prefix "[FW - FTP] "
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -d $EXT_IP -p tcp --dport 220 -j DNAT --to "$IP_SERVIDOR_FTP":20
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -d $EXT_IP -p tcp --dport 221 -j DNAT --to "$IP_SERVIDOR_FTP":21
# ...y conexiones salientes relacionadas (ftp pasivo)
$IPTABLES -t nat -A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
# Permitimos postruteos a "$IP_SERVIDOR_FTP":20-1
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -d $IP_SERVIDOR_FTP -p tcp --dport 20 -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -d $IP_SERVIDOR_FTP -p tcp --dport 21 -j ACCEPT
# Permitimos reenvios desde el exterior a "$IP_SERVIDOR_FTP":20-1
$IPTABLES -A FORWARD -i $EXT_IF -d $IP_SERVIDOR_FTP -p tcp --dport 20 -j ACCEPT
$IPTABLES -A FORWARD -i $EXT_IF -d $IP_SERVIDOR_FTP -p tcp --dport 21 -j ACCEPT

if [ $QUIET = "0" ]; then
echo " Reenvios..."
fi
##########################################
### Aceptamos algunos reenvios

if [ $QUIET = "0" ]; then
echo " -> icmp..."
fi
# Permitimos paquetes ICMP (ping, traceroute...)
#+ con limites para evitar ataques de DoS
# Aceptamos ping y pong
$IPTABLES -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 2/s -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type echo-reply -m limit --limit 2/s -j ACCEPT
# Aceptamos redirecciones
$IPTABLES -A FORWARD -p icmp --icmp-type redirect -m limit --limit 2/s -j ACCEPT
# Aceptamos tiempo excedido
$IPTABLES -A FORWARD -p icmp --icmp-type time-exceeded -m limit --limit 2/s -j ACCEPT
# Aceptamos destino inalcanzable
$IPTABLES -A FORWARD -p icmp --icmp-type destination-unreachable -m limit --limit 2/s -j ACCEPT
# Aceptamos todas en LAN_IF
$IPTABLES -t nat -A PREROUTING -i $LAN_IF -p icmp --icmp-type any -m limit --limit 2/s -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -p icmp --icmp-type any -m limit --limit 2/s -j ACCEPT

if [ $QUIET = "0" ]; then
echo " Salida general..."
fi
##########################################
### Aceptamos conexiones salientes

# Permitimos cualquier salida tcp desde la propia maquina
$IPTABLES -A OUTPUT -o $EXT_IF -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# ...y conexiones entrantes relacionadas
$IPTABLES -A INPUT -i $EXT_IF -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# Permitimos el reenvio de paquetes enviados desde la LAN
$IPTABLES -A FORWARD -i $LAN_IF -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

# Permitimos el NAT de paquetes enviados desde la LAN
$IPTABLES -t nat -A PREROUTING -i $LAN_IF -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -t nat -A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT

# Permitimos el NAT de paquetes enviados desde inet hacia la IP publica
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -d $EXT_IP -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -t nat -A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT

# Permitimos el NAT de paquetes enviados desde la IP publica hacia inet
$IPTABLES -t nat -A POSTROUTING -o $EXT_IF -s $EXT_IP -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -t nat -A POSTROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT

# Permitimos el PostEnrutado de paquetes enviados localmente
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -s $LAN_RED -j ACCEPT

if [ $QUIET = "0" ]; then
echo " Cerrando puertos restringidos..."
fi
##########################################
### Puertos restringidos (telnet, ftp, imap, pop3, etc.)
###+ Reiterativo: para pruebas
$IPTABLES -A INPUT -p tcp --dport 1:1024 -j DROP
$IPTABLES -A INPUT -p udp --dport 1:1024 -j DROP

###echo " ACTIVADO DEBUG..."
##########################################
### Reglas utilizadas en debug para detectar
#+ paquetes no tratados todavia
#+ -j LOG --log-prefix "--PR> "
###$IPTABLES -t nat -A PREROUTING -j LOG --log-prefix "[FW - PR] "
###$IPTABLES -t nat -A POSTROUTING -j LOG --log-prefix "[FW - PO] "
###$IPTABLES -A FORWARD -j LOG --log-prefix "[FW - FW] "
###$IPTABLES -A INPUT -j LOG --log-prefix "[FW - IN] "
###$IPTABLES -A OUTPUT -j LOG --log-prefix "[FW - OU] "

if [ $QUIET = "0" ]; then
echo " Configuracion FW terminada."
echo ""
echo " A continuacion podria desear:"
echo " - verificar reglas: iptables -nvL && iptables -nvL -t nat"
echo " - guardar reglas: iptables-save > reglas"
echo " - restaurar reglas: iptables-restore < reglas"
fi
##########################################
exit 0



Para dejar iptables perfectamente configurado aplicamos y guardamos las reglas del cortafuegos

# cd /etc/network/iptables

# ./iprules.sh

# iptables-save > iptables.rc



Configuramos la red para que active y desactive la pasarela cuando se levante o se tumbe la tarjeta de red conectada con internet.

# vi /etc/network/interfaces

(...)
### Interfaz EXTERNA
iface eth0 inet static
(...)
pre-up /etc/network/iptables/iptables start
post-down /etc/network/iptables/iptables stop

### Interfaz INTERNA
(...)

 

Configuración de proxy web transparente (Squid)
Para que funcione debe existir una redirección del puerto 80 al squid.

Esa redirección la hemos realizado con el fichero iprules.sh.

Nótese que en el ejemplo solo se utiliza el proxy para las conexiones al puerto 80, es decir, las conexiones de https (puerto 443) se reenvían directamente.

 

# aptitude install squid

# vi /etc/squid/squid.conf

http_port 3128 transparent
# proxy icp
# hostname type port port options
# -------------------- -------- ----- ----- -----------
#cache_peer 1.2.3.4 parent 8080 0 no-query
cache_dir aufs /var/spool/squid 600 16 256
visible_hostname mi_pasarela
acl our_networks src 192.168.0.0/16
http_access allow our_networks
#nonhierarchical_direct off

 

Reiniciamos el servicio

# /etc/init.d/squid restart

 

Si se desea hacer pruebas, un modo sencillo es comentar en /etc/squid/squid.conf la linea que dice http_access allow our_networks y probar a navegar por la web desde la intranet.

El navegador debería mostrarnos una página generada por Squid indicándonos que no tenemos permiso para navegar.

 

Este manual nos permite añadir análisis antivirus a squid.

 

Configuración de antivirus (ClamAV)
Realizamos una instalación manteniendo la configuración por omisión

# aptitude install clamav

 

Comprobamos los permisos de la base de datos y los logs

# ls -al /var/lib/clamav/

total 8216
drwxr-xr-x 2 clamav clamav 4096 2006-12-30 09:55 .
drwxr-xr-x 45 root root 4096 2006-12-29 12:29 ..
-rw-r--r-- 1 clamav clamav 1460245 2006-12-30 09:55 daily.cvd
-rw-r--r-- 1 clamav clamav 6924820 2006-12-29 12:30 main.cvd

# ls -al /var/log/clamav/

total 28
drwxr-xr-x 2 clamav clamav 4096 2006-12-29 12:30 .
drwxr-xr-x 12 root root 4096 2006-12-30 10:02 ..
-rw-r----- 1 clamav adm 12287 2006-12-30 11:25 clamav.log
-rw-r----- 1 clamav adm 5233 2006-12-30 11:29 freshclam.log

 

Probamos el antivirus

Para hacer pruebas utilizamos el test eicar de eicar.org.

El test eicar es una firma utilizada para probar los antivirus. No hace absolutamente nada pero todos los antivirus la reconocen.

Podemos crear un fichero de texto detectable haciendo que contenga unicamente la siguiente linea:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Tambien podemos utilizar estos ficheros con la firma eicar.

 

Por ejemplo, utilizando el usuario ya visto (servi3):

$ cd /home/servi3

$ wget http://www.guimi.net/datos/tec-docs/firewall/guimi_eicar.tgz

$ tar xzf guimi_eicar.tgz

 

# clamscan /home/servi3/eicar/

/home/servi3/eicar/eicar.com.txt: Eicar-Test-Signature FOUND
/home/servi3/eicar/eicar.com: Eicar-Test-Signature FOUND
/home/servi3/eicar/eicar_com.zip: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 85898
Engine version: 0.88.7
Scanned directories: 1
Scanned files: 3
Infected files: 3
Data scanned: 0.00 MB
Time: 2.684 sec (0 m 2 s)

 

Configuración de SpamPd (Usa SpamAssasin)
SpamPD es un filtro contra spam que utiliza spamassasin. Configuraremos p3scan para que utilice el cliente spamc.

# aptitude install spampd

 

Configuramos spampd para que utilice el mismo usuario del antivirus.

Al usar un usuario para todo lo que tiene que ver con correo (p3scan, clamav, spampd) simplificamos los permisos

# vi /etc/default/spampd

USERID=clamav
GRPID=clamav

 

Activamos SA

# vi /etc/default/spamassassin

ENABLED=1

 

Configuramos SA

# vi /etc/spamassassin/local.cf

### Indicamos en la cabecera del mensaje que es probable spam
rewrite_header Subject *****SPAM*****
### El mensaje original lo incluimos como un anexo en MIME
report_safe 1
### Marcamos el umbral de puntuacion para que un mensaje sea
###+ considerado spam
required_score 3.0
### Utilizamos el filtro bayesiano
use_bayes 1
### Activamos el autoaprendizaje del filtro bayesiano
bayes_auto_learn 1
### Aceptamos mensajes en frances y espanyol
###+ El resto puntua como posible spam
ok_languages fr es
### Aceptamos el juego de caracteres occidental
###+ El resto puntua como posible spam
ok_locales en
### Anyadimos cabeceras a los mensajes
### Solo a los que son spam
add_header spam Flag _YESNOCAPS_
### A todos
add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ autolearn=_AUTOLEARN_ version=_VERSION_ bayes=_BAYES_
add_header all Level _STARS(*)_
add_header all Checker-Version SpamAssassin _VERSION_ (_SUBVERSION_) on _HOSTNAME_

 

Preparamos un script que mantenga las reglas de SA actualizadas

# vi /root/bin/actualiza_sa.sh

#!/bin/bash
#
# Script para actualizar las reglas de SpamAssassin
#
# Guimi - http://guimi.net
# 2007-01
#

# Cambiamos al directorio adecuado
cd /etc/spamassassin/

# Actualizamos las reglas
wget http://mywebpages.comcast.net/mkettler/sa/antidrug.cf
wget http://www.nospamtoday.com/download/mime_validate.cf
wget http://www.rulesemporium.com/rules/70_sare_adult.cf
wget http://www.rulesemporium.com/rules/70_sare_bayes_poison_nxm.cf
wget http://www.rulesemporium.com/rules/70_sare_evilnum0.cf
wget http://www.rulesemporium.com/rules/70_sare_genlsubj0.cf
wget http://www.rulesemporium.com/rules/70_sare_genlsubj_eng.cf
wget http://www.rulesemporium.com/rules/70_sare_header0.cf
wget http://www.rulesemporium.com/rules/70_sare_header_eng.cf
wget http://www.rulesemporium.com/rules/70_sare_html0.cf
wget http://www.rulesemporium.com/rules/70_sare_html_eng.cf
wget http://www.rulesemporium.com/rules/70_sare_obfu0.cf
wget http://www.rulesemporium.com/rules/70_sare_oem.cf
wget http://www.rulesemporium.com/rules/70_sare_random.cf
wget http://www.rulesemporium.com/rules/70_sare_specific.cf
wget http://www.rulesemporium.com/rules/70_sare_spoof.cf
wget http://www.rulesemporium.com/rules/70_sare_stocks.cf
wget http://www.rulesemporium.com/rules/70_sare_unsub.cf
wget http://www.rulesemporium.com/rules/70_sare_uri0.cf
wget http://www.rulesemporium.com/rules/72_sare_bml_post25x.cf
wget http://www.rulesemporium.com/rules/72_sare_redirect_post3.0.0.cf
wget http://www.rulesemporium.com/rules/88_FVGT_body.cf
wget http://www.rulesemporium.com/rules/88_FVGT_headers.cf
wget http://www.rulesemporium.com/rules/88_FVGT_rawbody.cf
wget http://www.rulesemporium.com/rules/88_FVGT_subject.cf
wget http://www.rulesemporium.com/rules/88_FVGT_uri.cf
wget http://www.rulesemporium.com/rules/99_FVGT_DomainDigits.cf
wget http://www.rulesemporium.com/rules/99_FVGT_meta.cf
wget http://www.rulesemporium.com/rules/99_FVGT_Tripwire.cf
wget http://www.rulesemporium.com/rules/99_sare_fraud_post25x.cf
wget http://www.stearns.org/sa-blacklist/random.current.cf
wget http://www.timj.co.uk/linux/bogus-virus-warnings.cf
wget http://www.yackley.org/sa-rules/evilnumbers.cf

# Reiniciamos los servicios
/etc/init.d/spamassassin restart
/etc/init.d/spampd restart



Programamos el sistema para que actualice al menos una vez a la semana (NO más de una vez al día para no contravenir la política de descarga de SARE)

# crontab -e

#m h dom mon dow command
00 05 * * 1 /root/bin/actualiza-sa.sh

 

Configuración de proxy POP3 (p3scan)
# aptitude install p3scan

 

Utilizamos el mensaje de virus en español

# cd /etc/p3scan/

# rm p3scan.mail

# ln -s p3scan-sp.mail p3scan.mail

 

Configuramos p3scan

# vi /etc/p3scan/p3scan.conf

targetip = 0.0.0.0
targetport = 8110
user = clamav
scannertype = basic
scanner = /usr/bin/clamscan --no-summary
virusregexp = .*: (.*) FOUND
demime
checkspam
spamcheck = /usr/bin/spamc
subject = [Virus - mi_pasarela] Un mensaje enviado para usted contenia virus:

 

Hacemos todos los usuarios de los tres grupos aunque en realidad solo utilizamos el usuario clamav

# vi /etc/group

clamav:x:110:spamc,spampd,p3scan
p3scan:x:111:clamav,spamc,spampd
spampd:x:112:clamav,spamc,p3scan

 

Damos permisos al usuario

# chown clamav:clamav -R /var/spool/p3scan

# chown clamav:clamav -R /var/run/p3scan

# /etc/init.d/p3scan restart

# /etc/init.d/spamassassin restart

# /etc/init.d/spampd restart



Si no arranca p3scan automaticamente:

update-rc.d p3scan defaults

 

Algunas comprobaciones
# lsof -i | grep LISTEN

p3scan xxxx clamav 3u IPv4 xxxx TCP *:8110 (LISTEN)
sshd xxxx root 3u IPv6 xxxx TCP *:2222 (LISTEN)
squid xxxx proxy 13u IPv4 xxxx TCP *:3128 (LISTEN)
spampd xxxx clamav 5u IPv4 xxxxx TCP localhost:10025 (LISTEN)
spampd xxxx clamav 5u IPv4 xxxxx TCP localhost:10025 (LISTEN)
spampd xxxx clamav 5u IPv4 xxxxx TCP localhost:10025 (LISTEN)
spampd xxxx clamav 5u IPv4 xxxxx TCP localhost:10025 (LISTEN)
spamd xxxx root 5u IPv4 xxxxx TCP localhost:spamd (LISTEN)
spamd xxxx clamav 5u IPv4 xxxxx TCP localhost:spamd (LISTEN)
spamd xxxx root 5u IPv4 xxxxx TCP localhost:spamd (LISTEN)


# nmap localhost -p 1-5000,8110,10024-10026

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2007-01-02 17:12 CET
Interesting ports on localhost (127.0.0.1):
Not shown: 4999 closed ports
PORT STATE SERVICE
783/tcp open spamassassin
2222/tcp open unknown
3128/tcp open squid-http
8110/tcp open unknown
10025/tcp open unknown

Nmap finished: 1 IP address (1 host up) scanned in 0.362 seconds

 

Si todo parece correcto, enviar mensajes de spam y/o con la firma eicar a cuentas que despues sean accedidas por pop3 desde la intranet. Verificar en las cabeceras que se usa el antispam.

 

BONO EXTRA - Configuración de OpenVPN
SIN TERMINAR

Instalación básica de OpenVPN basada en clave pre-compartida.

 

# modprobe tun

# ls /dev/net/tun -l

crw-rw-rw- 1 root root 10, 200 2006-12-30 09:55 /dev/net/tun

# openvpn --genkey --secret /etc/openvpn/key

# vi /etc/openvpn/config.ovpn

dev tap
secret /etc/openvpn/key
ping 10
verb 1
mute 10
ifconfig 10.0.1.1 255.255.255.252
lport 5002

# openvpn --config /etc/openvpn/config.ovpn --log-append /var/log/openvpn.log --daemon

 

Configuración del cliente

remote the.ip.public.address

rport 5002

dev tap

ifconfig 10.0.1.2 255.255.255.252

secret c:\openvpn\config\key # el mismo fichero key que el servidor

ping 10

verb 1

mute 10

route-gateway 10.0.1.1

redirect-gateway

 

Para contactar con nosotros escríbe a contacto_ARROBA_guimi.net

Web Original (http://guimi.net/)

Esta página está optimizada para todos los navegadores ;)

Esta página ha sido realizada utilizando CMSXP

Valid HTML 4.01!

Estadísticas