Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Firewall Gateway Router DHCP Proxy Web Pop3
Firewall Gateway Router DHCP Proxy Web Pop3
El objetivo de esta guía es montar un servidor que haga las funciones de: firewall + router + gateway + dhcp server
y proxy transparente de WEB y POP3 (con revisión de antivirus y spam) entre una red de área local y una red con
salida a internet.
La distro utilizada para estas pruebas fue la Debian Etch 4.0 (mi preferida). Probablemente se pueda adaptar sin
mucho problema a otras distros de Linux.
Las ubicaciones de los archivos tratados en este documento pueden variar dependiendo de la distro y versión que
tenga.
El procedimiento del montaje descrito en esta guía se hizo con base en mi necesidad específica. De acuerdo con su
necesidad particular, puede que necesite llevar a cabo pasos adicionales/diferentes que los citados en este
documento.
Esta guía se ha elaborado tomando como base diversa documentación obtenida en Internet en conjunto con partes
personalizadas a mi gusto.
Todos los comandos ejecutados desde la consola deben llevarse a cabo como usuario root.
Para cualquier script elaborado en este documento recordar que debe tener los permisos de ejecución para que pueda
servir, p.ej: chmod +x script.sh
1
ÍNDICE GENERAL
2
SECCIÓN 1. Instalación del servidor DHCP, SSH y bind9
Instalamos el servicio:
La instalación de este servicio es únicamente para poder brindar salida a internet a las máquinas cliente de la red de
área local. Configurar adecuadamente un servidor DNS no está en el alcance de este documento.
OJO: al final de la instalación el servidor dhcp3-server intentará correr; sin embargo lo más probable es que muestre un
error. No preocuparnos por esto, ya que tenemos que configurar el servidor dhcp3.
El archivo de configuración a editar es /etc/dhcp3/dhcpd.conf y a continuación muestro el contenido sin las líneas
comentadas no importantes para no hacerlo largo:
3
# Si el servidor es el oficial DHCP para la red activar la siguiente directiva:
authoritative;
# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;
Si usted desea asignar una IP fija a una computadora específica puede agregar lo siguiente al archivo de configuración
/etc/dhcp3/dhcpd.conf:
# Asignación de una ip fija a una computadora concreta (se pueden poner tantas como se quiera)
host pcfija {
# Dirección MAC de la tarjeta de red.
hardware ethernet 00:D0:59:32:AF:6B;
# IP asignada
fixed-address 192.168.0.101; # esta direccion NO puede estar en el rango declarado arriba
}
La dirección MAC de la tarjeta de red se puede obtener con el comando "ifconfig" en linux o "ipconfig
/all" en dos/windows.
# /etc/init.d/dhcp3-server restart
4
1.3 Instalación del servicio ssh
Ahora vamos a instalar el servicio ssh para loggearnos al servidor remotamente vía consola:
Vamos a reducir el tiempo de login y en caso de quererlo así no permitiremos conexiones de root. Para esto editaremos
únicamente las siguientes líneas en el archivo /etc/ssh/sshd_config:
LoginGraceTime 45
PermitRootLogin no # esto es si no queremos que nadie se conecte como root remotamente
Ahora, sólo permitiremos acceder por ssh a los usuarios indicados explícitamente en el archivo /etc/loginusers. Para
esto, las siguientes líneas del archivo /etc/pam.d/ssh deben quedar así:
Creamos el archivo /etc/loginusers (# echo pish > /etc/loginusers) con el siguiente contenido:
pish
# /etc/init.d/ssh restart
5
SECCIÓN 2. Instalación del proxy transparente para WEB
Procederemos a instalar el proxy transparente para la web. Para este fin, instalaremos el paquete squid:
OJO: después de la instalación lo más probable es que squid no levante y muestre un error. Al igual que el caso con el
servidor DHCP, no preocuparnos ya que esto es porque necesitamos configurar a squid.
Antes de editar el archivo de configuración de squid: /etc/squid/squid.conf hagamos un respaldo de este archivo (por
simple prevención). A continuación se muestra el contenido del archivo /etc/squid/squid.conf más básico. Las líneas
comentadas no importantes se han removido, las que sí se muestren son extras para nuestro proxy: (asumimos los
parámetros de red ya citados)
6
refresh_pattern . 0 20% 4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
# maximum_object_size 36864 KB # tamano maximo de archivo a cachear
# cache_dir ufs /var/spool/squid 25000 16 256 # 10GB en 16 niveles con 256 subniveles
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
7
http_access deny all
http_reply_access allow all
icp_access allow all
visible_hostname localhost
cache_effective_group proxy
coredump_dir /var/spool/squid
# /etc/init.d/squid restart
Para poner en acción el filtrado de la web y prohibir las visitas a ciertas páginas, utilizaremos el squidGuard, el cual
utiliza listas negras (“blacklists”) para identificar explícitamente los sitios que vamos a bloquear. Para instalarlo
ejecutamos:
Una vez instalado debemos decirle al squid que utilice a squidGuard para los fines del filtrado web. Para eso hay que
agregar estas líneas al final del archivo /etc/squid/squid.conf:
Antes de continuar con el paso siguiente, me gustaría detenerme un momento a hablar de las listas negras. Las listas
negras son archivos de texto plano con los sitios que explícitamente se quieren prohibir. Por ejemplo, el contenido de un
archivo de lista negra puede ser el siguiente: (los sitios son inventados para evitar cualquier problema)
sitioinventado.com
otrositioinventado.com
otromasinventado.com
Seguidamente se debe convertir el archivo plano de la lista negra en un archivo de base de datos Berkeley (.db) que es
8
el formato que utilizará squidGuard para agilizar las búsquedas de sitios a prohibir. No se preocupe por buscar o instalar
el motor de base de datos Berkeley ya que la instalación limpia y fresca de Debian Etch ya la incluye en los paquetes
predeterminados del sistema.
Bien, hasta este momento todo esto suena muy tedioso y difícil de hacer. Afortunadamente existen “blacklists”
completísimas listas para bajar. Entre las más populares no comerciales están las de shalla y MESD, ambas indicadas
en la página de squidGuard. Yo recomiendo que usted visite los sitios de ambas listas negras para que lea los términos y
las condiciones de uso de cualquiera de ellas. Viendo el contenido de ambas, me quedo con la de shalla porque es
mucho más completa.
Adicionalmente, mostraré un script que automatiza el trabajo de descargar y configurar para su uso las listas negras de
shalla además de reiniciar el servicio squid para que los cambios entren en vigencia. Por lo tanto la única tarea que le
tocará a usted será editar el archivo de configuración de squidGuard a su gusto.
Para editar el archivo de configuración de squidGuard, cabe destacar que estas listas negras están clasificadas en
carpetas según su fin; por ejemplo, en las listas de shalla podremos ver carpetas como: aggressive, gamble,
hacking, porn, entre muchas otras. Cada una de las carpetas contiene los archivos domains y urls que son archivos
de texto plano con los sitios a prohibir (tal y como se mencionó con anterioridad).
Usted deberá escoger cuáles de esas clasificaciones de listas negras va a utilizar, supeditado obviamente a las
clasificaciones disponibles de la lista negra descargada. No es obligatorio que las utilice todas. Para esta guía yo escogí
(a manera de ejemplo) utilizar solamente las siguientes clasificaciones: hacking, adv, aggressive, drugs, gamble,
spyware y violence.
Con base en las clasificaciones que usted vaya a utilizar, así deberá indicarlo en el archivo de configuración
/etc/squid/squidGuard.conf. El siguiente es el archivo de configuración según lo que yo escogí:
#----------------------------------------------------------------
# SquidGuard CONFIGURATION FILE
#----------------------------------------------------------------
# DIRECTORIOS DE CONFIGURACION
dbhome /var/lib/squidguard/db
logdir /var/log/squid
# GRUPOS DE DIRECCIONES
dest hacking {
domainlist hacking/domains
9
urllist hacking/urls
}
dest adv {
domainlist adv/domains
urllist adv/urls
# la publicidad es reemplazada por una imagen vacia
redirect http://127.0.0.1/nulbanner.png
}
dest aggressive {
domainlist aggressive/domains
urllist aggressive/urls
}
dest drugs {
domainlist drugs/domains
urllist drugs/urls
}
dest gamble {
domainlist gamble/domains
urllist gamble/urls
}
dest spyware {
domainlist spyware/domains
urllist spyware/urls
}
dest violence {
domainlist violence/domains
urllist violence/urls
}
# CONTROL DE ACCESO
acl {
# por defecto bloqueamos los grupos de direcciones creados
default {
pass !hacking !adv !aggressive !drugs !gamble !spyware !violence all
# redireccionamos a una pagina web disuasoria
redirect http://127.0.0.1/prohibit.html
}
}
Como pudo observar, este archivo de configuración es muy básico y fácil de entender. El símbolo ! significa NO o NOT. Y
también usted puede redireccionar a una página construida por usted (prohibit.html) para mostrar el mensaje de
10
prohibición de acceso al sitio solicitado. Esta es una configuración muy básica; usted podrá investigar más y se
encontrará con muchas opciones adicionales que se pueden incluir en este archivo de configuración.
A continuación muestro el contenido del script que automatiza la descarga y configuración de la lista negra de Shalla
además del reinicio del servicio squid. Si desea, usted puede programar este script para que se ejecute
automáticamente a cada cierto tiempo utilizando el comando “crontab”.
El script se llama shalla_update.sh y a como está programado debe alojarse en la carpeta /root. Si usted desea
ubicarlo en otra carpeta, entonces tendrá que modificar el código del script para que se ajuste a la nueva carpeta donde
lo vaya a ubicar.
Tome en consideración que este proceso demorará según la velocidad de su conexión a Internet y a la cantidad y tamaño
de clasificaciones que vaya a utilizar. Si durante este proceso ocurre un error, significa que hay un error en el archivo de
configuración de squidGuard.
NOTA: el script fue tomado del propio sitio de “blacklists” de shalla. No obstante, tuve que corregirlo porque tenía
algunos errores y para adaptarlo a mi necesidad específica.
##!/bin/sh
#
# squidGuard blacklists - download & install script
# download from Shalla's Blacklists @
# http://squidguard.shalla.de/Downloads/shallalist.tar.gz
#
# created by Steve Olive - oz.ollie(at)gmail.com
# ver 0.3 20070302 10:00 GMT+10
# Creative Commons Attribution-Share Alike 3.0 License
# http://creativecommons.org/licenses/by-sa/3.0/
#
# SCRIPT MODIFICADO POR PISH
#
cd /root
# download latest file - overwrite any existing file
wget -N http://squidguard.shalla.de/Downloads/shallalist.tar.gz -a /var/log/shalla.log
# removemos la carpeta temporal BL por aquello de las moscas
rm -Rf /root/BL
# extract blacklists
tar -zxf shallalist.tar.gz
# remove old databases
rm -Rf /var/lib/squidguard/db/*
11
# copy blacklists to db home
cp -R /root/BL/* /var/lib/squidguard/db
# se convierten las listas a formato Berkeley
squidGuard -C all -d
# se convierte al usuario proxy en propietario de la carpeta de las blacklists
chown -R proxy:proxy /var/lib/squidguard/db
# se reinicia el servicio squid
squid -k reconfigure
# se remueve la carpeta temporal BL
rm -Rf /root/BL
Si queremos, podemos reiniciar el squid con el siguiente comando (OJO: NO es necesario ya que el script
shalla_update.sh ya lo hace automáticamente):
# squid -k reconfigure
Comprobamos que aparecen los procesos SquidGuard, (el número de procesos es el definido en el archivo
/etc/squid.conf por la directiva redirect_children <numero>):
# ps -e | grep squidGuard
Comprobamos el log: (al final debe salir el mensaje “squidGuard ready for requests”)
#cat /var/log/squid/squidGuard.log
Tomando en cuenta el archivo de configuración de squidGuard que se muestra más arriba, no hay que olvidar crear la
página web prohibit.html y ubicarla en la raíz de su servidor web. También hay poner una imagen vacía
nullbanner.png para la prohibición de publicidad.
12
SECCIÓN 3. Instalación del proxy transparente para correo POP3
Los servicios a instalar en esta sección son: clamav (antivirus), spamassassin (chequeador de spam) y p3scan (proxy
transparente de correo POP3).
Antes de instalar el p3scan, vamos a instalar primeramente los servicios que va a utilizar: clamav y spamassassin.
Al finalizar la instalación de estos 2 servicios y del proxy p3scan, haremos que los usuarios creados por clamav,
spamassassin y p3scan pertenezcan entre sí a sus correspondientes grupos, para dar la impresión de que los usuarios de
estos 3 servicios pertenecen al mismo grupo. No obstante, veremos que los demonios de estos servicios utilizarán al
usuario clamav para la ejecución de sus demonios.
Vamos a instalar el antivirus que en especial lo va a usar el proxy de correo para escanear los correos entrantes por el
POP3. Sin embargo, este antivirus puede ser utilizado como cualquier otro antivirus, para escanear archivos, carpetas,
etc. Dicho esto, instalamos el paquete clamav:
OJO: puede que al final de la instalación del clamav ocurra un error indicando que no puede configurar el paquete por
problemas de dependencias aunque dichas dependencias acaban de ser descargadas. Esto es muy fácil de arreglar:
simplemente volver a ejecutar el comando # apt-get install clamav para reinstalarlo y reconfigurarlo de manera
automática.
Luego de instalado lo probamos analizando el archivo test de eicar, el cual es un archivo cuyo contenido es únicamente
una línea: (OJO: este virus es inofensivo, se ha hecho únicamente con el fin de probar los antivirus)
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
Para escanear hacemos lo siguiente (asumiendo que hemos creado el archivo con el virus eicar en /home/pish):
13
(OJO: tal vez el primer escaneo comience a tardarse mucho; esto significa que el clamav está actualizando sus
definiciones de virus antes de ejecutar el escaneo. Si el escaneo devuelve un error indicando que no pudo bloquear la
carpeta de base de datos de clamav: /var/lib/clamav simplemente ignorar este error y volver a ejecutar el escaneo).
Y el resultado puede decir algo así (tomando en cuenta que el archivo de prueba eicar se llame archivoeicar.txt):
Luego editamos las siguientes líneas en el archivo /etc/default/spampd para que el spampd utilice el mismo usuario
del antivirus (clamav):
USERID=clamav
GRPID=clamav
ENABLED=1
14
Configuramos el SpamAssassin editando las siguientes líneas en el archivo /etc/spamassassin/local.cf para que
queden así:
rewrite_header Subject *****SPAM*****
report_safe 1
required_score 3.0
use_bayes 1
bayes_auto_learn 1
Preparamos un script para que mantenga las reglas del SpamAssassin actualizadas (vía Internet). El script puede alojarse
en la carpeta personal del root (/root) y se puede llamar actualiza_sa.sh:
#!/bin/bash
#
# Script para actualizar las reglas de SpamAssassin
15
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
Si queremos, podemos reiniciar los servicios del spamassassin con el siguiente comando (OJO: NO es necesario ya que el
script actualiza_sa.sh ya lo hace automáticamente):
# /etc/init.d/spamassassin restart
# /etc/init.d/spampd restart
Una vez que el script está creado, si quisiéramos automatizarlo, programamos el sistema para que actualice al menos
una vez a la semana:
# crontab -e
Y digitar lo siguiente:
#m h dom mon dow command (hagase el primer dia de cada semana a las 5am)
00 05 * * 1 /root/actualiza-sa.sh
16
Ahora instalaremos el otro proxy, el de correo POP3. Se instala el paquete p3scan con el siguiente comando:
OJO: al final de la instalación puede darse un error. No preocuparnos ya que tenemos que configurar a p3scan.
Una vez instalado configuramos las siguientes líneas del archivo /etc/p3scan/p3scan.conf para que queden así:
pidfile = /var/run/p3scan/p3scan.pid
maxchilds = 10
ip = 0.0.0.0
port = 8110
targetip = 0.0.0.0
targetport = 8110
user = clamav
notifydir = /var/spool/p3scan/notify
virusdir = /var/spool/p3scan
scannertype = basic
scanner = /usr/bin/clamscan --no-summary
virusregexp = .*: (.*) FOUND
demime
checkspam
spamcheck = /usr/bin/spamc
subject = [Virus Encontrado] Un mensaje enviado para usted contenia virus:
Como hemos podido observar en la línea que dice user = clamav, significa que cada vez que el demonio de p3scan se
ejecute lo hará por medio del usuario clamav (que es el del antivirus).
Finalmente, hacemos que los usuarios creados por clamav, spamassassin y p3scan pertenezcan entre sí a sus
correspondientes grupos, aunque en la realidad sólo utilizaremos al usuario clamav. Editamos el archivo /etc/group y
buscamos las siguientes líneas (que seguramente estarán al final del archivo) para que queden de la siguiente manera:
(GID es el group-id asignado por linux, el cual NO se cambia)
clamav:x:GID:spampd,p3scan
spampd:x:GID:clamav,p3scan
17
p3scan:x:GID:clamav,spampd
Convertimos al usuario clamav en el propietario de las carpetas del p3scan y reiniciamos los servicios:
18
SECCIÓN 4. Configuración del Firewall como Gateway y Router (iptables)
Una vez que ya tenemos todos los servicios activados, vamos a proceder con la configuración del firewall-gateway-router.
Esto lo llevaremos a cabo con el comando iptables. Para cumplir con este objetivo vamos a mostrar un script que hace
todo esto por nosotros generado por un robot muy útil. Más adelante indicaré cómo y dónde ubicarlo para que se active
de manera automática.
A continuación mostraré el contenido del script sin las líneas comentadas no importantes. Ponga especial atención en
las líneas de redirección del proxy transparente de web y de POP3. El script debe llamarse iprules.sh
#!/bin/sh
#
###############################################################################
#
# Local Settings
#
IPT="/sbin/iptables"
# Internet Interface
INET_IFACE="eth0"
INET_ADDRESS="192.168.1.2"
# Localhost Interface
19
LO_IFACE="lo"
LO_IP="127.0.0.1"
###############################################################################
#
# Load Modules
#
# You should uncomment the line below and run it the first time just to
# ensure all kernel module dependencies are OK. There is no need to run
# every time, however.
# /sbin/depmod -a
# Unless you have kernel module auto-loading disabled, you should not
# need to manually load each of these modules. Other than ip_tables,
# ip_conntrack, and some of the optional modules, I've left these
# commented by default. Uncomment if you have any problems or if
# you have disabled module autoload. Note that some modules must
# be loaded by another kernel module.
20
# This is used to limit the number of packets per sec/min/hr
# /sbin/modprobe ipt_limit
###############################################################################
#
21
# Kernel Parameter Configuration
#
###############################################################################
#
# Flush Any Existing Rules or Chains
#
22
echo "Limpiando reglas ..."
if [ "$1" = "stop" ]
then
echo "Firewall limpio..."
exit 0
fi
###############################################################################
#
# Rules Configuration
#
###############################################################################
#
# Filter Table
#
###############################################################################
# Set Policies
23
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
###############################################################################
#
# User-Specified Chains
#
# Create user chains to reduce the number of rules each packet
# must traverse.
$IPT -N bad_packets
$IPT -N bad_tcp_packets
$IPT -N icmp_packets
24
###############################################################################
#
# Populate User Chains
#
# bad_packets chain
#
# Drop INVALID packets immediately
# bad_tcp_packets chain
#
# All tcp packets will traverse this chain.
# Every new connection attempt should begin with
# a syn packet. If it doesn't, it is likely a
# port scan. This drops packets in state
# NEW that are not flagged as syn packets.
25
# rule below. It will keep those packets from being logged.
# There are a lot of them.
# $IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE ! --syn -m state \
# --state NEW -j DROP
# icmp_packets chain
#
# This chain is for inbound (from the Internet) icmp packets only.
# Type 8 (Echo Request) is not accepted by default
# Enable it if you want remote hosts to be able to reach you.
# 11 (Time Exceeded) is the only one accepted
# that would not already be covered by the established
# connection rule. Applied to INPUT on the external interface.
#
# See: http://www.ee.siue.edu/~rwalden/networking/icmp.html
# for more info on ICMP types.
#
# Note that the stateful settings allow replies to ICMP packets.
# These rules allow new packets of the specified types.
# Time Exceeded
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
26
# udp_inbound chain
#
# This chain describes the inbound UDP packets it will accept.
# It's applied to INPUT on the external or Internet interface.
# Note that the stateful settings allow replies.
# These rules are for new requests.
# It drops netbios packets (windows) immediately without logging.
# udp_outbound chain
#
# This chain is used with a private network to prevent forwarding for
# UDP requests on specific protocols. Applied to the FORWARD rule from
# the internal network. Ends with an ACCEPT
# No match, so ACCEPT
$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT
27
# tcp_inbound chain
#
# This chain is used to allow inbound connections to the
# system/gateway. Use with care. It defaults to none.
# It's applied on INPUT from the external or Internet interface.
# Web Server
# HTTP
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT
# tcp_outbound chain
#
# This chain is used with a private network to prevent forwarding for
# requests on specific protocols. Applied to the FORWARD rule from
# the internal network. Ends with an ACCEPT
# Block IRC
28
$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 194 -j REJECT
# AIM
$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 5190 -j REJECT
# AIM Images
$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 4443 -j REJECT
# MSN Messenger
$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 1863 -j REJECT
# No match, so ACCEPT
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT
###############################################################################
#
# INPUT Chain
#
29
# Inbound Internet Packet Rules
###############################################################################
#
# FORWARD Chain
#
# If not blocked, accept any other packets from the internal interface
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT
30
# Deal with responses from the internet
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED \
-j ACCEPT
###############################################################################
#
# OUTPUT Chain
#
# Localhost
$IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT
# To internal network
$IPT -A OUTPUT -p ALL -s $LOCAL_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LOCAL_IFACE -j ACCEPT
# To internet
$IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT
###############################################################################
#
# nat table
31
#
###############################################################################
###############################################################################
#
# PREROUTING chain
#
# This is a sample that will exempt a specific host from the transparent proxy
#$IPT -t nat -A PREROUTING -p tcp -s 192.168.1.50 --destination-port 80 \
# -j RETURN
#$IPT -t nat -A PREROUTING -p tcp -s 192.168.1.50 --destination-port 443 \
# -j RETURN
###############################################################################
#
# POSTROUTING chain
#
32
###############################################################################
#
# mangle table
#
###############################################################################
# The mangle table is used to alter packets. It can alter or mangle them in
# several ways. For the purposes of this generator, we only use its ability
# to alter the TTL in packets. However, it can be used to set netfilter
# mark values on specific packets. Those marks could then be used in another
# table like filter, to limit activities associated with a specific host, for
# instance. The TOS target can be used to set the Type of Service field in
# the IP header. Note that the TTL target might not be included in the
# distribution on your system. If it is not and you require it, you will
# have to add it. That may require that you build from source.
Además tenemos el script que limpia todo el firewall-gateway-router y lo inactiva: (debe llamarse ipflush.sh)
#!/bin/bash
#
#
# Binario de iptables
IPT=/sbin/iptables
33
$IPT -t mangle -F
Finalmente tendremos el script principal parametrizado que limpia o levanta las reglas de iptables llamando a
iprules.sh o a ipflush.sh según sea el parámetro que le indiquemos. En mi caso yo lo llamé myiptables y se invoca
de la siguiente forma:
#! /bin/sh
#
#
case "$1" in
start|reload)
echo -n "Cargando reglas de iptables... "
/etc/network/iptables/iprules.sh
rc=$?
[ $rc = 0 ] && echo [OK] || echo [ERROR]
;;
stop)
echo -n "Anulando iptables... "
### Esta opcion anula el FW totalmente
### como si nunca se hubiese instalado
/etc/network/iptables/ipflush.sh
rc=$?
[ $rc = 0 ] && echo [OK] || echo [ERROR]
;;
34
restart)
sh $0 stop
sleep 2
sh $0 start
;;
*)
echo "Uso:`basename $0` {start|stop|restart|reload}"
exit 1
;;
esac
exit 0
Ahora configuramos la red para que se activen o desactiven las reglas de iptables cuando se levante o tumbe la tarjeta
de red que está conectada al Internet. El archivo a editar es /etc/network/interfaces:
(...)
### Interfaz EXTERNA
iface eth0 inet static
(...)
pre-up /etc/network/iptables/myiptables start
post-down /etc/network/iptables/myiptables stop
En este momento podemos reiniciar el servicio networking para que comience a funcionar todo esto:
# /etc/init.d/networking restart
35