在上次组网完成之后,OpenWRT系统下ocserv不支持Radius认证的问题遗留了下来,后来也一直挂在心上,在一次看OpenWRT软件包源码的时候发现了端倪,问题很简单,OpenWRT为了尽量减小软件包的体积,把不常用的功能都没有进行编译,也就是ocserv的Makefile中默认的radius支持是没有启用的:
# ocserv avanced configuration menu "Configuration" depends on PACKAGE_ocserv config OCSERV_PAM bool "enable PAM" default n config OCSERV_SECCOMP bool "enable seccomp" depends on !arc default n config OCSERV_RADIUS bool "enable radius authentication" default n config OCSERV_PROTOBUF bool "use external libprotobuf" default y config OCSERV_HTTP_PARSER bool "use external libhttp-parser" default y endmenu
所以,若要在OpenWRT下让ocserv支持radius,则需要自己手动编译一下这个ocserv的包,勾选OCSERV_RADIUS选项就行了。
准备环境
安装一个Ubuntu系统,以Ubuntu为例,安装一下依赖
[root@ubuntu ~]# apt install build-essential ccache ecj fastjar file g++ gawk \ gettext git java-propose-classpath libelf-dev libncurses5-dev libncursesw5-dev \ libssl-dev python python2.7-dev python3 unzip wget rsync subversion swig \ time xsltproc zlib1g-dev
到https://downloads.openwrt.org/releases/ 找到你目标OpenWRT的版本号下对应cpu下的sdk文件
以我的树莓派3B为例,系统是19.07.7的版本,那么就是
[root@ubuntu ~]# wget https://downloads.openwrt.org/releases/19.07.7/targets/brcm2708/bcm2710/openwrt-sdk-19.07.7-brcm2708-bcm2710_gcc-7.5.0_musl_eabi.Linux-x86_64.tar.xz
下载完之后解压
[root@ubuntu ~]# xz -d openwrt-sdk-19.07.7-brcm2708-bcm2710_gcc-7.5.0_musl_eabi.Linux-x86_64.tar.xz [root@ubuntu ~]# tar -xf openwrt-sdk-19.07.7-brcm2708-bcm2710_gcc-7.5.0_musl_eabi.Linux-x86_64.tar [root@ubuntu ~]# cd openwrt-sdk-19.07.7-brcm2708-bcm2710_gcc-7.5.0_musl_eabi.Linux-x86_64
更新Packages
[root@ubuntu openwrt-sdk-19.07.7-brcm2708-bcm2710_gcc-7.5.0_musl_eabi.Linux-x86_64]# ./scripts/feeds update -a [root@ubuntu openwrt-sdk-19.07.7-brcm2708-bcm2710_gcc-7.5.0_musl_eabi.Linux-x86_64]# ./scripts/feeds install ocserv
生成配置文件
[root@ubuntu openwrt-sdk-19.07.7-brcm2708-bcm2710_gcc-7.5.0_musl_eabi.Linux-x86_64]# make defconfig [root@ubuntu openwrt-sdk-19.07.7-brcm2708-bcm2710_gcc-7.5.0_musl_eabi.Linux-x86_64]# make menuconfig
在弹出的配置界面中找到Network->VPN->ocserv->Configuration,勾选 enable radius authentication ,然后Save
完成后输入make -j20 package/ocserv/compile V=s进行编译,其中-j20指使用20个线程进行编译,该值取决于你的CPU核心数,不清楚的可以不加该参数,V=s指编译时输出详细信息。
[root@ubuntu openwrt-sdk-19.07.7-brcm2708-bcm2710_gcc-7.5.0_musl_eabi.Linux-x86_64]# make -j20 package/ocserv/compile V=s
编译会耗费一些时间,完成时候会将编译过的包放在bin/packages/中
root@pkg:~/openwrt-sdk-19.07.7-brcm2708-bcm2710_gcc-7.5.0_musl_eabi.Linux-x86_64# ls bin/packages/aarch64_cortex-a53/packages/ certtool_3.6.15-1_aarch64_cortex-a53.ipk libhttp-parser_2.9.2-1_aarch64_cortex-a53.ipk gnutls-utils_3.6.15-1_aarch64_cortex-a53.ipk libprotobuf-c_1.3.1-2_aarch64_cortex-a53.ipk libev_4.25-1_aarch64_cortex-a53.ipk libradcli_1.2.11-1_aarch64_cortex-a53.ipk libgnutls_3.6.15-1_aarch64_cortex-a53.ipk ocserv_1.1.1-2_aarch64_cortex-a53.ipk
复制这些包到OpenWRT中进行安装。
[root@openwrt ~]# opkg install ./*.ipk
安装完成后进行配置,假定Radius服务器的IP是192.168.2.2,密码为testing123
修改/etc/radcli/radiusclient.conf内容为:
authserver 192.168.2.2 acctserver 192.168.2.2 servers /etc/radcli/servers dictionary /etc/radcli/dictionary default_realm radius_timeout 10 radius_retries 3 bindaddr *
修改 /etc/radcli/servers 内容为:
192.168.2.2 testing123
修改 /etc/radcli/dictionary 内容为
#Standard attributes ATTRIBUTEUser-Name1string ATTRIBUTEPassword2string ATTRIBUTENAS-Port5integer ATTRIBUTEFramed-Protocol7integer ATTRIBUTENAS-Identifier32string ATTRIBUTEAcct-Input-Octets42integer ATTRIBUTEAcct-Output-Octets43integer ATTRIBUTEAcct-Session-Id44string ATTRIBUTEAcct-Input-Gigawords52integer ATTRIBUTEAcct-Output-Gigawords53integer ATTRIBUTEAcct-Interim-Interval85integer ATTRIBUTEConnect-Info77string ########################### #IPv4 attributes # ########################### # sets local IPv4 address in link: ATTRIBUTENAS-IP-Address4ipaddr # sets remote IPv4 address in link: ATTRIBUTEFramed-IP-Address8ipaddr ATTRIBUTEFramed-IP-Netmask9ipaddr # sets routes (quite a kludge as it requires to have # a CIDR string) ATTRIBUTEFramed-Route22string # Sets group name using format "OU=group1;group2" # Note that this works only when groupconfig is set to # true, and if the groups sent by the server are made known # to ocserv, via the select-group variable. ATTRIBUTEClass25string # sets DNS servers VENDOR Microsoft 311 BEGIN-VENDOR Microsoft ATTRIBUTEMS-Primary-DNS-Server 28 ipaddr ATTRIBUTE MS-Secondary-DNS-Server 29 ipaddr END-VENDOR Microsoft ############################ #IPv6 attributes # ############################ # sets local IPv6 address in link: ATTRIBUTENAS-IPv6-Address95string # sets remote IPv6 subnet in link: ATTRIBUTEDelegated-IPv6-Prefix123ipv6prefix # sets remote IPv6 address in link: ATTRIBUTEFramed-IPv6-Address168ipv6addr # sets DNS servers ATTRIBUTEDNS-Server-IPv6-Address169ipv6addr # Sets IPv6 routes ATTRIBUTEFramed-IPv6-Prefix97ipv6prefix ATTRIBUTERoute-IPv6-Information170ipv6prefix
修改/etc/ocserv/ocserv.conf.template中的认证部分,屏蔽掉由luci-app控制的auth方式,并添加新的认证方式为radius。
# auth = "|AUTH|" auth = "radius[config=/etc/radcli/radiusclient.conf,groupconfig=true]"
如果需要计费统计,可添加acct选项。
acct = "radius[config=/etc/radcli/radiusclient.conf]" stats-report-time = 60
屏蔽掉config-per-user和config-per-group,这两项会与radius认证冲突。
# config-per-user = /etc/ocserv/config-per-user/ # config-per-group = /etc/ocserv/config-per-group/
完成之后在OpenWRT的网页中通过luci-app-ocserv对OpenConnect服务器的常规选项进行配置后,即可执行/etc/init.d/ocserv restart 重启ocserv服务器。
[root@openwrt ~]# /etc/init.d/ocserv restart
至此。OpenWRT下的ocserv也能支持Radius认证并且能够根据用户下发不同的路由表和指定客户端IP了。
-
« 上一篇:
OSPF动态路由协议错误排查
-
Go语言(GIN)搭建DDNS服务器
:下一篇 »
发表于 2023-03-16 上午 12:40:32
I did all the steps according to your method, but when the client wants to connect, it is interrupted and does not reach the authentication stage.
Please help me to solve this problem
If needed, I can give you access.
发表于 2023-03-25 下午 01:50:30
看一下你的系统运行日志
发表于 2023-08-03 下午 04:37:45
根据此教程在openwrt编译成功ocserv,安装好相关软件以及做好配置后调取radius认证的时候手工运行
ocserv -c ocserv.conf -f
note: vhost:default: setting 'radius' as primary authentication method
note: setting 'file' as supplemental config option
listening (TCP) on 0.0.0.0:4443...
listening (TCP) on [::]:4443...
listening (UDP) on 0.0.0.0:4443...
listening (UDP) on [::]:4443...
radius initialization error
radius initialization error
radius initialization error
radius服务器没有问题,已经设置好,centos安装好freeradius-client,和ocserv测试也没问题。
在openwrt上使用radtest测试也可以和freeradius服务器通信成功。请问版主如何排错?是否为openwrt版本的ocserv的调用libradcli.so的问题?接下来我应该如何排错?
发表于 2023-08-03 下午 04:46:52
查radcli的安装情况,配置情况
发表于 2023-08-03 下午 04:48:21
编译好的目录下的那些包是ocserv的依赖,都要装的
发表于 2023-08-04 上午 10:27:02
编译好的那些ipk依赖都装了。radcli的之装了freeradius-utils这个包。openwrt下面没有freeradius-client这个包。是否要把freeradius-default装全了?
发表于 2023-08-04 上午 10:31:43
我部署的时候没有安装freeradius-utils这个包,radcli功能是libradcli这个包提供的,安装了libradcli,你用的那个版本,我部署这个的时候用的19.07,如果没有特殊要求,可以试试这个版本的,新版本可能有什么改动,跟我这篇记录有出入。
发表于 2023-08-04 上午 11:07:53
我编译的是21.02这个版本的openwrt.ocserv和你这个版本都是一样的。依赖包也都相同。