Linux com a firewall

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.

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.

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:

bash

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

bash

sudo systemctl restart networking

I verificarem que s’actualitzi la nova IP amb

shell

ip a

Ja tenim la IP, xarxa, màscara de xarxa i DNS configurats. Repetirem el mateix per la interfície de la DMZ.

Ara tocarà configurar el DHCP. Primer ens baixarem el paquet isc-dhcp-server.

bash

sudo apt install isc-dhcp-server

Configurarem l’arxiu /etc/default/isc-dhcp-server:

shell

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.

bash

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 .

Abans de crear les regles d’Iptables, explicarem el seu funcionament.

La seva sintaxi és:

bash

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.

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:

bash

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)

bash

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

Permetrem el tràfic DHCP entre firewall i LAN:

bash

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:

bash

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:

bash

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):

bash

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:

bash

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:

bash

iptables -A OUTPUT -o enp7s0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Per últim, afegirem el MASQUERADE a la sortida a Internet:

bash

iptables -t nat -A POSTROUTING -i enp7s0 -j MASQUERADE

El nostre script quedaria així:

shell

#!/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:

bash

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!