Installation¶
Install the Automated Cryptography Discovery & Inventory (ACDI) Sniffer on a Linux host. Most operators should use the RPM package, which installs the binary, a systemd service, and a default configuration in one step. A manual install is also documented for environments where the RPM cannot be used.
Requirements¶
| Item | Requirement |
|---|---|
| Operating system | RHEL 8 or Rocky Linux 8 |
| Architecture | x86_64 or aarch64 |
| Privileges | root (or sudo) to install and to capture live traffic |
| Network access | A capture interface, or .pcap / .pcapng files to process |
The sniffer captures live traffic using the CAP_NET_RAW capability. Installing the
package configures this for you; the manual install sets it
explicitly.
Note
The RPM's runtime dependencies (libpcap, postgresql-libs, openssl-libs,
systemd, libcap) are pulled from the standard RHEL/Rocky repositories during
installation. The host must be able to reach those repositories, or have the
packages already present.
Install from RPM¶
This is the recommended path.
1. Obtain the package¶
You will be provided an ACDI Sniffer RPM for your architecture, named like:
pqc-sniffer-linux-amd64-2.0.0.97.beta1.rpm # x86_64
pqc-sniffer-linux-arm64-2.0.0.97.beta1.rpm # aarch64
Copy it to the target host, for example:
scp pqc-sniffer-linux-amd64-2.0.0.97.beta1.rpm user@host:/tmp/
2. Install the package¶
Use dnf so runtime dependencies resolve automatically. Point it at the local file
with a ./ (or absolute) path:
sudo dnf install ./pqc-sniffer-linux-amd64-2.0.0.97.beta1.rpm
Installation places the following on the system:
| Path | Purpose |
|---|---|
/usr/bin/pqc-sniffer |
The sniffer binary (on PATH) |
/etc/pqc-sniffer/config.yaml |
Active configuration (preserved on upgrade) |
/etc/pqc-sniffer/config.yaml.example |
Reference configuration |
/usr/lib/systemd/system/pqc-sniffer.service |
systemd service unit |
/var/log/pqc-sniffer/ |
Default output and log directory |
The package also grants the binary packet-capture capability
(setcap cap_net_raw+eip) so it can capture without running the whole process as an
unconfined root user.
3. Verify the install¶
pqc-sniffer --version
4. Configure¶
The installed config.yaml is a starter file. This guide runs the sniffer in
offline mode, where it writes NDJSON to local files. Replace the configuration with
the minimal offline setup below, then set your identity and capture interface:
sudo nano /etc/pqc-sniffer/config.yaml
sniffer:
customer_id: "your-customer-id"
sniffer_id: "sniffer-prod-01"
mode: "offline" # write NDJSON to file (not to a database)
capture:
interface: "eth0" # your capture interface — see `ip link`
mode: "local"
bpf_filter: "tcp or udp"
promiscuous: true
offline_output:
output_file: "/var/log/pqc-sniffer/"
append_mode: true
buffer_size_kb: 64
rotation_enabled: true
max_size_mb: 100
max_files: 10
logging:
level: "info"
file:
path: "/var/log/pqc-sniffer/pqc-sniffer.log"
rotation_enabled: true
max_size_mb: 100
max_files: 10
database:
enabled: false # required for file-only output
monitoring:
heartbeat_interval_seconds: 60
metrics:
enabled: false
Important
sniffer.mode must be offline for file output. Left unset, the sniffer defaults to
connected mode and expects a PostgreSQL database instead of writing
connections.ndjson.
See the YAML Reference for every setting, and Configuration Examples for ready-to-adapt patterns. Validate your changes before starting the service:
sudo pqc-sniffer --config /etc/pqc-sniffer/config.yaml --validate-config
5. Start the service¶
sudo systemctl start pqc-sniffer # start now
sudo systemctl enable pqc-sniffer # start automatically on boot
Check status and logs:
systemctl status pqc-sniffer
sudo journalctl -u pqc-sniffer -f
Confirm output is being written:
With rotation_enabled: true, the sniffer writes indexed files such as
connections.0.ndjson, connections.1.ndjson, and so on. With
rotation_enabled: false, it writes the base file connections.ndjson.
latest_output=$(ls -t /var/log/pqc-sniffer/connections*.ndjson | head -n 1)
tail -5 "$latest_output"
The service restarts automatically on failure. See Running the Sniffer for runtime behavior and Deployment & Management for operational guidance.
Upgrade¶
Install the newer RPM the same way; dnf performs an upgrade in place:
sudo dnf install ./pqc-sniffer-linux-amd64-<new-version>.rpm
sudo systemctl restart pqc-sniffer
Your /etc/pqc-sniffer/config.yaml is preserved across upgrades. A new reference file
is always written to config.yaml.example so you can compare against the latest
defaults.
Uninstall¶
sudo dnf remove pqc-sniffer
Removal stops and disables the service. The log directory
/var/log/pqc-sniffer/ is cleaned up on a full uninstall (it is retained across
upgrades).
Manual install¶
Use this path only when the RPM cannot be used. It performs the same essential steps
by hand, starting from a standalone pqc-sniffer binary for your architecture.
1. Place the binary¶
sudo install -m 0755 pqc-sniffer /usr/bin/pqc-sniffer
2. Confirm runtime libraries are present¶
ldd /usr/bin/pqc-sniffer | grep "not found"
No output means every shared library is resolved. If anything is reported as
not found, install the matching package (libpcap, postgresql-libs,
openssl-libs, libcap) from your OS repositories.
3. Grant capture capability¶
sudo setcap cap_net_raw+eip /usr/bin/pqc-sniffer
pqc-sniffer --version
4. Create the configuration¶
sudo mkdir -p /etc/pqc-sniffer /var/log/pqc-sniffer
sudo cp example.yaml /etc/pqc-sniffer/config.yaml
sudo nano /etc/pqc-sniffer/config.yaml
Set sniffer.customer_id, sniffer.sniffer_id, and capture.interface as shown
above, then validate:
sudo pqc-sniffer --config /etc/pqc-sniffer/config.yaml --validate-config
5. Run it¶
For a quick foreground test:
sudo pqc-sniffer --config /etc/pqc-sniffer/config.yaml --foreground
To run it as a managed service, install the systemd unit and enable it — see
Deployment & Management for the unit file and the
systemctl steps.
Next steps¶
- Quick Start — capture to NDJSON in a few commands
- Running the Sniffer — runtime behavior and CLI overrides
- Troubleshooting — no output, permission, and capture issues