EN
EUR
Free editionFree Install

Install ToutWAF on a Raspberry Pi

ToutWAF on a Raspberry Pi or another 64-bit ARM server: required system, target boards, memory and storage. Experimental: never tried on real ARM hardware.

All ways to install

Which version you install

The public version is a development version, named 0.3.0-dev. Its name stays the same: each publication replaces the previous one, and a build identifier tells two builds apart. No stable version exists yet: it will only be published once every system and package has been tested end to end. The commands on this page therefore install from the dev channel. A development version can contain bugs: try it on a test site before relying on it.

At a glance

  • A 64-bit system is required: Raspberry Pi OS 64-bit (Bookworm / Debian 12 or newer), Ubuntu 22.04 or 24.04 arm64, Debian 12 or 13 arm64. 32-bit (armv7l, armhf) is not supported and not planned, even on a Pi 4 or 5.
  • Target boards: Raspberry Pi 5, 4, 400 and CM4; Pi 3 and CM3 (1 GB: data plane only); Pi Zero 2 W (512 MB: not recommended). Pi 2 v1.1, Zero, Zero W and Pi 1: not supported. Other arm64 servers (Graviton, Ampere) use the same build.
  • Memory: the installer warns below 1 GB; for all-in-one (console, data plane and policy database on the same board) plan for 2 GB or more.
  • Storage: prefer an SSD or a good USB or NVMe drive to an SD card, which wears out with continuous writes and can be corrupted by a power loss. Choose the location with --home.

The commands, step by step

Check that the system is 64-bit

uname -m must print aarch64 and getconf LONG_BIT must print 64. Otherwise flash a 64-bit image with Raspberry Pi Imager: an in-place conversion is not possible.

bash
uname -m                    # aarch64 = 64-bit kernel (armv7l = 32-bit: unsupported)
getconf LONG_BIT            # must print 64
dpkg --print-architecture   # Debian family: arm64 is required (armhf = 32-bit system)

Check compatibility without installing

The script prints the verdict and the table of supported systems, and changes nothing on the machine.

bash
curl -fsSL https://repo.qu3ntin.com/toutwaf/toutwaf/-/raw/dev/install.sh -o install.sh
sudo bash install.sh --check-compat

Install with the one-line installer

The script downloads the native binaries for your architecture, creates a dedicated unprivileged user and installs the hardened systemd services toutwaf-dp (data plane, ports 80 and 443) and toutwaf-cp (control plane and console, port 9443), then prints your first-login information.

bash
curl -fsSL https://repo.qu3ntin.com/toutwaf/toutwaf/-/raw/dev/install.sh | sudo bash

Installer options

A new installation lives in a single home, /var/toutwaf (bin, conf, data and logs; change it with --home DIR or TOUTWAF_HOME), and the command-line tools are linked in /usr/local/bin. An installation made earlier keeps its own paths (/etc/toutwaf, /var/lib/toutwaf) and is never moved.

options
# only let your admin network reach the console (port 9443)
curl -fsSL https://repo.qu3ntin.com/toutwaf/toutwaf/-/raw/dev/install.sh | sudo bash -s -- --console-from 203.0.113.0/24

# do not touch the host firewall / choose the installation home
curl -fsSL https://repo.qu3ntin.com/toutwaf/toutwaf/-/raw/dev/install.sh | sudo bash -s -- --no-firewall
curl -fsSL https://repo.qu3ntin.com/toutwaf/toutwaf/-/raw/dev/install.sh | sudo bash -s -- --home /opt/toutwaf

# name the channel explicitly (the installer of the dev branch already takes the dev channel; no stable version exists yet)
curl -fsSL https://repo.qu3ntin.com/toutwaf/toutwaf/-/raw/dev/install.sh | sudo bash -s -- --channel dev

Watch memory before putting real traffic on it

No memory measurement has been made on ARM: watch it, keep the number of sites and the rule sets small on a small board, and enable swap with care (never heavy swap on an SD card).

bash
systemctl status toutwaf-dp --no-pager
free -h

Manage the services

Both services start at boot. Use these commands to start, stop or restart them.

systemd
sudo systemctl enable --now toutwaf-cp toutwaf-dp
sudo systemctl restart toutwaf-cp toutwaf-dp
sudo systemctl stop toutwaf-dp toutwaf-cp

Check the services

bash
sudo systemctl status toutwaf-cp toutwaf-dp --no-pager
toutwafctl doctor
curl -kI https://127.0.0.1:9443/
curl -s http://127.0.0.1:9101/healthz
sudo journalctl -u toutwaf-dp -u toutwaf-cp -n 50 --no-pager

Upgrade

Back up the configuration and the data, then run the installer again: it keeps your settings and rolls back by itself if the new version does not become healthy. The paths shown are those of a new installation (/var/toutwaf); an older installation keeps /etc/toutwaf and /var/lib/toutwaf. You can also update from the console, on the Updates page.

bash
sudo mkdir -p /var/toutwaf.bak
sudo cp -a /var/toutwaf/conf /var/toutwaf/data /var/toutwaf.bak/
curl -fsSL https://repo.qu3ntin.com/toutwaf/toutwaf/-/raw/dev/install.sh | sudo bash -s -- --update --yes
curl -s http://127.0.0.1:9101/healthz

Uninstall

The first block removes the services, the binaries and the firewall rules added by ToutWAF, and keeps your data. The second one also deletes configuration, data and logs.

bash
curl -fsSL https://repo.qu3ntin.com/toutwaf/toutwaf/-/raw/dev/install.sh -o install.sh
sudo bash install.sh --uninstall
purge
sudo bash install.sh --uninstall --purge

What is not verified

We prefer to say it plainly.

  • The arm64 build has been compiled and run only under emulation (QEMU): it has not been tested on any Raspberry Pi or other real ARM hardware. What this page says about real hardware is guidance, not a validated result.
  • The installer has not been run on arm64 (systemd, firewall, units); the hardened release build for arm64 has not been built.
  • No performance, memory or SD-card measurement has been made, and none is claimed: test your own traffic (toutwaf-dp bench) before relying on it.

Other ways to install

Learn more in the documentation