• 返回
  • 最后更新
  • 2020-10-04 11:18:14 +0800 CST

freeradius 的 rest 模块的使用系列(一)

freeradius

比起 freeradius 的 mysql 模块, rest 模块要更加简洁易用, rest 模块提供了一个 API 风格的模式, 让使用者不用局限在固有的数据结构上进行扩展.

这是本系列文章的第一篇, 后续将继续围绕 freeradius 与 rest 模块深入展开. 因为仅仅知道如何把API请求发过去是不够的的, 你还需要知道如何设计你的API服务.需要绕过那些坑.

几个重要的配置

注意,在不同的 linux 发行版下安装freeradius, 默认的配置文件目录可能会有些差别

/etc/freeradius/sites-enabled/default

参考配置文件 /etc/freeradius//sites-enabled/default

这个配置文件的修改基本上没有太大的变化, 只是在 authorize, authenticate, accounting 定义中加入 rest, 其他 post-auth 等不是必须的

/etc/freeradius/mods-enabled/rest

参考配置文件 /etc/freeradius/mods-enabled/rest

注意几个关键的配置:

  • tls 配置

如果你的API服务采用了 https 部署, 那么需要注意配置 tls 部分, 如果没有采用严格的证书, 请将 check_cert 和 check_cert_cn 设置为 no

tls {
	ca_file	= ${certdir}/cacert.pem
	ca_path	= ${certdir}

	certificate_file        = /path/to/radius.crt
	private_key_file	= /path/to/radius.key
	private_key_password	= "supersecret"
	random_file		= /dev/urandom

	#  Server certificate verification requirements.  Can be:
	#    "no"  (don't even bother trying)
	#    "yes" (verify the cert was issued by one of the
	#	   trusted CAs)
	#
	#  The default is "yes"
	check_cert = no

	#  Server certificate CN verification requirements.  Can be:
	#    "no"  (don't even bother trying)
	#    "yes" (verify the CN in the certificate matches the host
	#	   in the URI)
	#
	#  The default is "yes"
	check_cert_cn = no
}
  • api 连接地址

connect_uri = “https://jxradius.net:19101”

配置你的 API 服务地址

  • radius 协议参数配置

注意, 如果使用了 https 的,这里把 tls开启

这里的配置是非常灵活的, 但是你可以根据你的习惯把他配置的让你觉得更容易使用

要发送哪些参数, 以及参数的名称, 发送形式都是可以定义的, 这里采用了 POST 提交 form 的形式, 如果你希望提交json, 也是可以的. 具体怎么配置还要结合API服务的处理逻辑.

    authorize {
            #uri = "${..connect_uri}/user/%{User-Name}/mac/%{Called-Station-ID}?action=authorize"
            uri = "${..connect_uri}/freeradius/authorize"
            method = 'post'
            body = 'post'
            data = "username=%{urlquote:%{User-Name}}&nasip=%{urlquote:%{NAS-IP-Address}}&nasid=%{urlquote:%{NAS-Identifier}}"
            tls = ${..tls}
    }

    authenticate {
            #uri = "${..connect_uri}/user/%{User-Name}/mac/%{Called-Station-ID}?action=authenticate"
            uri = "${..connect_uri}/freeradius/authenticate"
            method = 'post'
            body = 'post'
            data = "username=%{urlquote:%{User-Name}}&nasip=%{urlquote:%{NAS-IP-Address}}&nasid=%{urlquote:%{NAS-Identifier}}"
            #force_to = 'plain'
            tls = ${..tls}
    }


    accounting {
            #uri = "${..connect_uri}/user/%{User-Name}/sessions/%{Acct-Unique-Session-ID}"
            uri = "${..connect_uri}/freeradius/accounting"
            method = 'post'
            body = 'post'
	        tls = ${..tls}
            data = "username=%{urlquote:%{User-Name}}&nasip=%{urlquote:%{NAS-IP-Address}}&nasid=%{urlquote:%{NAS-Identifier}}\
            &acctSessionId=%{urlquote:%{Acct-Session-Id}}&macAddr=%{urlquote:%{Calling-Station-Id}}&acctSessionTime=%{urlquote:%{Acct-Session-Time}}\
            &acctInputOctets=%{urlquote:%{Acct-Input-Octets}}&acctOutputOctets=%{urlquote:%{Acct-Output-Octets}}\
            &acctInputGigawords=%{urlquote:%{Acct-Input-Gigawords}}&acctOutputGigawords=%{urlquote:%{Acct-Output-Gigawords}}\
            &acctInputPackets=%{urlquote:%{Acct-Input-Packets}}&acctOutputPackets=%{urlquote:%{Acct-Output-Packets}}\
            &nasPortId=%{urlquote:%{NAS-Port-Id}}&framedIPAddress=%{urlquote:%{Framed-IP-Address}}\
            &sessionTimeout=%{urlquote:%{Session-Timeout}}&framedIPNetmask=%{urlquote:%{Framed-IP-Netmask}}\
            &acctStatusType=%{urlquote:%{Acct-Status-Type}}"
    }

/etc/freeradius/mods-enabled/eap

参考配置文件 /etc/freeradius/mods-enabled/eap

默认的eap配置启动可能会报错, 如果只是使用 mschapv2 可以参考配置简单设置

/etc/freeradius/clients.conf

参考配置文件 /etc/freeradius/clients.conf

这里采用了一个比较偷懒的配置, 即所有的接入NAS设备都采用同一个秘钥, 但是API 服务端可以再次对NAS IP进行鉴权

client localhost {
    ipaddr = 127.0.0.1
    proto = *
    secret = testing123
    require_message_authenticator = no
    nas_type	 = other
    limit {
        max_connections = 16
        lifetime = 0
        idle_timeout = 30
    }
}

client any {
        ipaddr          = 0.0.0.0/0
        secret          = mysecret
}

/etc/freeradius/users

参考配置文件 /etc/freeradius/users

需要将默认的认证类型设置为 rest

DEFAULT Auth-Type := rest   

一个更重要的问题

你可能发现完成以上配置以后, freeradius 还是启动不了, 原因是因为使用rest模式, 必须首先启动 API 服务, 然后启动 freeradius才行, 这是个比较强的依赖.

最重要的问题

到了最后, 问题来了, rest 的配置全部弄好了, 但是 API 服务呢.

作为一个开发人员, 因该如何去开发这个API服务呢.

关于这个问题, 将在接下来的文章中继续分享.