http://wiki.freeradius.org/contributing/Modules3#module-development_defining-configuration-items
这篇文章讲解如何添加一个模块
example模块
通过学习FR自带的模块,然后以此为基础进行修改,应该是上手最快的方法。
FR自带了example模块,位于src/modules/rlm_example
,正常情况下不会被编译。编译example模块首先要将模块名字加入到src/modules/stable
文件中。别问我怎么知道的 (逃
$ echo rlm_example>src/modules/stable
然后再运行make && make install
,可以发现build目录下已经有rlm_example的obj文件了,并安装到了/usr/local/lib
中。
模块被编译安装后,还需要在配置文件radiusd.conf中加入一个实例才会被服务器加载。
对于FR3.X版本,在/usr/local/etc/raddb/mods-available
目录下创建example文件,文件内容如下:
example {
integer = 0x10
boolean = true
string = "jinger"
ipaddr = "127.0.0.1"
}
上面{}中的参数是模块定义的参数,在服务器调用模块的instantiate函数时,由服务器将上述参数传递给instantiate函数。
然后enable该模块,方法是创建一个软链接到mods-enabled
文件夹中。(现在的server都这么搞的,如nignx等等)
$ cd mods-enabled
$ ln -s ../mods-available/example .
然后radiusd -X就可以看到example模块已经被加载了。
# Loaded module rlm_example
# Loading module "example" from file /usr/local/etc/raddb/mods-enabled/example
example {
integer = 16
boolean = true
string = "jinger"
ipaddr = 127.0.0.1
}
PS: 在Linux下我是用Qt Creator 来进行调试的,因为它支持vim插件。>_<
此外可以使用wireshark抓包来分析通信流程。过滤条件是udp.port == 1812
测试可以使用radtest:
$ echo "User-Name=hongjin,User-Password=111111,Framed-Protocol=PPP,state=ok" | /usr/local/bin/radclient localhost:1812 auth testing123
注意:请确保用户名密码、共享密钥的正确性(clients.conf中的secret,默认是testing123)。
在模块的authorize方法中设置AUTH_TYPE
当有一个request到来时,server会调用所有module的authorize方法(查看哪个module可以处理该request),如果某个module可以处理该request,那么需要设置一下AUTH_TYPE,随后该module的authenticate方法才会被调用(验证密码)
以example模块为例子:
在authorize方法添加如下代码:
if (!pair_make_config("Auth-Type", "EXAMPLE", T_OP_EQ)) { // 设置AUTH_TYPE
return RLM_MODULE_FAIL;
}
return RLM_MODULE_OK;
在site-enable/default中的authenticate{}中添加自定义的Auth-Type
Auth-Type EXAMPLE{
example
}
OK~