rss logo

Dupliquer des paquets Syslog avec nftables sous Linux

Personnage de style anime dédoublé illustrant la duplication de paquets Syslog avec nftables sous Linux

J’ai récemment eu besoin d’envoyer les paquets Syslog d’un pare-feu vers deux serveurs différents, principalement pour recueillir des informations sur les blocages effectués par les règles de filtrage. Le problème : le pare-feu ne permettait tout simplement pas de le faire. Sans citer de nom, j’aurais pas mal de reproches à faire à Cisco Firepower… Dans la configuration utilisée, un seul serveur Syslog pouvait être défini.

Il ne restait donc plus beaucoup d’options, à part demander de l’aide à notre ami Linux. Comme nous allons le voir, j’ai ajouté au réseau un serveur Debian qui sert de relais Syslog. Une fois le pare-feu configuré pour envoyer son trafic Syslog vers ce serveur Debian, nftables dupliquera les paquets reçus et transmettra les copies à deux serveurs Syslog différents.

Je me suis largement inspiré de la solution publiée par A.B sur superuser.com. Merci à lui !

Voyons maintenant comment procéder !

Schéma réseau

Comme le montre ce schéma, le pare-feu envoie ses messages Syslog au serveur Debian 10.0.0.200. nftables nous permettra de dupliquer ces paquets et, si nécessaire, de modifier leurs en-têtes IP et UDP. Nous commencerons par dupliquer les paquets et les envoyer à 10.0.0.202 sans modifier l’adresse IP source ni le port UDP de destination. Nous enverrons également une autre copie à l’hôte 10.0.0.201, mais en modifiant cette fois l’adresse IP source et en définissant le port UDP de destination sur 9003, pour explorer cette possibilité et voir comment procéder 😉.

Schéma réseau montrant nftables dupliquant les paquets Syslog UDP d’un pare-feu vers deux serveurs Debian avec des ports de destination différents
Schéma réseau : un serveur Debian utilisant nftables reçoit le trafic Syslog et duplique les paquets UDP vers deux serveurs Syslog différents.

Configurer les règles nftables

Nous allons modifier le fichier /etc/nftables.conf et ajouter des règles au niveau du hook prerouting. Les paquets Syslog entrants seront interceptés avant la décision de routage, dupliqués avec l’instruction dup, puis envoyés à nos deux serveurs de destination.

#!/usr/bin/nft -f

flush ruleset

# Définition des variables
## Relais Syslog
define DST0 = 10.0.0.200

## Serveurs Syslog de destination
define DST1 = 10.0.0.202
define DST2 = 10.0.0.201

## Interface réseau
define INT = "ens18"

# Table de filtrage : tout est autorisé par défaut
table inet filter {
        chain input {
                type filter hook input priority filter;
        }

        chain forward {
                type filter hook forward priority filter;
        }

        chain output {
                type filter hook output priority filter;
        }
}

# Table utilisée pour dupliquer les paquets Syslog
table ip multiply {

        chain c {
                # Traite les paquets entrants avant la décision de routage
                type filter hook prerouting priority -300; policy accept;

                # Les paquets Syslog envoyés au relais (10.0.0.200:514)
                # sont dirigés vers la chaîne cmultiply
                iifname $INT ip daddr $DST0 udp dport 514 counter goto cmultiply
        }

        chain cmultiply {
                # Duplique et modifie les paquets Syslog
                jump cdnatdup

                # Supprime le paquet original après la création des copies
                counter drop
        }

        chain cdnatdup {
                # Première copie : 10.0.0.202:514
                # Modifie uniquement l’adresse IP de destination.
                # L’adresse IP source et le port UDP de destination d’origine sont conservés.
                ip daddr set $DST1 dup to $DST1 device $INT counter

                # Deuxième copie : 10.0.0.201:9003
                # Remplace l’adresse IP source 10.0.0.1 par 10.0.0.12.
                ip saddr 10.0.0.1 ip saddr set 10.0.0.12 counter

                # Modifie l’adresse IP et le port UDP de destination,
                # puis duplique le paquet obtenu.
                ip daddr set $DST2 udp dport set 9003 dup to $DST2 device $INT counter
        }
}
  • Appliquez ensuite la configuration :
root@10.0.0.200:~# nft -f /etc/nftables.conf

Vérification

Maintenant que nos règles nftables sont appliquées, vérifions que tout fonctionne comme prévu.

  • Depuis le relais (10.0.0.200), commencez par vérifier que les règles sont correctement chargées et surveillez les compteurs de paquets. Appuyez sur Ctrl+C pour arrêter la commande :
root@10.0.0.200:~# watch nft -a list ruleset
  • Installez tcpdump sur les hôtes 10.0.0.201 et 10.0.0.202 :
root@10.0.0.201:~# apt update && apt install tcpdump -y
  • Exécutez tcpdump sur chaque hôte en utilisant le port UDP correspondant :
root@10.0.0.201:~# tcpdump -nA -i ens18 udp port 9003
root@10.0.0.202:~# tcpdump -nA -i ens18 udp port 514
  • Si le pare-feu n’est pas encore configuré, vous pouvez simuler l’envoi d’un message Syslog avec la commande logger :
root@host:~# logger -n 10.0.0.200 -P 514 -d "std.rocks"
  • Les messages Syslog dupliqués doivent apparaître dans la sortie de tcpdump :
root@10.0.0.201:~# tcpdump -nA -i ens18 udp port 9003
listening on ens18, link-type EN10MB (Ethernet), snapshot length 262144 bytes
20:56:00.089029 IP 10.0.0.12.62522 > 10.0.0.201.9003: SYSLOG user.notice, length: 125
E.....@.=......d.....:......<13>1 2026-09-20T20:56:00.086533+02:00 std.rocks john - - [timeQuality tzKnown="1" isSynced="1" syncAccuracy="968000"] std.rocks
  • Sur 10.0.0.202, le paquet conserve son adresse IP source et son port UDP de destination d’origine :
IP 10.0.0.1.62522 > 10.0.0.202.514: SYSLOG user.notice, length: 125
...
  • Sur 10.0.0.201, l’adresse IP source a été remplacée par 10.0.0.12 et le port UDP de destination par 9003 :
IP 10.0.0.12.62522 > 10.0.0.201.9003: SYSLOG user.notice, length: 125
...