HAProxy 2.0 - Mise en Place Du Traffic Mirroring

Installation du binaire

Le binaire de pour le mirroring n’est pas fourni de base, il faut donc le compiler l’installer

# From https://www.haproxy.com/fr/blog/haproxy-traffic-mirroring-for-real-world-testing/
$ sudo apt update
# Lib necessaires
$ sudo apt install -y autoconf automake build-essential git libcurl4-openssl-dev libev-dev libpthread-stubs0-dev pkg-config
# Récuperation de la source
$ git clone https://github.com/haproxytech/spoa-mirror
$ cd spoa-mirror
# Init build script
$ ./scripts/bootstrap
$ ./configure
# compile
$ make all
$ sudo cp ./src/spoa-mirror /usr/local/bin/

Test de fonctionnement

Pour tester le fonctionnement, lancer le programme avec la ligne de commande suivante:

spoa-mirror --runtime 0 --mirror-url https://test.url --logfile /var/log/haproxy-mirror.log

Si le programme ne rend pas directement le main, tout va bien, n’oubliez pas d’enlever le fichier /var/log/haproxy-mirror.log. Sinon vous pouvez utiliser le fichier de log /var/log/haproxy-mirror.log pour vous aider à comprendre d’où vient le probléme.

Configuration avec haproxy

Gestion du programme par haproxy

Nous allons utiliser la fonction de lancement de programme externe de HAProxy afin de gerer le processus spoa-mirror. Il faut éditer le fichier de configuration de HAProxy.

program mirror
    command spoa-mirror --runtime 0 --mirror-url https://url.mirror

Attention, pour que la section program marche dans haproxy, il faut que le serveur fonctionne en mode master worker. ex:

    # master-worker required for `program` section
    # enable here or start with -Ws
    master-worker
    mworker-max-reloads 3

Quand le serveur est redemarré, on doit voir le process managé par haproxy.

 Main PID: 22796 (haproxy)
   CGroup: /system.slice/haproxy.service
           ├─22796 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock
           ├─22798 spoa-mirror --runtime 0 --mirror-url https://test.url
           └─22799 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock

configuration de HAProxy pour le mirroring

Pour activer le mirroring il faut rajouter un filtre SPOE dans la configuration.

# ajout de la conf dans le frontend
frontend main_lb
 filter spoe  engine mirror  config /etc/haproxy/mirror.conf

# Creation du backend pour le mirror
backend mirroragents
    mode tcp
    balance roundrobin
    timeout connect 5s
    timeout server 5s
    server agent1 localhost:12345

Il faut ensuite créer un fichier de configuration du filtre dans /etc/haproxy/mirror.conf. Dans cet exemple, je limite la réplication à l’URL API.

# même nom que dans le filter
[mirror]
spoe-agent mirror
    log global
    messages mirror
    # Indique le backend a utiliser configuré dans HAProxy
    use-backend mirroragents
    timeout hello 500ms
    timeout idle 5s
    timeout processing 5s


spoe-message mirror
    args arg_method=method arg_path=path arg_ver=req.ver arg_hdrs=req.hdrs_bin arg_body=req.body
    # Limite la réplication a une URL spécifique
    event on-frontend-http-request if { path_beg /api }

Il suffit de reload HAProxy pour que la configuration soit prise en compte.

Pour verifier que tout fonctionne, utilisez l’URL et regardez si vous voyez passer des logs avec le prefix SPOE dans le fichier de log de HAProxy.

grep SPOE /var/log/haproxy.log