Petit tallafocs amb Linux

8 Juny 2014
Josep Ma Solanes 4

Continuant el tema de l’entrada anterior sobre què és un tallafocs, en aquesta entrada proposo el muntatge d’un petit tallafocs amb Linux que ens pot salvar d’alguna castanya calenta a la nostra xarxa si no tenim un tallafocs a mà.

Es tracta de col·locar una màquina física o virtual entre l’encaminador (router) d’Internet i la xarxa local, a fi que tot el tràfic cap a Internet i des d’Internet passi per ell. D’aquesta manera es controla la publicació de ports des de fora cap a dins i de dins cap a fora.

Posar-se en situació

Per seguir un exemple real, recupero el muntatge de l’entrada anterior on es disposa d’un servidor de correu electrònic intern amb frontal web. És dóna per suposat que l’encaminador redirigeix tot el trànsit TCP i UDP a la IP externa del tallafocs (192.168.0.2/29). L’objectiu final de la configuració és tenir les següents regles:

  • Trànsit des d’Internet a la xarxa interna. (outside)
    • Accés al port TCP 443 (https) a la IP pública. Publicació del servei https (TCP 443) del servidor de correu electrònic (192.168.1.12).
    • Accés al port TCP 25 (smtp) a la IP pública. Publicació del servei smtp (TCP 25) del servidor de correu electrònic (192.168.1.12).
  • Trànsit des de la xarxa interna a Internet. (inside)
    • Bloqueig del protocol smtp (TCP 25) per a tots els equips de la xarxa interna (192.168.1.0/24, a excepció de la IP 192.168.1.12.
    • Accés del protocol smtp (TCP 25) a l’exterior pel servidor de correu electrònic (192.168.1.12). Per evitar spam d’algun troià.
    • Accés als ports web (TCP 80) i web segur (TCP 443) per tots els equips de la xarxa.
    • Accés als ports de DNS (TCP i UDP 53) i servidor de temps (UDP 123) pel controlador de domini (192.168.1.11).
    • Bloqueig de la resta de ports de serveis (TCP i UDP del 1 al 1024) per la resta d’equips.

 

Pels més avançats, al final de l’entrada, es desplega una zona desmilitaritzada.

  • Trànsit des d’Internet a la zona desmilitaritzada. (dmz)
    • Accés al port TCP 80 (http) a la IP pública. Publicació del servei http (TCP 80) del servidor web (192.168.2.11).
  • Trànsit des de la xarxa interna a la zona desmilitaritzada. (dmz)
    • Accés des de la xarxa interna a la IP 192.168.2.11 pels ports TCP 80 (http), TCP 22 (ssh).
  • Trànsit des de la zona desmilitaritzada a  Internet.
    • Bloqueig de tot el trànsit de sortida cap a Internet de la zona desmilitaritzada (192.168.2.0/27).

Xarxa interna connectada a Internet mitjançant un tallafocs que també controla una zona desmilitaritzada (DMZ).

Requeriments

Per aquest muntatge, com és obvi, es necessita una mica d’infraestructura. Aquesta infraestructura es pot muntar en un entorn virtual. En el meu cas, el laboratori funciona sobre Microsoft Hyper-V, sobre el propi equip de treball basat en Microsoft Windows 8.1. A nivell de xarxa, l’entorn virtual disposa de tres commutadors (switch) virtuals: xarxa pública, xarxa interna i zona desmilitaritzada. El tallafocs és una màquina virtual basada amb la distribució CentOs 6.5 (veure la guia de instal·lació) que té tres targetes de xarxa (xarxa pública, xarxa interna i zona desmilitaritzada). Com a tallafocs s’utilitza IPTABLES inclòs en el nucli del propi Linux.

En cas de no desplegar la zona desmilitaritzada, obviar la tercera targeta de xarxa.

Per fer correctament les proves és necessari disposar d’una màquina amb els ports a tractar engegada en cada xarxa (trànsit, interna i dmz). La xarxa local (no la interna, sinó la que tinc connectada actualment a Internet) es considera la xarxa de trànsit, que permet sortir a l’Internet real, la resta són commutadors interns, sense lligam amb l’exterior de l’entorn virtual, es consideren xarxes aïllades.

Som-hi, a configurar el tallafocs!

Primer que tot, per no tornar-nos bojos, comprovar que les targetes de xarxa estan connectades a les xarxes que corresponen (interna i trànsit) i disposen de les IPs correctes. Amb la instrucció ifconfig, s’esbrina aquesta informació:

[root@firewall ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:15:5D:75:21:13
 inet addr:192.168.0.2 Bcast:192.168.0.7 Mask:255.255.255.248
 inet6 addr: fe80::215:5dff:fe75:2113/64 Scope:Link
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
 RX packets:302 errors:0 dropped:0 overruns:0 frame:0
 TX packets:50 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000
 RX bytes:52745 (51.5 KiB) TX bytes:6826 (6.6 KiB)

eth1 Link encap:Ethernet HWaddr 00:15:5D:75:21:14
 inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
 inet6 addr: fe80::215:5dff:fe75:2114/64 Scope:Link
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
 RX packets:0 errors:0 dropped:0 overruns:0 frame:0
 TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000
 RX bytes:0 (0.0 b) TX bytes:636 (636.0 b)

lo Link encap:Local Loopback
 inet addr:127.0.0.1 Mask:255.0.0.0
 inet6 addr: ::1/128 Scope:Host
 UP LOOPBACK RUNNING MTU:16436 Metric:1
 RX packets:0 errors:0 dropped:0 overruns:0 frame:0
 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:0
 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

La interfície eth0 correspon a la pota de trànsit, l’externa. I que la eth1 correspon a la pota interna. Aquest punt és molt important, recomano llançar un ping a un equip de cada costat per comprovar la connexió abans de continuar.

En cas d’haver afegit la tercera pota, és possible que la interfície eth2 no figuri al llistat perquè encara no està configurada (comprovar-ho amb ifconfig -a o bé amb un ls /sys/class/net). La interfície lo correspon al propi equip, el loopback, i per tant no té efectes cap a l’exterior.

L’altre pas a donar abans d’entrar a configurar l’IPTABLES és permetre al Linux reenviar els paquets. Cal modificar del fitxer /etc/sysctl.conf el paràmetre net.ipv4.ip_forward per establir-lo a 1 (permetre):

net.ipv4.ip_forward = 1

En cas de voler fer-ho només mentre no es reinicia l’equip:

echo 1 > /proc/sys/net/ipv4/ip_forward

Per evitar problemes de configuració del tallafocs és una bona pràctica fer net de totes les possibles regles:

iptables --flush
iptables --delete-chain
iptables --zero
iptables --table nat --flush
iptables --table nat --delete-chain

Creació de les polítiques per defecte, que permeten el trànsit:

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables --table nat -P PREROUTING ACCEPT
iptables --table nat -P POSTROUTING ACCEPT

Guardar la configuració i reniciar el servei:

service iptables save
service iptables restart

Amb el que queda la configuració del tallafocs ben neta, però recordar que està tot permès. Llistar les polítiques del tallafocs:

iptables -L -n
iptables -L -n -t nat

Han d’aparèixer les regles en blanc, però amb el trànsit permès per defecte):

[root@firewall ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination


# També la taula de nat:
[root@firewall ~]# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Permetre la navegació des de dins cap a fora

Comencem a filtrar. Primer l’accés als serveis locals, els podem acceptar tots.

iptables -A INPUT -i lo -j ACCEPT

Accés a la consola del servidor per SSH des de la xarxa interna:

iptables -A INPUT -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT

Es fa l’emmascarament de la xarxa interna, és a dir, es substitueix la IP de la xarxa interna per la IP de la xarxa pública del tallafocs per sortir a Internet.

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

Forçar a tancar la resta de ports TCP i UDP del rang del 1 al 1024, reservats a serveis per a totes dues xarxes, la externa i la interna.

iptables -A INPUT -s 0.0.0.0/0 -p tcp --dport 1:1024 -j DROP
iptables -A INPUT -s 0.0.0.0/0 -p udp --dport 1:1024 -j DROP

Es pot provar que l’equip de la xarxa interna ja pot navegar per Internet. Ull, navegar, no resoldre pings que estan bloquejats.

Limitant la sortida a Internet

Però volem limitar els ports de sortida cap a Internet, només a navegació (http, https), consultes DNS i servidor de temps pel controlador de domini (192.168.1.11) i enviament de correu electrònic pel servidor corresponent (192.168.1.12).

Les instruccions són:

iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eth1 -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eht1 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eth1 -p udp --dport 123 -j ACCEPT
iptables -A FORWARD -s 192.168.1.12 -i eth1 -p tcp --dport 25 -j ACCEPT

#Assegurem que ningú més de la xarxa pugui enviar correu electrònic pel port 25.
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 25 -j DROP

No obstant, cal que estiguin per odre i si hem creat anteriorment altres regles aquestes s’afegiran al final, no està malament editar el fitxer de configuració de les regles:

vi /etc/sysconfig/iptables

Per afegir les regles abans de les línies de DROP (a l’editar el fitxer de iptables directament s’obvia la paraula iptables de cada línia):

:OUTPUT ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 1:1024 -j DROP
-A INPUT -p udp -m udp --dport 1:1024 -j DROP

Cal reiniciar el servei per aplicar les modificacions:

service iptables restart

Ja s’ha acabat de configurar la sortida cap a Internet.

Recull de totes les instruccions per permetre la navegació de dins a fora

Limitant l’accés a determinats ports de sortida a Internet.

iptables --flush
iptables --delete-chain
iptables --zero
iptables --table nat --flush
iptables --table nat --delete-chain
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables --table nat -P PREROUTING ACCEPT
iptables --table nat -P POSTROUTING ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eth1 -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eht1 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eth1 -p udp --dport 123 -j ACCEPT
iptables -A FORWARD -s 192.168.1.12 -i eth1 -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 25 -j DROP
iptables -A INPUT -s 0.0.0.0/0 -p tcp --dport 1:1024 -j DROP
iptables -A INPUT -s 0.0.0.0/0 -p udp --dport 1:1024 -j DROP
service iptables save
service iptables restart

Publicant serveis de dins a Internet

Toca donar accés al servidor de correu electrònic, pel protocol smtp i web segur, que tenim a la xarxa interna des de l’exterior. A la configuració anterior, cal afegir les següents regles:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.12:25
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to 192.168.1.12:443

Recull de totes les instruccions per permetre la navegació de dins a fora amb publicació de ports

Limitant l’accés a determinats ports de sortida i publicant diferents serveis.

iptables --flush
iptables --delete-chain
iptables --zero
iptables --table nat --flush
iptables --table nat --delete-chain
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables --table nat -P PREROUTING ACCEPT
iptables --table nat -P POSTROUTING ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eth1 -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eht1 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eth1 -p udp --dport 123 -j ACCEPT
iptables -A FORWARD -s 192.168.1.12 -i eth1 -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 25 -j DROP
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.12:25
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to 192.168.1.12:443
iptables -A INPUT -s 0.0.0.0/0 -p tcp --dport 1:1024 -j DROP
iptables -A INPUT -s 0.0.0.0/0 -p udp --dport 1:1024 -j DROP
service iptables save
service iptables restart

Configurant la zona desmilitaritzada

Després de configurar la targeta de xarxa del tallafocs que pertany a la zona desmilitaritzada, la publicació de ports és igual a tenir el servidor a la xarxa interna, només canvia la IP de destí:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.2.11:80

Però falta emmascarar la zona desmilitaritzada per sortir a Internet:

iptables -t nat -A POSTROUTING -s 192.168.2.0/27 -o eth0 -j MASQUERADE

Tancar l’accés des de la zona desmilitaritzada a la xarxa interna:

iptables -A FORWARD -s 192.168.2.0/27 -d 192.168.1.0/24 -j DROP

Tancar l’accés des de la zona desmilitaritzada al propi tallafocs:

iptables -A INPUT -s 192.168.2.0/27 -i eth2 -j DROP

Recull de totes les instruccions per permetre la navegació de dins a fora amb publicació de ports amb una zona desmilitaritzada

Limitant l’accés a determinats ports de sortida i publicant diferents serveis ja siguin a la xarxa interna com a la zona desmilitaritzada.

iptables --flush
iptables --delete-chain
iptables --zero
iptables --table nat --flush
iptables --table nat --delete-chain
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables --table nat -P PREROUTING ACCEPT
iptables --table nat -P POSTROUTING ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.2.0/27 -o eth0 -j MASQUERADE
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eth1 -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eht1 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -i eth1 -p udp --dport 123 -j ACCEPT
iptables -A FORWARD -s 192.168.1.12 -i eth1 -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 25 -j DROP
iptables -A FORWARD -s 192.168.2.0/27 -d 192.168.1.0/24 -j DROP
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.12:25
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to 192.168.1.12:443
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.2.11:80
iptables -A INPUT -s 192.168.2.0/27 -i eth2 -j DROP
iptables -A INPUT -s 0.0.0.0/0 -p tcp --dport 1:1024 -j DROP
iptables -A INPUT -s 0.0.0.0/0 -p udp --dport 1:1024 -j DROP
service iptables save
service iptables restart

 

Fortificació amb el tallafocs d’un servidor Linux

Un petit plus per tancar l’entrada.

En aquest cas interessa bloquejar tots els ports de la màquina i anar obrint els que es necessiten! Ull amb connexions a consola remotes que us pot deixar sense connexió.

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

Habilitar l’accés per la targeta de loopback, és a dir, que permeti treballar a “tuti pleni” el localhost (127.0.0.1):

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Habilitar l’accés a la consola per SSH des de la xarxa interna per poder manipular la configuració, sense necessitat d’obrir la consola local:

iptables -A INPUT -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp -m tcp --sport 22 -m state --state RELATED,ESTABLISHED -j ACCEPT

Habilitar l’accés al servei web des de la xarxa interna i externa:

iptables -A INPUT -i eth1 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT

A fi i efecte de permetre fer actualitzacions o altres serveis a la pròpia màquina, cal habilitar aquestes connexions permeses:

# Consultes a un servidor DNS (80.58.0.33)
iptables -A INPUT -s 80.58.0.33 -p udp -m udp --sport 53 -j ACCEPT
iptables -A OUTPUT -d 80.58.0.33 -p udp -m udp --dport 53 -j ACCEPT

# Consultes al servidor de temps pool.ntp.org (81.47.170.118)
iptables -A INPUT -s 81.47.170.118 -p udp -m udp --sport 123 -j ACCEPT
iptables -A OUTPUT -d 81.47.170.118 -p udp -m udp --sport 123 -j ACCEPT

# Navegació web HTTP
iptables -A INPUT -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT

# Navegació web segura HTTPS
iptables -A INPUT -p tcp -m tcp --sport 443 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT

 

T’ha agradat l’article? El pots compartir a les xarxes socials. També pots deixar la teva opinió, comentari o suggeriment. Gràcies!

Similar Posts by The Author:

 

4 comentaris per a
“Petit tallafocs amb Linux”

  1. Gran article.
    Fa temps que vaig fer moltes coses amb Iptables i al final vaig trobar una GUI que em va simplificar la vida amb les iptables. Acabo de buscar-la, per nostalgia i he vist que encara existeix, si la vols provar la trobaras a http://www.fwbuilder.org/

    salut

     
    1. Gràcies per l’aportació Jaume. És una bona solució per muntar regles en entorn gràfic, no només de l’IPTables, sinó també de les ACLs de Cisco i Hewlett Packard. No sóc massa amic dels assistents, però he de reconèixer que en alguns casos una ajuda no està de més.

       
  2. Hola,
    jo vaig començar també amb iptables però vaig trobar un producte anomenat shorewall (http://www.shorewall.net). Ara fa ja molt de temps que l’utilitzo, conceptualment és molt senzill d’entendre i t’assegura que no et deixes coses pel camí. És un producte molt interessant.

     

Deixar un comentari

Recorda que no es contestaran preguntes personals, només d´interés comú que ens enriqueixin a tots.
La teva adreça de correu electrònic no serà publicada. Els camps obligatoris estan indicats.

Aquest lloc utilitza Akismet per reduir el correu brossa. Aprendre com la informació del vostre comentari és processada