AuthHound

FreeRADIUS clients.conf example — generate your client block

Registering a RADIUS client is the same three facts on every server: a name, the client's source IP, and a shared secret. Fill them in once and get both the FreeRADIUS clients.conf block and the Windows NPS PowerShell equivalent, ready to paste.

🔒 Runs entirely in your browser — nothing is uploaded. The secret is generated locally with your browser's CSPRNG and never leaves this tab. Verify it: open DevTools → Network and watch nothing get sent while you generate. The generator is open source — read the code.
Shared secret
Show:

What a working clients.conf client block looks like

This is the generator's exact output for a client named office-ap-01 at 192.0.2.10 — the minimum FreeRADIUS 3.x needs to stop ignoring a client, plus the current hardening default:

# FreeRADIUS 3.x client block — generated by radius-client-config (runs locally; nothing is transmitted)
# Add to clients.conf:
#   Debian/Ubuntu: /etc/freeradius/3.0/clients.conf
#   RHEL/Rocky:    /etc/raddb/clients.conf
client office-ap-01 {
	ipaddr = 192.0.2.10
	secret = "<32-character-generated-secret>"
	# Require Message-Authenticator on every request from this client
	# (BlastRADIUS hardening). Requires FreeRADIUS 3.2.5+ / 3.0.27+;
	# remove this line on older versions.
	require_message_authenticator = yes
}
# Check syntax, then reload:
#   Debian/Ubuntu: freeradius -XC && systemctl reload freeradius
#   RHEL/Rocky:    radiusd -XC && systemctl reload radiusd
# Secret: 32 chars from a 76-symbol set ≈ 199 bits of entropy.
# Note: if NAT sits between the client and the server, the server sees a
# different source IP — register the post-NAT address instead.

Three details people miss: the file lives at /etc/freeradius/3.0/clients.conf on Debian/Ubuntu but /etc/raddb/clients.conf on RHEL/Rocky; the block only takes effect after a reload; and require_message_authenticator is a per-client setting that needs FreeRADIUS 3.2.5+ (or 3.0.27+) — on older builds, drop the line rather than wonder why the config check fails.

Add a RADIUS client in NPS with PowerShell

The Windows equivalent is one cmdlet — but the part everyone forgets is the restart. NPS does not apply a new RADIUS client until the service restarts:

# Windows NPS RADIUS client — generated by radius-client-config (runs locally; nothing is transmitted)
# Run in an ELEVATED PowerShell prompt on the NPS server:
New-NpsRadiusClient -Name 'office-ap-01' -Address '192.0.2.10' -SharedSecret '<32-character-generated-secret>' -AuthAttributeRequired $true
Restart-Service IAS  # NPS only applies new RADIUS clients after a service restart
# -AuthAttributeRequired $true = console option "Access-Request messages must
#   contain the Message-Authenticator attribute" (BlastRADIUS hardening;
#   matches require_message_authenticator on the FreeRADIUS side).
# GUI alternative: nps.msc > RADIUS Clients and Servers > RADIUS Clients >
#   New > "Address (IP or DNS)": 192.0.2.10
# NPS limits shared secrets to 128 characters.
# Secret: 32 chars from a 76-symbol set ≈ 199 bits of entropy.
# Note: if NAT sits between the client and the server, the server sees a
# different source IP — register the post-NAT address instead.

New-NpsRadiusClient ships with the NPS role on Windows Server 2012 and later. -AuthAttributeRequired $true is the PowerShell spelling of the console checkbox "Access-Request messages must contain the Message-Authenticator attribute" — the NPS side of the same BlastRADIUS hardening as require_message_authenticator above.

The fix for "Ignoring request from unknown client"

When radiusd -X shows Ignoring request to auth address ... from unknown client, FreeRADIUS is dropping the packet without any reply — no client {} block covers that source IP. The NAS never sees a reject; it sees a timeout, retries, and reports "RADIUS server not responding" while the server works fine for everyone it knows. The fix is exactly the block this page generates, registered for the IP in the log line. The full failure — including why multi-homed NAS devices keep re-triggering it — is in the error library: FreeRADIUS "unknown client" — why the NAS times out, not fails. NPS behaves the same way: unregistered clients get silence, not event 6274.

The NAT trap: register the IP the server actually sees

The client entry must match the source IP as it arrives at the RADIUS server. If NAT sits anywhere in the path — a branch firewall, a VPN concentrator, a cloud NAT gateway — that is the post-NAT address, not the address configured on the NAS. This is the trap that keeps "unknown client" alive after you're sure you added the entry: you registered the address the NAS thinks it has. When in doubt, take the IP from the server's own log line, or register the NAT pool as a CIDR range (FreeRADIUS accepts CIDR in ipaddr; NPS accepts an IP address range syntax of its own, so the generator notes the caveat when you enter a CIDR).

Shared secrets: length beats cleverness

The shared secret is the only thing authenticating your NAS to the RADIUS server outside of TLS, and RADIUS's own MD5 construction is weak by modern standards — the practical defense is entropy. Short, human-invented secrets are the ones offline attacks recover. The generator defaults to 32 random characters from a 76-symbol set (≈199 bits), created with the browser's CSPRNG (crypto.getRandomValues) via Go's crypto/rand — and pairs it with the Message-Authenticator requirement on both platforms, the concrete mitigation for the BlastRADIUS class of forgery. One secret per client, please: shared "site secrets" turn one leaked switch config into every switch's problem.

A registered client works until the day the secret is rotated on one side only. AuthHound is building continuous monitoring that catches that drift first — early access:

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