Pare-feu IPv4/IPv6, versions bureau et serveur

#Les débats et questions à propos de ce T&A ont leur place ici : https://www.debian-fr.org/t/digression-installation-parefeu-iptables-ip6tables-pour-les-nuls.

Pour information, aujourd’hui dans les branches testing et unstable est arrivée une version de systemd (231-4) qui casse la rétro-compatibilité avec les “vieux” scripts d’init SysV tel que celui proposé ici. Si vous êtes en testing ou unstable, votre pare-feu NE DÉMARRE PLUS automatiquement au boot. Je modifie le tutoriel au plus vite :slight_smile:.

Bon, étant dans l’incapacité d’éditer le premier message de ce fil, vous trouverez ci-dessous le paragraphe “Création d’un script d’init” modifié pour systemd.

##Création d’un script d’init systemd

Comme introduit plus haut, il faut s’assurer que le pare-feu soit lancé lors de la phase de boot du système. Puisque systemd est maintenant le système d’init par défaut de Debian, on va suivre la procédure adaptée.

On crée d’abord un fichier service, par exemple /etc/systemd/system/init_firewall.service qui contient :

[Unit]
Description=Iptables firewall
DefaultDependencies=no
Wants=network-pre.target
Before=network-pre.target shutdown.target
Conflicts=shutdown.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/init_firewall start
ExecStop=/usr/local/bin/init_firewall stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Ce fichier correspond peu ou prou aux en-têtes LSB de l’ancien système d’init, et permet d’interfacer systemd avec votre script d’init.

Le script d’init à proprement parler peut être stocké où on veut. Je vous propose un pragmatique /usr/local/bin/init_firewall qui contiendra :

#! /bin/sh

start(){
    iptables-restore < /etc/config_parefeu_IPv4
    ip6tables-restore < /etc/config_parefeu_IPv6
    echo "Starting firewall"
    RETVAL=$?
}

stop(){
    iptables-save > /etc/config_parefeu_IPv4
    ip6tables-save > /etc/config_parefeu_IPv6
    RETVAL=$?
}

clean(){
    # clean le parefeu pendant que la machine tourne
    # ça peut être une faille de sécurite si on l'exécute lors de l'extinction avant l'arrêt des interfaces
    # pensez à refaire un start après sinon la sauvegarde se fera automatiquement à l'extinction

    #### IPv4 ####

    iptables -t filter -F
    iptables -t nat -F
    iptables -t mangle -F
    iptables -t raw -F
    iptables -t filter -P INPUT ACCEPT
    iptables -t filter -P OUTPUT ACCEPT
    iptables -t filter -P FORWARD ACCEPT
    iptables -t nat -P PREROUTING ACCEPT
    iptables -t nat -P POSTROUTING ACCEPT
    iptables -t nat -P INPUT ACCEPT
    iptables -t nat -P OUTPUT ACCEPT
    iptables -t mangle -P PREROUTING ACCEPT
    iptables -t mangle -P OUTPUT ACCEPT
    iptables -t mangle -P POSTROUTING ACCEPT
    iptables -t mangle -P FORWARD ACCEPT
    iptables -t mangle -P INPUT ACCEPT
    iptables -t raw -P OUTPUT ACCEPT
    iptables -t raw -P PREROUTING ACCEPT

    #### IPv6 ####
    # Attention : la table nat IPv6 n'existe pas sous Wheezy (noyau 3.2)

    ip6tables -t filter -F
    ip6tables -t nat -F
    ip6tables -t mangle -F
    ip6tables -t raw -F
    ip6tables -t filter -P INPUT ACCEPT
    ip6tables -t filter -P OUTPUT ACCEPT
    ip6tables -t filter -P FORWARD ACCEPT
    ip6tables -t nat -P PREROUTING ACCEPT
    ip6tables -t nat -P POSTROUTING ACCEPT
    ip6tables -t nat -P INPUT ACCEPT
    ip6tables -t nat -P OUTPUT ACCEPT
    ip6tables -t mangle -P PREROUTING ACCEPT
    ip6tables -t mangle -P OUTPUT ACCEPT
    ip6tables -t mangle -P POSTROUTING ACCEPT
    ip6tables -t mangle -P FORWARD ACCEPT
    ip6tables -t mangle -P INPUT ACCEPT
    ip6tables -t raw -P OUTPUT ACCEPT
    ip6tables -t raw -P PREROUTING ACCEPT

    RETVAL=$?
}

case $1 in
    start|stop) "$1" ;;
esac

N’oubliez pas de rendre le script exécutable : chmod +x /usr/local/bin/init_firewall.
Enfin, pour indiquer à systemd la présence de votre nouveau service : systemctl enable init_firewall.service. Vous pouvez dès maintenant, sans rebooter, lancer votre pare-feu en exécutant systemctl start init_firewall.service, et vérifier que tout s’est bien passé avec systemctl status init_firewall.service.

Sinon, tu as le paquet iptables-persistent de la suite netfilter-persistent qui fait très bien le boulot. Après, tu configures les règles dans /etc/iptables/rules.v4 pour les règles IPv4 et /etc/iptables/rules.v6 pour les règles IPv6.
Le post-install te demande même s’il doit importer les règles que tu as déjà installées.

2 J'aime

Super, grand merci ! Je ne connaissais pas ce paquet et je viens d’utiliser sur un nouveau serveur pour un petit projet, c’est effectivement impeccable. On met les règles en place, on installe le paquet, et paf !

De rien, c’est toujours un plaisir de faire découvrir mes petites astuces…

Salut
Sur un desktop ou laptop je me contente d’ufw et de son interface graphique gufw

apt-cache show gufw
Package: gufw
Source: gui-ufw
Version: 16.10.0-1
Installed-Size: 3271
Maintainer: Python Applications Packaging Team <python-apps-team@lists.alioth.debian.org>
Architecture: all
Depends: python3:any (>= 3.3.2-2~), ufw (>= 0.34~rc), gir1.2-gtk-3.0, policykit-1, gir1.2-webkit2-4.0, python3-gi
Description-fr: interface utilisateur graphique pour ufw
 Gufw est un moyen facile et intuitif pour gérer un pare-feu Linux. Il
 prend en charge, entre autres, les tâches courantes telles que l'autorisation
 ou le blocage de ports individuels ou pair à pair courants préconfigurés.
Description-md5: 6ba71ac631b02c0d683f78355db5e633
Homepage: http://gufw.org/
Tag: admin::configuring, implemented-in::python, interface::graphical,
 interface::x11, network::firewall, role::program, scope::utility,
 security::firewall, uitoolkit::gtk, use::configuring, x11::application
Section: admin
Priority: optional
Filename: pool/main/g/gui-ufw/gufw_16.10.0-1_all.deb
Size: 832574
MD5sum: 88b4fc22a2fdfa5c042c12600d2aabf3
SHA1: bad903ee7d2e474655199767f4959303529e11d4
SHA256: 33b74050c3d673974abe938fed763f87e60fce48e372f4cef7e34afadeb556f0

1 J'aime

pour la persistance des règles iptables ipv4 et ipv6 j’utilise iptables-persistent a installer avec apt-get install iptables-persistent

on a plus qu’a créer un scripte iptables dont la dernière ligne ce termine par
service netfilter-persistent save

exemple:

   ### SUPPRESSION de TOUTES LES ANCIENNES TABLES (OUVRE TOUT!!) ###
   ## ipv6
   /usr/sbin/ip6tables -F
   /usr/sbin/ip6tables -X
   /usr/sbin/ip6tables -t nat -F  
   /usr/sbin/ip6tables -t nat -X  
 
    /usr/sbin/ip6tables -P INPUT ACCEPT
    /usr/sbin/ip6tables -P OUTPUT ACCEPT
    /usr/sbin/ip6tables -P FORWARD ACCEPT 
   
   ##ipv4
    /usr/sbin/iptables -F
    /usr/sbin/iptables -X
   /usr/sbin/iptables -t nat -F  
   /usr/sbin/iptables -t nat -X  
   
   /usr/sbin/iptables -P INPUT ACCEPT
   /usr/sbin/iptables -P OUTPUT ACCEPT
   /usr/sbin/iptables -P FORWARD ACCEPT 

service netfilter-persistent save
1 J'aime

Oui, c’est déjà ce qui m’avait été proposé au-dessus ;). Un jour je prendrai le temps de modifier ce T&A pour prendre ça en compte !

Bonjour,

Est que le restart est prévu à travers ce nouveau script ?

Bonsoir,

J’espère ne pas me méprendre en disant que lorsque l’on utilise le paquet iptables-persistant, on ne doit pas créer le fichier init-firewall dans le dossier /etc/init.d mais seulement recopier , dans un terminal, les règles de ledit fichier avant d’inscrire les règles de configuration, c’est bien ça?

Exemple:

iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F
iptables -t raw -F
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P INPUT ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t raw -P OUTPUT ACCEPT
iptables -t raw -P PREROUTING ACCEPT

ip6tables -t filter -F
ip6tables -t nat -F
ip6tables -t mangle -F
ip6tables -t raw -F
ip6tables -t filter -P INPUT ACCEPT
ip6tables -t filter -P OUTPUT ACCEPT
ip6tables -t filter -P FORWARD ACCEPT
ip6tables -t nat -P PREROUTING ACCEPT
ip6tables -t nat -P POSTROUTING ACCEPT
ip6tables -t nat -P INPUT ACCEPT
ip6tables -t nat -P OUTPUT ACCEPT
ip6tables -t mangle -P PREROUTING ACCEPT
ip6tables -t mangle -P OUTPUT ACCEPT
ip6tables -t mangle -P POSTROUTING ACCEPT
ip6tables -t mangle -P FORWARD ACCEPT
ip6tables -t mangle -P INPUT ACCEPT
ip6tables -t raw -P OUTPUT ACCEPT
ip6tables -t raw -P PREROUTING ACCEPT


iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m conntrack --ctstate NEW -m limit --limit 1/s --limit-burst 1 -j ACCEPT
iptables -A INPUT -p tcp --dport xxxx -j ACCEPT
iptables -A INPUT -p udp --dport xxxx -j ACCEPT

ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT
ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -m conntrack --ctstate NEW -m limit --limit 1/s --limit-burst 1 -j ACCEPT
ip6tables -A INPUT -p tcp --dport xxxx -j ACCEPT
ip6tables -A INPUT -p udp --dport xxxx -j ACCEPT

sudo -s iptables-save -c

Merci de m’éclairer

Salut
j’ai migré de iptables à nftables

ça drop :sunglasses:

nft list ruleset; date; who -b
table inet filter {
	chain input {
		type filter hook input priority 0; policy accept;
		iif "lo" accept
		ct state established,related accept
		tcp dport { ssh, http, https, 8200 } ct state new accept
		counter packets 10980 bytes 4821930 drop
	}
}
samedi 23 février 2019, 10:19:41 (UTC+0100)
         démarrage système 2019-02-23 07:05
1 J'aime

J’attends voir les versions du script seront donc proposées afin de me décider. Merci

Le release plombier annemasse

https://www.debian.org/releases/buster/amd64/release-notes/ch-whats-new.fr.html#nftables

perso je passe par shorewall(6) et shorewall-init. Aucun script à faire.

J’ai fait une propreté , plus adapté à un Pc familial.

cat /etc/nftables.conf

#!/usr/sbin/nft -f
# 
flush ruleset

table inet ma_table {
	chain trafic_entrant {
		type filter hook input priority 0; policy drop;
# par defaut le trafic entrant est rejeté		
		iif lo accept comment "Accepter le trafic local"
#	
#		
		ct state invalid drop comment "Rejeter les connexions invalides"
#	
		ct state established,related accept comment "Accepter le trafic dont nous sommes à l'origine"
#
		counter drop comment "Compter et rejeter tout le reste"
	}

	chain trafic_transfert {
		type filter hook forward priority 0; policy drop; 
		# Pas de transfert, on est pas un routeur 
	}

	chain trafic_sortant {
		type filter hook output priority 0; policy accept; 
		# Accepter tout ce qui sort
	}

}

Ce qui donne:

root@debian:~# nft list ruleset
table inet ma_table {
	chain trafic_entrant {
		type filter hook input priority filter; policy drop;
		iif "lo" accept comment "Accepter le trafic local"
		ct state invalid drop comment "Rejeter les connexions invalides"
		ct state established,related accept comment "Accepter le trafic dont nous sommes à l'origine"
		counter packets 97 bytes 2986 drop comment "Compter et rejeter tout le reste"
	}

	chain trafic_transfert {
		type filter hook forward priority filter; policy drop;
	}

	chain trafic_sortant {
		type filter hook output priority filter; policy accept;
	}
}
root@debian:~# 

Pensez systématiquement à LOG les drop. C’est important car le parefeu, ce n’est pas uniquement de filtrer mais aussi de savoir ce que l’on filtre (pour éventuellement voir ce qui se passe).
Il y a deux modes de logs. Soit par l’habituel classique via rsyslog qui finit dans /var/log/syslog ou dans un fichier dédié avec un filtre dans la configuration rsyslog.conf ou rsyslog.d. Soit d’utiliser ulogd (par le package ulog2)

Dans mon cas j’utilise ufw en mode basic et je suis submergé de messages qui st stockés ds le log dédié

/var/log/ufw.log

oui c’est malheureusement normal :slight_smile: d’où l’intérêt d’une rotation de logs.
L’idée c’est d’avoir un truc genre fwlogwatch pour générer un rapport à interval régulier qui permet de se passer des logs les plus anciens.