AuthHound

authhound-probe vs eapol_test vs radtest

eapol_test and radtest are the two tools RADIUS admins have reached for over two decades, and both are excellent at what they were built for. authhound-probe sits in a different spot: the diagnosis workflow — one binary, no config file, plain-English verdicts with next steps, machine-readable output for RMM scripts. This page is a factual comparison so you can pick the right tool for the job at hand — including when that tool isn't ours.

What each tool is

eapol_test (part of Jouni Malinen's wpa_supplicant/hostap project) is the reference EAP test client. It plays both the EAP peer and the RADIUS client in one process, so it runs a complete EAP authentication against your server without needing a switch or AP in the middle. Nothing else covers as many EAP methods, and its full protocol trace is the ground truth when you're debugging genuinely weird interop problems.

radtest (from the FreeRADIUS utilities, a wrapper around radclient) is the fastest possible "does an Access-Request come back" sanity check. PAP by default — also CHAP and MSCHAP via radclient — but no EAP, so it can't authenticate the way real 802.1X clients do. Its virtue is ubiquity: it's already installed anywhere FreeRADIUS is.

authhound-probe is built for answering "why is 802.1X broken and which hop do I fix": real PEAP-MSCHAPv2 / EAP-TLS / EAP-TTLS / PAP logins with a verdict per layer (reachability → secret → auth → certificate → MTU), plus checks the classics don't attempt — path-MTU probing, BlastRADIUS posture, VLAN assertions, RadSec. Single signed binary for Linux, macOS and Windows.

Getting each one running

The install burden differs more than the feature lists do, so it's worth being concrete. radtest is one package (freeradius-utils) where it isn't already present. eapol_test is usually a source build — it's a test program the wpa_supplicant project doesn't ship by default, so you compile it with a build flag (Debian/Ubuntu package it as eapoltest, FreeBSD has a security/eapol_test port; on most other platforms, including every Windows box, you're building or out of luck):

# eapol_test is built from wpa_supplicant source with one extra config flag.
# Prereqs: a C toolchain and OpenSSL headers (build-essential + libssl-dev on
# Debian/Ubuntu; some defconfigs also want libnl/dbus headers).
git clone https://w1.fi/hostap.git
cd hostap/wpa_supplicant
cp defconfig .config
echo CONFIG_EAPOL_TEST=y >> .config
make eapol_test

The probe is a single static binary download — signed releases for Linux/macOS/Windows, a Docker image, or go install.

A working eapol_test PEAP config

If you go the eapol_test route, here's the common case done properly — a PEAP-MSCHAPv2 test that validates the server certificate the way your real clients would. One config file per scenario:

# peap.conf — one eapol_test scenario: PEAP-MSCHAPv2 as a corporate laptop would do it
network={
    key_mgmt=WPA-EAP
    eap=PEAP
    identity="alice"
    password="the-test-account-password"
    phase2="auth=MSCHAPV2"
    ca_cert="/etc/ssl/certs/corp-radius-ca.pem"
    # validate the server cert's name the way real clients do:
    domain_suffix_match="radius.corp.com"
}
chmod 600 peap.conf   # the account password lives in this file
eapol_test -c peap.conf -a 10.20.0.10 -s 'shared-secret'

You'll get a few hundred lines of protocol trace; the verdict is the last line — SUCCESS or FAILURE — and the exit code is 0 on success, which is what to script against.

⚠️ Two things to know before you paste that into a shared box: eapol_test only accepts the RADIUS shared secret as a command-line argument (-s), where it lands in shell history and ps, and the account password sits in the config file — hence the chmod 600 and a least-privilege test account, never a real login. Keeping credentials off the command line entirely (env var, --secret-file, or a no-echo prompt) is one of the things the probe does differently.

The equivalent probe run, for comparison:

# the same test with authhound-probe — no config file, secret via env,
# password prompted with no echo
export AUTHHOUND_RADIUS_SECRET='shared-secret'
authhound-probe radius test --server 10.20.0.10 --peap alice \
  --server-name radius.corp.com

At a glance

authhound-probe eapol_test radtest
Ships as Single static binary (Linux/macOS/Windows), signed releases Part of wpa_supplicant; usually compiled from source with CONFIG_EAPOL_TEST=y (some distros/ports package it) freeradius-utils package (a wrapper around radclient)
Configuration Command-line flags only wpa_supplicant-style config file per scenario Command-line arguments
PAP — (EAP only) ✅ (also CHAP, MSCHAP via radclient)
PEAP-MSCHAPv2
EAP-TTLS ✅ (inner PAP) ✅ (many inner methods)
EAP-TLS
Other EAP methods (FAST, PWD, SIM/AKA, …) ✅ widest coverage anywhere
Server certificate analysis (expiry, chain, name) ✅ with PASS/WARN/FAIL verdicts Cert is in the debug output; you interpret it
Path-MTU / EAP fragmentation probing ✅ (--mtu) fragment size is configurable, not probed
RadSec (RADIUS/TLS) testing ✅ (radsec test)
Status-Server (RFC 5997) liveness ✅ (radclient status)
BlastRADIUS (CVE-2024-3596) posture check
Multi-server comparison / flakiness stats ✅ (--server a,b, --count N) scriptable around it scriptable around it
Output Plain-English PASS/WARN/FAIL + what to check next Full protocol debug trace (excellent for deep debugging) Terse packet dump
Machine-readable output --json (versioned schema) + stable exit codes exit code exit code
Windows ✅ first-class (NPS-aware, .exe, Scheduled Task recipes) not practical via WSL/ports
Best at Fast diagnosis, monitoring scripts, handing a check to a colleague Exhaustive EAP method coverage, protocol-level debugging Instant PAP/secret sanity check where FreeRADIUS is installed

When eapol_test is still the right tool

Honestly: often. Reach for eapol_test when you need an EAP method the probe doesn't speak — EAP-FAST, EAP-PWD, EAP-SIM/AKA, or an exotic inner method — or when you want the full protocol trace to debug a genuinely weird interop problem. It is the reference implementation; its debug output is the ground truth, and no other tool comes close on method coverage. The cost is getting a build of it, writing a config file per scenario, and reading raw protocol output.

radtest keeps its place too: on a box that already has FreeRADIUS installed, it's a two-second answer to "does the server accept this PAP login / is the secret right" — no download needed.

When the probe is the better fit

Use authhound-probe when the question is "why is 802.1X broken and which hop do I fix" or "script this check into my RMM": one command with flags, a verdict per layer with guidance on what to check next, --json with a versioned schema and stable exit codes, and the same binary on the Windows box next to your NPS server. It covers the methods that dominate real networks (PAP, PEAP-MSCHAPv2, EAP-TTLS/PAP, EAP-TLS) plus the checks the classics don't attempt: certificate expiry/name verdicts, path-MTU probing, RadSec, BlastRADIUS posture, and multi-server drift comparison.

They compose, too: plenty of workflows start with the probe to localise the failure in seconds, then drop into eapol_test for a protocol-level trace of the one broken method.

FAQ

What is eapol_test?

eapol_test is a test utility from Jouni Malinen’s wpa_supplicant/hostap project. It acts as both the EAP peer and the RADIUS client in one process, so it can run a complete EAP authentication (PEAP, EAP-TLS, EAP-TTLS, EAP-FAST, and many more) against a RADIUS server directly — no switch or access point needed. It is the reference EAP test client, with the widest method coverage of any tool.

How do I install eapol_test?

eapol_test is usually compiled from wpa_supplicant source: clone the hostap repository, copy defconfig to .config in the wpa_supplicant directory, add CONFIG_EAPOL_TEST=y, and run make eapol_test. You need a C toolchain and OpenSSL development headers. Some systems package it — Debian/Ubuntu ship an eapoltest package and FreeBSD has a security/eapol_test port — but on most platforms you build it yourself.

Does eapol_test run on Windows?

Not practically. There are no maintained Windows binaries, so testing from a Windows box means WSL or a different tool. authhound-probe ships a signed Windows .exe and radtest can run under WSL where FreeRADIUS utilities are installed.

What is the difference between eapol_test and radtest?

radtest (a wrapper around radclient from the FreeRADIUS utilities) sends plain Access-Request packets — PAP by default, also CHAP and MSCHAP — but speaks no EAP at all, so it cannot test PEAP or EAP-TLS the way real 802.1X clients authenticate. eapol_test is the opposite: full EAP with the widest method coverage, but no plain PAP. They answer different questions.

See also

Something in this comparison outdated or unfair? The maintained source of truth is COMPARISON.md in the probe repo — open an issue there; factual corrections are very welcome.

Running the probe by hand answers "is it working right now?". AuthHound is building monitoring that runs these same checks on a schedule from every site and alerts you when one drifts — early access:

No spam, no sharing — one email when it's ready, and you can reply to be removed anytime.