đŸ›Ąïž IntĂ©gration de Suricata dans VyOS via un conteneur

📘 Introduction

Ce document dĂ©crit la mise en place d’un conteneur Suricata sur un routeur VyOS afin d’analyser le trafic rĂ©seau en mode IDS/IPS.
L’objectif est d’obtenir une inspection des paquets transitant à travers le routeur, tout en gardant une configuration persistante dans /config.


đŸ§© Architecture gĂ©nĂ©rale

  • VyOS joue le rĂŽle de routeur principal.
  • Suricata est dĂ©ployĂ© dans un conteneur Docker gĂ©rĂ© nativement par VyOS.
  • La configuration et les rĂšgles de Suricata sont stockĂ©es dans le rĂ©pertoire persistant /config.
  • Le trafic rĂ©seau est redirigĂ© vers Suricata via iptables et NFQUEUE pour inspection.
        ┌──────────────┐
        │   Internet    │
        └──────┬───────┘
               │
        ┌──────┮───────┐
        │     VyOS      │
        │  (routeur)    │
        │                │
        │ ┌────────────┐ │
        │ │ Suricata   │ │
        │ │ (container)│ │
        │ └────────────┘ │
        └──────┬─────────┘
               │
         Réseau local

⚙ Configuration VyOS

Conteneur Suricata

set container name suricata allow-host-networks
set container name suricata arguments '-q 0 -q 1 -q 2 -q 3 --runmode workers'
set container name suricata capability 'net-admin'
set container name suricata capability 'sys-nice'
set container name suricata image 'jasonish/suricata:latest'
set container name suricata memory '6144'
set container name suricata volume config destination '/etc/suricata'
set container name suricata volume config source '/config/containers/suricata/etc'
set container name suricata volume logs destination '/var/log/suricata'
set container name suricata volume logs source '/var/log/suricata'
set container name suricata volume rules destination '/var/lib/suricata'
set container name suricata volume rules source '/config/containers/suricata/rules'
allow-host-networks : permet au conteneur d’accéder au réseau du routeur.

arguments : dĂ©finit les files NFQUEUE utilisĂ©es (-q 0 -q 1 -q 2 -q 3) et le mode de travail (–runmode workers).

capabilities : autorise les privilĂšges nĂ©cessaires pour l’analyse rĂ©seau.

volumes : montent les répertoires persistants du systÚme VyOS dans le conteneur.

📩 Organisation des fichiers

/config/
├── containers/
│   └── suricata/
│       ├── etc/          ← Configuration Suricata (suricata.yaml, classification.config, etc.)
│       └── rules/        ← Règles IDS (Emerging Threats, etc.)
├── scripts/
│   ├── suricata-update.sh  ← Script de mise à jour des règles
│   └── vyos-preconfig-bootup.script ← Script iptables exécuté au boot
└── ...

🔁 Redirection du trafic avec iptables

Le script /config/scripts/vyos-preconfig-bootup.script contient les rĂšgles suivantes :

# Marquer les paquets forwardés
iptables -t mangle -A FORWARD -j MARK --set-mark 10

# Rediriger vers Suricata via NFQUEUE
iptables -t mangle -A POSTROUTING -m mark --mark 10 -j NFQUEUE \
  --queue-balance 0:3 \
  --queue-cpu-fanout \
  --queue-bypass

Explications : Tous les paquets transitant (FORWARD) sont marqués.

Les paquets marqués sont envoyés à Suricata via NFQUEUE.

–queue-balance 0:3 : rĂ©partit la charge sur 4 files de traitement.

–queue-bypass : laisse passer le trafic si Suricata n’est pas actif (pas de coupure rĂ©seau).

C’est brutal, mais tout va ĂȘtre analysĂ©.

🧠 Mode d’analyse Suricata

Dans le fichier /config/containers/suricata/etc/suricata.yaml, le paramĂštre suivant doit ĂȘtre activĂ© :

host-mode: router

Cela indique que Suricata doit analyser le trafic forwardé (celui qui transite à travers le routeur iptables forward) et non le trafic local (iptables input/output)

🔄 Mise à jour automatique des rùgles

Une tùche planifiée VyOS gÚre la mise à jour quotidienne des rÚgles Suricata :

set system task-scheduler task update-suricata-rules executable path '/config/scripts/suricata-update.sh'
set system task-scheduler task update-suricata-rules interval '1d'

Le script /config/scripts/suricata-update.sh contient typiquement :

set -euo pipefail

LOGFILE="/var/log/suricata-update.log"
CONTAINER="suricata"
TAG="suricata-update"

# tableau des commandes suricata-update
COMMANDS=(
    "suricata-update"
    "suricata-update list-sources"
    "suricata-update list-enabled-sources"
    "suricata-update enable-source et/open"
    "suricata-update enable-source oisf/trafficid"
    "suricata-update -f"
)

# fonction log simple compatible root / non-root
log() {
    local level="$1"; shift
    local msg="$*"

    logger -t "$TAG" -p "user.${level}" "$msg"

    echo "$(date '+%F %T') - $msg" | sudo tee -a "$LOGFILE" >/dev/null
}

log info "=== Mise à jour des règles Suricata ==="

if ! sudo podman ps --format '{{.Names}}' | grep -qx "$CONTAINER"; then
    log error "Erreur : conteneur '$CONTAINER' introuvable."
    exit 1
fi

for CMD in "${COMMANDS[@]}"; do
    log info "Exécution de '$CMD' dans le conteneur..."
    if ! sudo podman exec --user suricata "$CONTAINER" $CMD 2>&1 | sudo tee -a "$LOGFILE"; then
        log error "Échec de l'exécution de '$CMD'."
        exit 2
    fi
done

log info "Redémarrage du conteneur Suricata..."
if ! /opt/vyatta/bin/vyatta-op-cmd-wrapper restart container "$CONTAINER" 2>&1 | sudo tee -a "$LOGFILE"; then
    log error "Erreur lors du redémarrage."
    exit 3
fi

log info "Mise à jour terminée avec succès."

📡 Synchronisation de la configuration Pour sauvegarder ou rĂ©cupĂ©rer la configuration VyOS (et donc Suricata), on peut utiliser rsync :

/usr/bin/rsync -avz --rsync-path="sudo rsync" jbsky@
<IP_VYOS>:/config/ ./vyos/config/

Cette méthode permet :

De récupérer la configuration complÚte du routeur.

De la versionner dans un dépÎt Git.

De la restaurer facilement sur une autre instance VyOS.

📈 Points forts du setup ✅ Conteneurisation propre et isolĂ©e ✅ Configuration persistante dans /config ✅ Inspection inline via NFQUEUE ✅ Mise Ă  jour automatique des rĂšgles ✅ Sauvegarde facile par rsync

⚠ Points Ă  surveiller Performance : NFQUEUE peut introduire une lĂ©gĂšre latence ; si besoin, envisager AF_PACKET. => franchement, je ne vois pas la diff, je plafonne Ă  1GB avec iperf3.

Sécurité : allow-host-networks expose le conteneur au réseau hÎte, à restreindre si possible. Mais dans ce cas, il faudrait une autre solution. :)

Logs : /var/log/suricata peut croütre rapidement — penser à une rotation ou une purge automatique.

exemple de logrotate, fichier avec root en tant qu’owner

/var/log/suricata/*.log /var/log/suricata/*.json
{
    daily
    maxsize 100M
    rotate 10
    missingok
    nocompress
    copytruncate
}

Mise Ă  jour du conteneur : vĂ©rifier rĂ©guliĂšrement la version de l’image jasonish/suricata:latest.

đŸ§© RĂ©fĂ©rences utiles Documentation VyOS – Containers

Suricata Documentation

NFQUEUE & Suricata Inline Setup

🏁 Conclusion

Cette intégration permet à VyOS de fonctionner comme un routeur IDS/IPS complet grùce à Suricata, tout en gardant une architecture modulaire, persistante et automatisée. Le tout repose sur des composants standard (containers, iptables, rsync) faciles à maintenir et à reproduire.

🛑 RĂ©serve personnel

  1. suricata bloque les connexions inactives.
  2. J’ai augmentĂ© la RAM Ă  6Go pour Ă©viter un Ă©ventuel crash, vu que j’en ai eu un rĂ©cĂ©ment, je surveille. logrotate n’Ă©tait pas fontionnel, Ă  voir si ça corrige.
  3. Je viens de doubler la rÚgle mark pour suivre que la carte ethernet wan, ça bloque toujours les connexions actives
iptables -t mangle -A FORWARD -j MARK --set-mark 10 -i wan.vlanX
iptables -t mangle -A FORWARD -j MARK --set-mark 10 -o wan.vlan

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *