Linux com a firewall
Introducció
Com vam comentar en un post anterior Iptables és una utilitat que permet a Linux actuar com a firewall. En aquest post, mostrarem l’exemple de com utilitzar les Iptables per crear un firewall basat en Linux, explicant cada paràmetre i tot el necessari perquè el nostre Linux sigui un router. A més, darrere del router, a més de la xarxa interna, hi crearem també una DMZ.
DMZ (Zona Desmilitaritzada) És una zona entre la xarxa interna i Internet. Aquesta zona té accés a Internet, però mentre que la xarxa interna pot accedir a ella, ella no pot accedir a la xarxa interna. Això pot ser útil per exposar un servidor web a Internet.
Comencem
Crearem una màquina virtual (debian en el meu cas). Aquesta ha de tenir tres interfícies:
- WAN -> Accés a Internet (la que donarà Internet a la xarxa).
- LAN -> Interfície cap a la xarxa interna.
- LAN 2 -> Interfície cap a la DMZ.
Per això haurem d’afegir una interfície amb una xarxa NAT a la màquina router, i una altra amb una xarxa interna que crearem sense dhcp ni sortida a Internet, que és la que assignarem als clients de la nostra màquina router.
La nostra adreça de xarxa serà 192.168.250.0/24, i la de la DMZ, la 192.168.251.0/24.
IP del router
A la LAN, el router haurà de tenir una IP fixa. En aquest cas posarem la 192.168.250.1. Per fer això amb Debian, editarem l’arxiu /etc/networks/interfaces i, a la part de les interfícies, escriurem:
allow-hotplug enp1s0
allow-hotplug enp7s0
iface enp1s0 inet static
address 192.168.250.1
netmask 255.255.255.0
dns-nameservers 8.8.8.8 8.8.4.4
iface enp7s0 inet dhcp
On la interfície enp1s0 és la LAN i la enp7s0, la WAN. Un cop fet això, escriurem
sudo systemctl restart networking
I verificarem que s’actualitzi la nova IP amb
ip a
Ja tenim la IP, xarxa, màscara de xarxa i DNS configurats. Repetirem el mateix per la interfície de la DMZ.
DHCP
Ara tocarà configurar el DHCP. Primer ens baixarem el paquet isc-dhcp-server.
sudo apt install isc-dhcp-server
Configurarem l’arxiu /etc/default/isc-dhcp-server:
INTERFACESv4="enp1s0"
#INTERFACESv6=""
Amb això deixarem IPv6 comentat (no volem tocar-la) i especificarem a quina interfícies volem donar IP per DHCP.
I també configurarem a l’arxiu /etc/dhcp/dhcpd.conf, afegint el següent.
subnet 192.168.250.0 netmask 255.255.255.0 {
range 192.168.250.50 192.168.250.254;
option routers 192.168.250.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;
}
Amb aquestes línies especifiquem el rang, el gateway i els DNS.
Ara mateix si afegim una màquina virtual a la xarxa, ja agafarà IP, però encara no podrà navegar .
Iptables
Abans de crear les regles d’Iptables, explicarem el seu funcionament.
Paràmetres d’Iptables
La seva sintaxi és:
iptables [option] CHAIN_rule [-j target]
Les opcions més comunes són:
- -A –append: Afegeix una regla al final d’una cadena.
- -D –delete: Elimina les regles especificades d’una cadena.
- -F –flush: Elimina totes les regles.
- -I –insert: Afegeix una regla a una cadena en una posició donada.
- -L –list: Mostra les regles d’una cadena.
- -N –new-chain: Crea una nova cadena.
- -v –verbose: Mostra més informació al llistar una cadena.
- -X –delete-chain: Elimina la cadena.
- -P –policy: Canvia la política d’una chain.
Els targets els podem trobar a l’altre post.
Configuració d’Iptables
Per configurar Iptables, una manera de fer-ho bastant comuna i útil és amb scripts. Així es pot reaprofitar la configuració, modificar-la o copiar-la quan vulguem. Així que és el que farem.
Les interfícies que utilitzarem seran:
enp1s0 -> LAN
enp7s0 -> WAN
enp8s0 -> DMZ
Primer de tot, eliminarem les regles que hi pugui haver, a més dels contadors:
iptables -F
iptables -t nat -F
iptables -X
iptables -Z
Per configurar iptables, es tria una política per defecte, que pot ser ACCEPT o DROP.
Segons la política que s’hagi triat, els paquets que no compleixin cap regla seran tots acceptats (ACCEPT) o descartats (DROP).
Afegirem la política per defecte (En aquest cas DROP)
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Permetrem el tràfic DHCP entre firewall i LAN:
iptables -A INPUT -i enp1s0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT
iptables -A OUTPUT -o enp1s0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT
Ara donarem accés al nostre firewall per ssh des de la LAN:
iptables -A INPUT -s 192.168.250.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d 192.168.250.0/24 -p tcp --sport 22 -j ACCEPT
Permetem les connexions establertes des de qualsevol lloc a la xarxa local:
iptables -A INPUT -i enp1s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i enp1s0 -p tcp -j ACCEPT
iptables -A INPUT -i enp1s0 -p udp -j ACCEPT
Exposem els ports que vulguem de la DMZ (en aquest exemple exposarem el 80):
iptables -A FORWARD -i enp7s0 -o enp8s0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i enp8s0 -o enp7s0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Permetem el tràfic de la DMZ a la WAN:
iptables -A INPUT -i enp8s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i enp8s0 -p tcp -j ACCEPT
iptables -A INPUT -i enp8s0 -p udp -j ACCEPT
Permetem el tràfic de sortida del firewall:
iptables -A OUTPUT -o enp7s0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Per últim, afegirem el MASQUERADE a la sortida a Internet:
iptables -t nat -A POSTROUTING -i enp7s0 -j MASQUERADE
El nostre script quedaria així:
#!/bin/bash
iptables -F
iptables -t nat -F
iptables -X
iptables -Z
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A INPUT -i enp1s0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT
iptables -A OUTPUT -o enp1s0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT
iptables -A INPUT -s 192.168.250.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d 192.168.250.0/24 -p tcp --sport 22 -j ACCEPT
iptables -A INPUT -i enp1s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i enp1s0 -p tcp -j ACCEPT
iptables -A INPUT -i enp1s0 -p udp -j ACCEPT
iptables -A FORWARD -i enp7s0 -o enp8s0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i enp8s0 -o enp7s0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i enp8s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i enp8s0 -p tcp -j ACCEPT
iptables -A INPUT -i enp8s0 -p udp -j ACCEPT
iptables -A OUTPUT -o enp7s0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -i enp7s0 -j MASQUERADE
Per fer la configuració persistent, farem:
iptables-save > /etc/iptables/rules.v4
Així queda guardada en un arxiu.
Fins aquí el post d’avui. Espero que entre aquest post i l’anterior sobre el tema hagi quedat clar alguna cosa de les iptables. Si t’ha estat d’ajuda pots comentar o compartir. Ens veiem al següent!