TekRADIUS 首次拨号自动绑定 MAC 的 SQL 触发器方案
🚀 实验环境:
- 网关:RouterOS v7.19.4
- 认证:TekRADIUS v5.7
- 数据:SQL Server 2008 R2 Enterprise
使用 SQL Server 触发器(Trigger)方案,专门为 TekRADIUS 认证系统设计。它的核心功能是:在用户第一次成功拨号上网时,自动将其当前的 MAC 地址与账号绑定,以及排除特殊账号,实现“首次登录自动锁死硬件”的效果。
USE TekRADIUS;
GO
IF OBJECT_ID('BindMacOnFirstLogin', 'TR') IS NOT NULL
DROP TRIGGER BindMacOnFirstLogin;
GO
CREATE TRIGGER BindMacOnFirstLogin
ON dbo.Accounting
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @UserName NVARCHAR(128);
DECLARE @Mac NVARCHAR(64);
SELECT TOP 1
@UserName = UserName,
@Mac = CallingStationId
FROM inserted
WHERE CallingStationId IS NOT NULL AND UserName IS NOT NULL;
-- 排除 111 和 aaa 用户
IF @UserName NOT IN ('111', 'aaa')
BEGIN
-- 检查该用户是否已经绑定 MAC
IF NOT EXISTS (
SELECT 1 FROM dbo.Users
WHERE UserName = @UserName AND Attribute = 'ietf|31'
)
BEGIN
-- 插入绑定信息
INSERT INTO dbo.Users (UserName, Attribute, AttrType, Val)
VALUES (@UserName, 'ietf|31', 0, @Mac);
PRINT '首次拨号自动绑定 MAC 成功:' + @UserName + ' → ' + @Mac;
END
END
ELSE
BEGIN
PRINT '跳过账号:' + @UserName + '(不进行 MAC 绑定)';
END
END;
GO
📌 以下是代码的详细逻辑拆解:
- 环境准备
USE TekRADIUS;:切换到 TekRADIUS 的数据库。IF OBJECT_ID...DROP...:如果数据库里已经存在名为BindMacOnFirstLogin的触发器,先把它删掉,方便重新创建(防止冲突)。
- 触发条件
ON dbo.Accounting:监控Accounting(计费/日志)表。AFTER INSERT:每当该表有新记录插入(通常意味着有人尝试上线或产生了计费请求)时,触发器就会运行。
核心逻辑(
BEGIN...END块)代码通过以下步骤处理自动化绑定:
获取用户信息:
从刚插入的数据(inserted表)中提取UserName(用户名)和CallingStationId(在 RADIUS 协议中,这通常代表用户的 MAC 地址)。白名单过滤:
IF @UserName NOT IN ('111', 'aaa'):如果是111和aaa,则跳过不绑定。这防止了公共账号被意外锁死在某台设备上。检查是否已绑定:
查询dbo.Users表,看看这个用户是否已经存在属性为ietf|31(这是 RADIUS 中代表Calling-Station-Id即 MAC 绑定的属性代码)的记录。执行绑定:
如果该用户还没绑定过 MAC,触发器会自动向dbo.Users表插入一条新指令,将该用户的Val(值)设定为当前的 MAC 地址。
🤔 这段代码的作用是“懒人管理”:
管理员不需要手动收集每个人的 MAC 地址。用户领到账号后,第一次拨号时,系统会自动抓取他手机或电脑的 MAC 并写入数据库。从第二次开始,如果该用户换了一台设备拨号,由于 MAC 地址与数据库不匹配,TekRADIUS 将会拒绝其登录。