[后续] OpenWRT系统中ocserv不支持使用Radius指定客户端IP的解决方法

天锦 发表于 码农也得有格调 分类,标签:

在上次组网完成之后,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

config.PNG

完成后输入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了。