Converting MAC address formats
Alan DeKok
aland at deployingradius.com
Sat Apr 19 17:28:39 UTC 2025
On Apr 19, 2025, at 12:48 PM, Mike Diggins <diggins at mcmaster.ca> wrote:
> I'm using MAC address authentication against a FreeRADIUS Version 3.0.20 (RHEL8) server. My WLAN controller sends the MAC in the format 2c-7b-a0-2f-bb-f1 but FR seems to convert it to 2c7ba02fbbf1.
See the debug output. It tells you when it's rewriting the MAC.
The default policy to do this is in raddb/policy.d/canonicalization, rewrite_called_station_id and rewrite_calling_station_id. They're called from the "default" virtual server.
> My SQL database has the MACs in the 2c-7b-a0-2f-bb-f1 format. I added this to sites-enabled/default in the authorize section. I've tried many formats but can't seem to get it right. Can it be fixed or am I crazy and should just update the database with the expected format?
What do you mean "tried different formats"? If you don't want the Calling-Station-Id and Called-Station-Id attributes to be modified, then edit the "default" virtual server. Delete the calls to the policies which do the rewriting.
> # Check if User-Name is a MAC address in the correct format
> if ("%{User-Name}" =~ /^([0-9A-Fa-f:-]{12,17})$/) {
I don't understand why so many people do string expansions like that. The examples and default configuration shows that you can just do:
if (&User-Name =~ /..../) {
> update request {
> # Convert to lowercase (optional)
> Tmp-String-0 := "%{tolower:%{User-Name}}"
>
> # Remove non-alphanumeric characters (colons, dashes) using expr
> Tmp-String-1 := "%{expr:%{Tmp-String-0}:s/[-:]//g}"
No? What documentation says that the "expr" function can so s/text/replace/ ?? It can't. The documentation says the the expr function handles expressions, and math.
If you want to see how to do regular expression matching and rewriting of attributes, see raddb/policy.d/canonicalization, rewrite_called_station_id and rewrite_calling_station_id.
> # Assign cleaned MAC address to User-Name
> User-Name := "%{Tmp-String-1}"
> }
> }
>
> The debug output is:
>
> (0) suffix: Checking for suffix after "@"
> (0) suffix: No '@' in User-Name = "2c7ba02fbbf1", looking up realm NULL
> (0) suffix: No such realm "NULL"
> (0) [suffix] = noop
> (0) if ("%{User-Name}" =~ /^([0-9A-Fa-f:-]{12,17})$/) {
> (0) EXPAND %{User-Name}
> (0) --> 2c7ba02fbbf1
> (0) if ("%{User-Name}" =~ /^([0-9A-Fa-f:-]{12,17})$/) -> TRUE
> (0) if ("%{User-Name}" =~ /^([0-9A-Fa-f:-]{12,17})$/) {
> (0) update request {
> (0) EXPAND %{tolower:%{User-Name}}
> (0) --> 2c7ba02fbbf1
> (0) Tmp-String-0 := 2c7ba02fbbf1
> (0) Expected operator at "c7ba02fbbf1:s/[-:]//g"
Exactly. You invented some syntax for the expr function, and it has no idea what you mean. Don't do that.
Start with the examples I pointed to above. It should be quick and easy to do the rewrites.
Alan DeKok.
More information about the Freeradius-Users
mailing list