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