Arxius

Com usar el millor firewall de GNU/Linux: NETFILTER/IPTABLES (1)

Escrit al 2005-01-06 00:00:00 per whats_up

En aquest article s'explica com utilitzar l'iptables d'una manera pràcticament pràctica :P. Està ple d'exemples per tal que s'aprengui provant les diferents comandes que hi apareixen.

L'objectiu de l'article és servir de referència, i que un cop llegit, sigui inmediat el fet d'utilitzar aquesta magnífica eina que es troba en els nuclis linux.

Si l'article té èxit, en faré un segon ampliant el contingut d'aquest primer.

Els kernels linux des de fa força temps incorporen un molt bon gestor de paquets, el qual podem usar com a firewall. Aquest gestor va canviar al passar de la branca 2.2.x a la 2.4.x, va passar de dir-se ipchains a dir-se iptables. A part de canviar-se el nom, també va canviar la nomenclatura de les comandes per configurar-lo (entre altres coses :P).

Aquest article intento explicar com funciona i com es configura a un nivell força bàsic i pràctic. Em baso amb el kernel 2.6.x, tot i que tot el què diré aquí també funcionarà en els 2.4.x. Intento simplificar la realitat per tal de donar un ús pràctic a l'iptables a tota aquella gent que va perduda en el tema.

Comencem!



Una mica de teoria

Quan un paquet arriba a la nostra màquina, aquest ha de passar per una sèrie de “capes” fins arribar al seu destí.

Depenent de les accions que volem fer, classifiquem les diferents capes en taules. Les taules que estan creades per defecte són 3: filter, nat i mangle.
- filter és la taula per defecte
- nat és la taula de tots els paquets que creen una nova connexió
- mangle és una taula destinada a la modificació del contingut de paquets

A cada “capa” es poden fer unes quantes accions amb els paquets: es pot acceptar i permetre que el paquet continuï el seu camí, es pot denegar, enrutar cap a una altre xarxa, modificar, redirigir, etc...

Veiem un exemple del camí que segueixen els paquets.
Suposem que ens estan intentant establir una connexió ssh al nostre pc, els passos que seguirien els paquets serien els següents:

-Al crear-se qualsevol connexió s'envien uns paquets, aquests paquets entrarien a la primera capa, que s'anomena PREROUTING, allà podríem fer algo amb ells. En cas que no establim res a fer-hi, s'aplicarà la política per defecte, que si no es canvia és acceptar-los.

-Després, un cop acceptats, passarien a estar a la “capa” INPUT, on també podríem acceptar-lo, denegar-lo, etc.., si no hi fem res, s'aplicarà la política per defecte, i el paquet arribarà a la seva destinació.

-Finalment els paquets arriben al dimoni sshd, i és ell qui se'n cuida de contestar-los.

-Tots els paquets enviats pel nostre servidor sshd passaran a la capa OUTPUT, on com a cada capa, tenim un gran feix de possibilitats.

-Ja per acabar, els paquets arriben a la capa POSTROUTING, on quan surtin d'ella, finalment deixaran el nostre sistema.

Les “capes” més utilitzades, són les següents:

-PREROUTING: Aquí arriben els paquets just quan es crea la connexió. És aquí on es decideix si el paquet serà per aquesta màquina, o l'hem de redirigir.

-INPUT: Aquí arriben els paquets que no han estat redirigits. És aquí on es sol especificar si tanquem o obrim algun port concret.

-OUTPUT: Aquí arriben els paquets que genera la nostre màquina. Si volguéssim que només es pogués navegar per pàgines web, afegiríem aquí una entrada.

-POSTROUTING: Aquí arriben els paquets que estan apunt de sortir de la màquina.

-FORWARD: Aquí arribaran els paquets que no són per la nostra màquina. Per exemple si estem fent de routers, la majoria de paquets que ens arribaran no aniran destinats cap a nosaltres.

A la pràctica



Com sempre val més una imatge que mil paraules. Aquí intentaré posar els exemples més típics explicant què fan, amb un exemple del resultat aconseguit. Espero que això ajudi a entendre-ho millor.

La primera cosa que hem d'aprendre a fer és mirar com tenim les regles iptables.

Aquí llistem quines regles tenim a la taula, com podem veure no en tenim cap. L'opció -L és la que ens llista el contingut de la taula, l'opció -v ens amplia l'informació (ens diu els ports, les interfícies, etc.) i l'opció -n fa que no intenti fer una resolució inversa de les ip's.

root@laptop:/home/whats# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination



Si el què volem és llistar una taula (ex: la taula nat), l'únic que fem és afegir el -t nat :

root@laptop:/home/whats# iptables -L -v -n -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination


La segona cosa a aprendre és canviar la política per defecte. Per exemple podem canviar la política per defecte de tots els paquets que es creen en la nostre màquina i intenten sortir.

Afegim com a política per defecte bloquejar els paquets:

root@laptop:/home/whats# iptables -P OUTPUT DROP


Ara podem provar de fer un ping i veurem que no ens retorna res:

root@laptop:/home/whats# ping -c 3 www.wekk.net
PING salles.mine.nu (81.36.105.12): 56 data bytes

--- salles.mine.nu ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss


No ens ha retornat res perquè els nostres paquets no han arribat a sortir. Ara podem llistar com tenim la cosa i veurem que s'han bloquejat 3 paquets a la “capa” OUTPUT:

root@laptop:/home/whats# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy DROP 3 packets, 252 bytes)
pkts bytes target prot opt in out source destination


Per tornar a deixar la política per defecte a acceptar-ho tot podem fer:

root@laptop:/home/whats# iptables -P OUTPUT ACCEPT
root@laptop:/home/whats# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 3 packets, 252 bytes)
pkts bytes target prot opt in out source destination


Si volem “netejar” les estadístiques dels paquets acceptats, denegats, etc, podem executar iptables -Z, que el què fa és posar a zero tots els comptadors.

root@laptop:/home/whats# iptables -Z

root@laptop:/home/whats# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination


Si el què volem netejar són les regles d'una taula que hem anat entrant haurem d'executar:

root@laptop:/home/whats# iptables -t filter -F


On filter és la taula a buidar.

Ara que ja hem començat a veure de que va la cosa, comencem a tocar les opcions més interessants :). Suposem que tenim un servidor de pàgines web a la nostre màquina, i que la volem protegir molt a través del firewall, faríem el següent:

Posaríem que la política per defecte de tots els paquets d'entrada es deneguin:

root@laptop:/home/whats# iptables -P INPUT DROP


Un cop fet això si intentem navegar o fer qualsevol cosa, veurem que no podem fer-ho perquè totes les respostes a les nostres peticions no ens arriben al haver fet que tots els paquets que ens entren a la màquina es bloquegin.
Per evitar això podem entrar una regla que accepti tots els paquets que no siguin per crear una connexió, per tan així aconseguirem que les connexions que iniciem nosaltres funcionin i les que iniciïn les altres persones cap a nosaltres, seran denegades.
Si ho volem fer podem executar:

root@laptop:/home/whats# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


El què fem en aquesta comanda, és usar opcions que es troben dins d'un mòdul de l'iptables. Concretament el mòdul és l'state, i estem passant les opcions –state ESTABLISHED i RELATED. Diem que tots aquests paquets els accepti.

Si ara volem que la gent pugui accedir al nostre servidor web, haurem d'obrir el port 80 (també obriríem el 443 si usem ssl) què és el que correspon als servidors web.

L'opció -p és imprescindible si volem dir el port a obrir, ja que haurem d'especificar a quin protocol pertany el port que volem obrir. En el nostre cas és el protocol tcp

root@laptop:/home/whats# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
root@laptop:/home/whats# iptables -L -v -n
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination


Una cosa que ens interessarà fer si tenim un linux com a router, és que faci nat cap a ip's de dintre la xarxa. Fer-ho amb l'iptables és molt senzill, només cal executar la següent comanda per a redirigir el trafic del port 80 cap a la màquina local 192.168.0.111

root@laptop:/home/whats# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.0.111:80


Una altre cosa interessant pot ser denegar tots els paquets del protocol icmp per tal de que no es pugui saber l'estat de la nostre màquina. Si ho fem, entre altres coses la nostre màquina deixarà de retornar el ping.

root@laptop:/home/whats# iptables -A INPUT -p icmp -j DROP


Per a poder fer que la nostre màquina enruti totes les peticions de la xarxa local(192.168.1.0/24) a través de la nostre connexió per modem (ppp0), podem executar el següent.

root@laptop:/home/whats# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE


Un cop fet això només ens caldrà activar el reenviament de paquets del nucli. Ho podem fer fent “echo 1 > /proc/sys/net/ipv4/ip_forward”

Per a estar informat sobre les connexions que fa una determinada ip a la nostre màquina, podríem fer el següent:

root@laptop:/home/whats# iptables -p tcp -s 64.4.21.221 -j LOG


Un cop executada la comanda, podrem veure els logs juntament amb els logs del kernel. Per exemple en debian woody estan a /var/log/kern.log

Una cosa força útil quan deneguem tot el tràfic entrant a la nostre màquina, és afegir una regla que accepti tot el tràfic que entri per la interfície loopback, per tal de fer que les aplicacions locals tinguin accés a tots els serveis. Per fer-ho és suficient executar:

root@laptop:/home/whats# iptables -A INPUT -i lo -j ACCEPT


Amb totes aquestes cosetes que ja sabem, ara podem passar a fer coses més interessants com seria acceptar tot el tràfic que prové de la nostra màquina i que va destinat cap al port 441 udp entrant per l'interfície eth0

root@laptop:/home/whats# iptables -A INPUT -i eth0 -p udp -s www.wekk.net –dport 441 -j ACCEPT


Altres



Algunes coses interessants a comentar:

-Quan activeu una política restrictiva en el vostre firewall, tots els detectors d'escanejos tipus scanlogd, courtney, etc, deixen de funcionar ja que a partir d'ara només rebran els intents de connexió dels ports que hem deixat oberts.
Si esteu interessats en seguir estant informats de la gent que us escaneja la màquina, podeu instal·lar-vos el programa psad http://www.cipherdyne.com/psad/ el qual el què fa és analitzar tots els logs de l'iptables en busca de connexions iniciades i tallades ràpidament, o connexions que no acaben de crear-se entre altres coses.

-Una lectura molt recomanada és el manual 8 de l'iptables. Podeu fer-ho executant:

whats@laptop:~$ man 8 iptables


-Un enllaç també molt recomanable per aconseguir molta informació sobre l'iptables, és la pàgina oficial: http://www.netfilter.org

-Per tal de fer efectius els canvis cada vegada que iniciem la màquina podem executar la següent comanda:
Debian:

/etc/init.d/iptables save active

Redhad/Fedora

/etc/init.d/iptables save


Un cop fet això, ens haurem d'assegurar que cada vegada que s'inicia el sistema s'executa l'script. Executarem el següent:
Debian:

update-rc.d iptables defaults

Redhat/Fedora:

chkconfig iptables on

Categories: Articles, Servidor


Comentaris

  • Re: Com usar el millor firewal Només volia felicitarte per el article, es concis, i sobretot útil, si fas una segona part no dubtare en llegirmela. Jo personalment, a tot aquell que vulgui fer servir iptables recomano creac un script, aixi es mes facil cambiar coses com interfices o regles. Felicitats altre vegada.

    Escrit al 2006-12-28 23:35:20 per Anònim

Arxius