FreeRadius : 模块开发(二)

2019-07-13 09:00发布

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~