Petit tallafocs amb Linux

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).
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:
- Microsoft SQL Server con SMB3
- Microsoft SQL Server amb SMB3
- Containers en Linux
- Containers amb Linux
- Migrar el servidor de archivos a Windows Server 2019
- Migrar el servidor de fitxers a Windows Server 2019
- Puerta enlace a Azure en el Windows Admin Center
- Porta enllaç a Azure en el Windows Admin Center
- Hola mundo! WordPress 5 y Gutenberg
- Hola món! WordPress 5 i Gutenberg
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
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.
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.
Gràcies per l’aportació Lluís, no coneixia aquesta eina. En les configuracions del dia a dia venen molt bé.