Inici de sessió d'usuari


IPTABLES


Configuració de IPTABLES

OBJECTIU:

Configurar un servidor Linux per donar accés a Internet amb les portes controlades per evitar p2p i abusos.

Maquinari:

Servidor Linux (en el meu cas Fedora) amb un kernel 2.4 o superior i dues ethernet com a minim.

Introducció a IPTABLES:

El que coneixem com IPTABLES no es mes que un modol desenvolupat per netfilter que està compilat amb el kernel de Linux i la seva funció es transportar paquets a través dels diferents interficies del servidor.

Per entendre correctament el funcionament de IPTABLES ens hem d'oblidar dels interficies, en principi només hem de pensar que els paquets "passen" pel servidor, per tant qualsevol regla que apliquem pot afectar a totes les interficies a no ser que ho especifiquem.

IPTABLES es un servei que funciona dins del kernel de linux, per tant no el podem parar ni engegar, tot el que podem fer es passar-li uns valors per controlar què volem que faci.

Dins de IPTABLES es diferencien tres grups de paquets que s'identifiquen amb tres taules predeterminades:

  1. INPUT son els paquets que van dirigits a una IP del servidor.
  2. OUTPUT son els paquets que tenen origen al servidor.
  3. FORWARD son els paquets que només passen pel servidor, es a dir, tant l'origen com el destí no son el propi servidor.

Es poden crear mes taules per tal d'organitzar millor el funcionament del filtre. En principi només hi ha dues solucions possibles (tags) al filtre ACCEPT i DROP, però iptables permet la creació de modols que permeten fer mes coses, molts d'aquests modols ja venen implementats per defecte, altres s'han d'instalar i inclús es podria arrivar a fer un modol a mida.
Es pot trobar una explicació dels mòduls que hi ha en aquest enllaç.

ACCEPT es quan es compleix la condició i permetem que el paquet travessi el firewall.
DROP es quan es compleix la condició i es denega el pas a través del firewall.

Les condicions es van evalunat correlativament de la primera a la última en l'ordre que han estat escrites fins que s'en compleix una, llavors s'executa la acció corresponent i ja no s'evalua cap mes condició, per tant és molt important l'ordre de les condicions.

Per passar les condicions al iptables es fa amb un script de shell, que podem executar manualmnet i es recomana posar-lo als fitxers d'arranc, hi ha distribucions que tenen la opció de fer un "save" i llavors l'iptables es guarda la taula de filtres, però altres no disposen d'aquesta funció i només cal posar una línia al fitxer /etc/rc.d/rc.local que cridi l'script per tal que si es reinicia el servidor es torni a aplicar la configuració automàticament.

Construcció del script:

Les primeres línies del script han de servir per esborrar qualsevol altra configuració que hi pugui haver

#!/bin/sh
## Esborrat de configuració
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

També és interesant declarar una variable per identificar els interficies, si alguna vegada es canvien serà molt mes fàcil de canviar.

## Declaracio de variables
EXTIF="eth1" ## Ethernet connectada a Internet (router ADSL)
INTIF="eth0" ## Ethernet connectada a la xarxa local (guifi en el nostre cas)

Carreguem uns modols que permeten relacionar els paquets d'una comunicació ftp amb el que ha originat la connexió.
Això és necessari perquè una comunicació ftp sempre comença per la porta 21, si es activa continua per la porta 20 però si és passiva, el servidor i el client es diuen per quina porta es comunicaràn, els modols següents detecten tot això i perneten posar regles que permetin la comunicació ftp encara que vagi per portes denegades.

## Carrega els modols perque funcioni FTP
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

Assigem el valor predeterminat, aquest es el valor de la acció que es dura a terme si el paquet no compleix cap condició.
Es pot posar ACCEPT o DROP, en el nostre cas posarem ACCEPT per evitarnos problemes, ja que la opció DROP d'entrada ho denega tot i ens obliga a declarar totes les possibilitats que volem controlar, un expert faria servir DROP pero es necesita un molt bon coneixement del sistema.

## Establim la politica per defecte
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

La primera regla servira per deixar passar tots els paquets que corresponen a una comunicacio ja establerta.

## Comencem a aplicar regles
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#Permetem l'acces al servidor des de internet a les seguents portes, hi podem posar les que necessitem.

# Obrim el port 25
iptables -A INPUT -s 0.0.0.0/0 -p tcp -i $EXTIF --dport 25 -j ACCEPT

# I tanquem tots els ports per sota del 1024 perque no ens puguin entrar per cap servei desconegut.

# Aquestes linies no farien falta si la politica per defecte fos DROP
iptables -A INPUT -s 0.0.0.0/0 -p tcp -i $EXTIF --dport 1:1024 -j DROP
iptables -A INPUT -s 0.0.0.0/0 -p udp -i $EXTIF --dport 1:1024 -j DROP

## Declarem els ports que volem que els usuaris puguin fer servir directament cap a Internet
# Acceptem que vagin al port 80
iptables -A FORWARD -s 10.138.0.0/16 -i $INTIF$ -p tcp --dport 80 -j ACCEPT

Amb aquesta linia permentem que qualsevol usuari que tingui una IP 10.138.x.x pugui utilitzar la porta 80 contra altres servidors de Internet

# Deneguem la resta.

iptables -A FORWARD -s 10.138.0.0/16 -i $INTIF$ -j DROP

## Ja nomes ens queda enmascarar la xarxa local, es a dir, fer NAT perque els usuaris puguin sortir a Internet
iptables -t nat -A POSTROUTING -s 10.138.0.0/16 -o $EXTIF -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

Fins aqui tindriem un firewall que ens permeteria controlar que poden fer els nostres usuaris a Internet i a quins serveis es pot accedir desde Internet, ara cal complicar-ho una mica mes.
Si volem redirigir una porta a una estació interna, per exemple Terminal Server ho farem de la seguent manera:

iptables -t nat -A PREROUTING -i $EXTIF -p tcp --dport 3389 -j DNAT --to x.x.x.x:3389

on x.x.x.x es la IP de la estació que te el servei

Per obligar que tothom surti a Internet passant pel proxy:

## Redirecció del port 80 cap al 3128 squid (tothom passa per proxy)
iptables -t nat -A PREROUTING -p tcp -d ! x.x.x.x -i $INTIF --dport 80 -j REDIRECT --to-port 3128
# Perque funcioni be squid s'han de posar les seguents linies a squid.conf
# httpd_accel_host virtual
# httpd_accel_port 80
# httpd_accel_single_host off
# httpd_accel_with_proxy on
# httpd_accel_users_host_header on
# ie_refresh on

On x.x.x.x és la IP del propi servidor, només és necessari especificar-lo si el mateix servidor té un servidor web que l'han de poder consultar usuaris que no tenen dret a utilitzar el proxy.
Fixeu-vos que la IP va precedida de !, això inverteix la regla, es a dir que no vagi dirigit a x.x.x.x

Per poder fer registres de la activitat del firewall s'ha d'executar la funcio LOG, es pot posar com a resultat d'una condicio però aquesta funció no farà que es deixin de revisar mes regles, per exemple:

iptables -A FORWARD -s x.x.x.x -j LOG -log-prefix Descripcio

ens entrarà una linia al fitxer /var/log/messages per cada paquet que circuli pel firewall que vingui de la IP x.x.x.x i l'identificarà amb Descripcio i es continuaran evaluant les següents regles.

Es recomanable fer una nova taula per tal de registrar moviments, per exemple, per registrar tots els paquets denegats:

## Taula per fer el registre de DROPs
iptables -N LOGDROP
## Per activar el log s'ha de descomentar la seguent linia, el log es fa a /var/log/messages
iptables -A LOGDROP -j LOG --log-prefix Descartat
iptables -A LOGDROP -j DROP

Crea una taula nova que es diu LOGDROP.
Enregistra el paquet que es s'està evaluant.
Denega el pas del paquet.

Llavors a la linia que denega els paquets quedaria de la següent manera
iptables -A FORWARD -s 10.138.0.0/16 -i $INTIF -j LOGDROP

D'aquest manera podem dirigir el punter a una taula propia quan un paquet compleix una condició.

Altres funcions interessants

## Proteccio contra ping de la mort
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

D'aquesta manera només permetem que s'atengui un paquet ping cada segon.

## Avisa si es produeixen mes de 20 conexxions a la porta 25 per minut
Per fer això necessitem crear una taula que controli el registre
iptables -N SMTPLOG iptables -A SMTPLOG -m limit --limit 20/m -j RETURN
iptables -A SMTPLOG -j LOG --log-prefix "AbusSMTP "
iptables -A SMTPLOG -j RETURN

I en aquesta taula li passem tots els paquets que inicien una comunicació a la porta 25
iptables -A FORWARD -p tcp --dport 25 -m state --state NEW -j SMTPLOG

Funcionament:
Quan arriva un paquet dirigit a una porta 25 i es tracta d'una nova conexió (--state NEW) el passa a la taula SMTPLOG.
Si han passat menys de 20 paquets en un minut retorna el punter sense fer res.
Si s'ha sobrepassat el limit de 20 paquets per minut entra una linia al log i despres retorna el punter al lloc d'origen.

Fixeu-vos que he fet servir RETURN, això fa que el punter retorni a la linia segünt a la que ha cridat la taula.

També cal remarcar que aquesta funció no ACCEPTA ni REBUTJA cap paquet, només posa una linia al log si hi ha massa activitat.

Trobareu més informació del funcionament de -limit en aquest document.

Bibliografia web:

www.pello.info/filez/firewall/iptables.html
www.pello.info/filez/IPTABLES_en_21_segundos.html
www.brandonhutchinson.com/iptables_fw.html www.netfilter.org/documentation/HOWTO/es/packet-filtering-HOWTO-7.html www.tummy.com/journals/entries/jafo_20050717_164535
www.lanux.org.ar/spip/spip.php?article15
www.lanux.org.ar/spip/spip.php?article16

Joaquim Roca