iptables en Debian

Última actualització: desembre de 2019

iptables és el firewall integrat en el kernel de Linux. Veurem aquí com configurar un iptables senzill per a un servidor o estació de treball amb una targeta de xarxa. Si estem pensant en muntar un firewall dedicat amb vàries targetes de xarxa, la meva recomanació es que provis l'increïble pfSense.

Creem primer un fitxer /etc/iptables.up.rules. Un possible contingut de sortida seria aquest:

*filter

# Per a filtrar paquets que van o surten de la pròpia màquina farem servir INPUT i OUTPUT.

# Per a filtrar paquets que van a altres equips remots, fem servir FORWARD.

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

# permet tot el trafic de loopback però fa un drop a tot el trafic que va a 127/8 i que no fa servir lo0

-A INPUT -i lo -j ACCEPT

-A INPUT -d 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable

# accepta l'entrada a totes les connexions establertes

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# les meves regles

-A INPUT -s 192.168.1.200 -j ACCEPT

-A INPUT -s 192.168.2.0/24 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# permet ssh al port 30000

-A INPUT -p tcp -m state --state NEW -m tcp --dport 30000 -j ACCEPT

# permet ping (o no)

#-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT

-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)

-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Denega tot el que no hagi estat autoritzat abans

-A INPUT -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -j REJECT --reject-with icmp-port-unreachable

-A OUTPUT -j ACCEPT

COMMIT

Per a executar el firewall a l'inici necessitarem un fitxer /etc/network/if-pre-up/iptables, amb aquest contingut:

#!/bin/bash /sbin/iptables-restore < /etc/iptables.up.rules

Si fem canvis al fitxer de regles i volem recarregar el firewall "en viu", simplement farem:

/etc/network/if-pre-up.d/iptables

Si volem veure quines regles estem aplicant:

iptables -L

En cas de problemes, podem analitzar que està pasant amb iptraf.

Exemple d'script inicial iptables amb possibles regles inicials:

sysctl net.ipv6.conf.all.disable_ipv6=1

sysctl net.ipv4.ip_forward=0

iptables -F

iptables --flush

iptables -t nat --flush

iptables -t mangle --flush

iptables --delete-chain

iptables -t nat --delete-chain

iptables -t mangle --delete-chain

#drop per defecte a tot, excepte sortida

iptables --policy INPUT DROP

iptables --policy OUTPUT ACCEPT

iptables --policy FORWARD DROP

#accept loopback

iptables -A INPUT -i lo -j ACCEPT

#accept related

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#permetem ssh

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

#Si volem permetre ssh, http i https, descomenten següent línia

# iptables -A INPUT -p tcp -m state --state NEW -m multiport --dports ssh,http,https -j ACCEPT

#Si volem permetre ssh, http i https però només per eth0, descomenten següent línia

# iptables -A INPUT -i eth0 -s 192.168.1.0/24 -p tcp -m state --state NEW -m multiport --dports http,https -j ACCEPT

=== nftables és el nou iptables ===

nftables va ser inclós al kernel de Linux al 2014, per a solucionar algunes coses d'iptables com simplificar la sintaxi, proporcionar escalabilitat i evitar haver de duplicar les regles iptables per a IPv4 i IPv6 (que es gestionen amb iptables i ip6tables respectivament).

El funcionament de nftables és també amb chains i rules, però a diferència d'iptables no partim amb cap chain per defecte (recordem que a iptables tenim de sortida els chains: input, output i forward).

Per a instal·lar-ho a Debian, farem:

apt install nftables

sudo systemctl enable nftables

I ja està. Per a poder convertir antics scripts iptables o simplement si encara no dominem la sintaxi nftables, però si la d'iptables, tenim el conversor iptables-translate. Un parell d'exemples:

* Si volem bloquejar totes les entrades provinents de 192.168.1.1:

linux@box:~$ iptables-translate -A INPUT -s 192.168.1.1 -j DROP

nft add rule ip filter INPUT ip saddr 192.168.2.1 counter drop

* Si volem permetre que es pugui accedir al servidor SSH, desde un rang d'adreces:

linux@box:~$ iptables-translate -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

nft add rule ip filter INPUT ip saddr 192.168.1.0/24 tcp dport 22 ct state new,established counter accept