Table des matières

, , , , ,

Ajouter une règle basée sur ipset au firewall UFW

La présentation détaillée des ipsets est proposée dans le wiki  bloquer des adresses IP indésirables.

On cherche ici à créer une règle autorisant le trafic en sortie sur un port particulier (8000) vers un groupe d'adresses IP seulement.

# Création d'une groupe contenant au maximum 256 adresses
sudo ipset create canon_mfc hash:ip maxelem 256
 
# ajout de quelques adresses dans le groupe
sudo ipset add canon_mfc 192.168.0.10
sudo ipset add canon_mfc 192.168.0.20
sudo ipset add canon_mfc 192.168.0.33

Test de la règle

Dans un premier temps on utilise le cli iptables, les changements seront ainsi réversibles en cas d'erreur en rechargeant simplement le pare-feu ufw

# Journalise le trafic sortant à destination des machines de l'ensemble canon_mfc
iptables -A ufw-after-output -m set --match-set canon_mfc dst -p tcp --dport 8000 -j ufw-logging-allow
 
# Autorise le trafic sortant à destination des machines de l'ensemble canon_mfc
iptables -A ufw-after-output -m set --match-set canon_mfc dst -p tcp --dport 8000 -j ACCEPT
 
# Journalise le trafic provenant des machines de l'ensemble set_autorized_hosts
iptables -A ufw-after-input -i eth0 -m set --match-set set_autorized_hosts src -j ufw-logging-allow
 
# Autorise le trafic en provenance des machines de l'ensemble set_autorized_hosts
iptables -A ufw-after-input -i eth0 -m set --match-set mgmt src -j ACCEPT

Vérifier la présence de la nouvelle règle dans la chaîne:

iptables -L ufw-after-output
...
ufw-logging-allow  tcp  --  anywhere             anywhere             match-set canon_mfc dst tcp dpt:8000
ACCEPT     tcp  --  anywhere             anywhere             match-set canon_mfc dst tcp dpt:8000

Contacter l’hôte sur le port 8000 et vérifier les traces dans les journaux système:

journalctl -k --since "1 minutes ago"
-- Logs begin at Wed 2021-06-16 14:39:52 CEST, end at Tue 2021-10-19 18:06:04 CEST. --
oct. 19 18:05:32 node-7c87 kernel: [UFW ALLOW] IN= OUT=enp0s31f6 SRC=192.168.0.1 DST=192.168.0.10 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=48686 DF PROTO=TCP SPT=38250 DPT=8000 WINDOW=64240 RES=0x00 SYN URGP=0
...

En cas de problème ou une fois le fonctionnement de la règle confirmé, on peut recharger le pare-feu, les modifications apportées précédemment seront effacées.

ufw reload

Rendre la règle permanente

Pour rendre la règle permanente, il faut l'intégrer dans le framework UFW. La règle ne pourra être valide syntaxiquement que si les ensembles existent. Il faut donc que les ensembles ipset soient créés avant.

# rendre executable le script before.init s'il ne l'est pas
chmod +x before.init
 
# Sauvegarder les ensembles ipset existants:
ipset save > /etc/ufw/ipsets.save

Modifier le fichier /etc/ufw/before.init pour que les ensembles soient recréés depuis la sauvegarde lors du redémarrage

before.init
#!/bin/sh
#
# before.init: if executable, called by ufw-init. See 'man ufw-framework' for
#              details. Note that output from these scripts is not seen via the
#              the ufw command, but instead via ufw-init.
#
# Copyright 2013 Canonical Ltd.
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License version 3,
#    as published by the Free Software Foundation.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
set -e
 
case "$1" in
start)
    # create ipsets from definition file
    ipset restore < /etc/ufw/ipsets.save
    ;;
stop)
    # delete all ipsets
    ipset destroy
    ;;
status)
    # optional
    ;;
flush-all)
    # optional
    ;;
*)
    echo "'$1' not supported"
    echo "Usage: before.init {start|stop|flush-all|status}"
    ;;
esac

Pour l'exemple présent, on cherche à autoriser le traffic à destination du port managment de certaines impirmantes. Le traffic n'est pas proritaire ou régulier, on va l'intégrer au règles évaluées après les règles utilisateur ufw. Pour cela on modifie le fichier le /etc/ufw/after.rules

# Journalise et autorise le traffic vers l'interface Web de gestion des MFC Canon
-A ufw-after-output -m set --match-set canon_mfc dst -p tcp --dport 8000 -j ufw-logging-allow -m comment --comment "Allow Management Canon MFC"
-A ufw-after-output -m set --match-set canon_mfc dst -p tcp --dport 8000 -j ACCEPT -m comment --comment "Allow Management Canon MFC"

On recharge les règles:

ufw reload

D'autres machines pourront ainsi être ajoutées à ce groupe sans qu'il soit nécessaire de créer une nouvelle règle ou de recharger les règles existantes.

# Ajoute une nouvelle machine au groupe. La règle existante s'applique immédiatement à ce nouveau membre
ipset add canon_mfc 192.168.0.42
Lors de toute modification d'un ensemble, si le comportement obtenu est correct, ne pas oublier de sauvegarder le groupe pour qu'il soit disponible à l'identique après un redémarrage du pare-feu
# root
ipset save > /etc/ufw/ipsets.save
 
# ou depuis un sudoer
sudo ipset save | sudo tee /etc/ufw/ipsets.save

Pour afficher les règles évaluées après les règles utilisateur auxquelles notre nouvelle règle a été ajoutée:

ufw show after-rules

Références