前前言

LuckyBlog 就要一周年啦!这是周年庆文章大更新的第一篇哦!

本文节选自学校 IKEv2 VPN接入设置文档,并做了一些修改,隐去了一部分信息,又加了一点东西doge

前言

前段时间,学校规划建设下一代的远程接入方案,目前,我校正在使用的是 SSL VPN 方案,配合 OA 的 SSO 做单点登录,虽然使用起来非常方便,但是非 WEB 的服务就无法在校外访问到了,所以我们准备再做一套远程接入系统来解决这个问题。经过讨论,我们最开始准备了以下的两个方案,在实验环境进行测试,然后择优使用。

①StrongSwan+IKEv2+Freeradius+Mysql+Daloradius

②OpenVPN+Mysql+Freeradius+Daloradius

我们希望尽可能方便用户使用,尽量不使用客户端,OpenVPN在IOS需要到美区下载客户端,下载起来非常困难,所以我们把这个方案否了。而IKEv2的方案在绝大多数系统里面不需要安装任何客户端(只有安卓需要),所以我们先对方案①进行测试。希望这篇文章能对需要使用StrongSwan+IKEv2+Freeradius+Mysql+Daloradius搭建远程接入系统的同学有所帮助。

需求

俗话说“不说需求空谈解决方案都是耍流氓”,咱们先来康康咱们的需求:

  • 10000人+同时在线
  • 所有系统全部适配
  • 使用方法尽可能简单
  • 尽量不使用第三方客户端
  • 足够高的安全性
  • 能够批量管理用户(增/删/改/查)

上手!

首先,关于StrongSwan+IKEv2+Freeradius+Mysql+Daloradius这套系统,网上的教程都非常老了,很多还在使用CentOS6.x或者5.x,和StrongSwan4/3.x出于系统安全性的要求,我们必须使用CentOS7.9+的系统,系统的变化加上StrongSwan的变化,网上的教程就没法照着用了,所以,如果你必须使用最新的系统和StrongSwan,那恭喜你找到这篇文章!

另外,StrongSwan+IKEv2+Freeradius+Mysql+Daloradius配置起来相当麻烦,请做好一定的心理准备。然后我因为踩了不少坑,下面的步骤可能有些地方冗余,有些地方多做了一点(应该是证书那里多生成了一点证书),不过不要紧,照着做就对了(我懒得回头看哪里多了huaji

那,冗谈不要!咱们马上进入正题!

开干!

系统使用 CentOS7.9

首先,装完系统先更新一下

yum update

前置任务:配置证书

IKEv2 通过证书来保证传输安全,虽然使用可信 CA 的证书对于用户来说更加方便,但是我们每年需要更换一次证书,一旦忘记了就会让服务挂掉,所以还是自签证书来的比较方便

生成 CA 根证书

我们需要先生成 CA 根证书,然后用我们的根证书来给我们的服务器证书和客户端证书签名

强烈建议专门找一台机器做签名,做好网络隔离

生成 CA 根证书,首先在签名专用机上面安装 StrongSwan

# 安装 StrongSwan
dnf install epel-release
dnf update

dnf install strongswan
systemctl enable strongswan
systemctl restart strongswan

然后就能愉快的生成 CA 根证书啦!

滑稽_劈叉

# 在root目录执行
# 生成 4096 位 RSA 密钥,用这个密钥来生成 CA 根,存放在/root/private/HBFUITCenter.pem
strongswan pki --gen --type rsa --size 4096 --outform pem > private/HBFUITCenter.pem
chmod 600 private/HBFUITCenter.pem
# 通过 RSA 密钥生成自签名的 CA 证书,存放在/root/cacert/HBFUITCenterCert.pem
# country (C) CN, organization (O) HBFU, and common name (CN) HBFU IT Center Root CA,还可以指定Distinguished Name (DN)(证书使用人),这里不指定DN
# --lefttime 指定有效期,过长的lefttime将会溢出
# 测试机的证书将于 Jun 04 10:24:05 2087 过期,届时请提前安排证书续期事宜<--这里的话和你的生成时间有关,一定要记得提前更换证书哦!
# 下面的所有证书都需要一并更新
strongswan pki --self --ca --lifetime 24000 --in private/HBFUITCenter.pem --type rsa --dn "C=CN, O=HBFU, CN=HBFU IT Center Root CA" --outform pem > cacert/HBFUITCenterCert.pem

使用 CA 根证书生成服务器证书

# 生成 2048 位 RSA 私钥
strongswan pki --gen --type rsa --size 2048 --outform pem > private/ikeserver.pem
chmod 600 private/ikeserver.pem
# 使用 CA 根证书生成服务器证书,生产环境需要替换域名为实际值,把它存放在 cert/ikeserver.pem
# 使用 Win7 内置的 VPN 客户端,必须添加 serverAuth 标记(flag)。OS X 10.7.3 和更早的版本需要 ikeIntermediate 标记。这些标记不影响其它功能
# 上生产环境时,域名和ip需要根据实际修改
strongswan pki --pub --in private/ikeserver.pem --type rsa | strongswan pki --issue --lifetime 24000 --cacert cacert/HBFUITCenterCert.pem --cakey private/HBFUITCenter.pem --dn "C=CN, O=HBFU, CN=IKEv2服务器的域名" --san="IKEv2服务器的域名" --san="IKEv2服务器的ip" --flag serverAuth --flag ikeIntermediate --outform pem > ikeserver.pem
# 查看生成证书的命令,通过这个可以看到证书什么时候过期
strongswan pki --print --in 证书位置

生成客户端证书

# 生成 2048 位 RSA 私钥
strongswan pki --gen --type rsa --size 2048 --outform pem > private/hbfuclient.pem
chmod 600 private/hbfuclient.pem
# 导出公钥并用 CA 签名
# 上生产环境时,域名需要根据实际修改
strongswan pki --pub --in private/hbfuclient.pem --type rsa | strongswan pki --issue --lifetime 24000 --cacert cacert/HBFUITCenterCert.pem --cakey private/HBFUITCenter.pem --dn "C=CN, O=HBFU, CN=IKEv2服务器的域名" --san="IKEv2服务器的域名" --san="IKEv2服务器的ip" --outform pem > cert/hbfuclient.pem

将CA证书和客户端证书打包成 PKCS#12 文件,方便客户端导入使用

# 这个操作会让你输个密码,这个密码是导入证书的密码,用户在正确输入密码之后才能导入证书,如密码这里留空,则用户不需要输入密码就可以直接导入证书
openssl pkcs12 -export -inkey private/hbfuclient.pem \
-in cert/hbfuclient.pem -name "HBFU Remote Access System Cilent" \
-certfile cacert/HBFUITCenterCert.pem \
-caname "HBFU IT Center Root CA" \
-out hbfuclient.p12

证书列表

为方便后续操作,这里整理了一份上面操作完成之后的证书列表供参考

证书 位置 说明
CA 证书的私钥 /root/private/HBFUITCenter.pem 不可泄漏
CA 证书 /root/cacert/HBFUITCenterCert.pem 发放给教职工及学生导入
服务器证书私钥 /root/private/ikeserver.pem 不可泄漏
服务器证书 /root/cert/ikeserver.pem 不可泄漏
客户端证书私钥 /root/private/hbfuclient.pem 不可泄漏
客户端证书 /root/cert/hbfuclient.pem 保存,可发放给教职工及学生
客户端证书(PKCS#12) /root/hbfuclient.p12 发放给教职工及学生,可直接导入,方便使用

配置 StrongSwan

StrongSwan 经过多版更新,目前有三种配置方式

  1. swanctl 方式, StrongSwan 推的新方式,语法风格偏 JSON
  2. starter 方式,最老的配置方式,网上的教程基本上都是 swanctl 方式,官方不是很推荐,但是我个人觉得还是比较简单的
  3. strongMan 方式,官方做的 WEB 配置方式, Django 写的,按理说应该很方便,实际用了一下并不是这样xiaoku

所以,我们使用一键脚本来解决这个问题!doge

一键脚本的仓库在这里

系统:CentOS 7.9(8.x应该也可行)

StrongSwan:5.9.0

依赖:wget

一键脚本命令

wget --no-check-certificate https://raw.githubusercontent.com/quericy/one-key-ikev2-vpn/master/one-key-ikev2.sh

chmod +x one-key-ikev2.sh
bash one-key-ikev2.sh

配置参数

# type:KVM
# ip/domain:服务器的域名/ip(如果没有域名的话)
# 手动导入以下证书
## These are the certificate you MUST be prepared:
## [ca.cert.pem]:The CA cert or the chain cert. HBFUITCenterCertca.pem
## [server.cert.pem]:Your server cert. ikeserver.pem
## [server.pem]:Your key of the server cert. ikeserverkey.pem
## [Please copy these file to the same directory of this script before start!]
# SNAT,有静态公网ip可选yes
# 使用 iptables 在低配机器性能会更好:no
# 选择合适的网卡:如:ens33

# 安装信息
#############################################################
#
# [Install Complete]
# Version:1.2.0
# There is the default login info of your IPSec/IkeV2 VPN Service
# UserName: myUserName
# PassWord: myUserPass
# PSK: myPSKkey
# you should change default username and password in /usr/local/etc/ipsec.secrets
# you cert: /root/my_key/ca.cert.pem
# you don't need to install cert if it's be trusted.
#
#############################################################

修改配置适应当前 Android 设备

# file:/usr/local/etc/ipsec.conf
conn networkmanager-strongswan
keyexchange=ikev2
ike=aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048!
esp=aes128-sha256

conn android_xauth_psk
keyexchange=ikev1
ike=aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,aes256-sha1-modp1024,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024!
esp=aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1,aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128gcm16,aes128gcm16-ecp256,aes256-sha1,aes256-sha256,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16,aes256gcm16-ecp384,3des-sha1!

#修改所有的网段,统一进行管理
10.10.0.0/18
# 该网段能够提供 16382 台设备的接入能力,符合当前学校的师生数量,如果需要扩容,将 /18 修改即可

配置防火墙

关闭 firewall

#停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld

启用iptables(yum install iptable)

yum install iptables-services
systemctl enable iptables
systemctl start iptables
vi /etc/sysctl.conf
sysctl -p
vi /etc/sysconfig/iptables

修改 /etc/sysconfig/iptables

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 10.10.0.0/18 -o ens33 -m policy --dir out --pol ipsec -j ACCEPT
-A POSTROUTING -s 10.10.0.0/18 -o ens33 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i ens33 -p ah -j ACCEPT
-A INPUT -i ens33 -p esp -j ACCEPT
-A INPUT -i ens33 -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -i ens33 -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i ens33 -m policy --dir in --pol ipsec -j ACCEPT
-A FORWARD -d 10.10.0.0/18 -o ens33 -m policy --dir out --pol ipsec -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

测试服务

修改ipsec.secrets

# file:/usr/local/etc/ipsec.secrets
# 博客发布抹去了信息,请根据你的需要更换
# 整套系统设置完成后这里的认证账密会失效,可以不改回来
# 运维测试账密:************
# 学生测试账密:************
: RSA server.pem
: PSK "************"
: XAUTH "************"
账号1 %any : EAP "密码1"
账号2 %any : EAP "密码2"

测试完成,发现可在包括Android(armv7/v8)、Windows(测试7/8/10)、iPad等终端正常使用(这里不行的话,先按下面的“修改配置适应多种客户端”操作完了再试试)

需要导入CA和客户端一共两个证书,如果生产环境使用可信证书就不需要导入CA证书

使用自签证书的好处

  • 证书过期时间长,一次配置完成之后可以很长时间不用维护证书(2021年-2087年)

使用可信 CA 证书的好处

  • 用户不需要导入证书,使用难度较低

建议使用自签证书,减少维护压力,防止因为忘记更新证书导致服务中断

修改配置适应多种客户端

# file:/usr/local/etc/ipsec.conf
config setup
uniqueids=never

conn iOS_cert
keyexchange=ikev1
fragmentation=yes
left=%defaultroute
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=pubkey
rightauth2=xauth
rightsourceip=10.10.0.0/18
rightcert=client.cert.pem
auto=add

conn android_xauth_psk
keyexchange=ikev1
ike=aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,aes256-sha1-modp1024,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024!
esp=aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1,aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128gcm16,aes128gcm16-ecp256,aes256-sha1,aes256-sha256,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16,aes256gcm16-ecp384,3des-sha1!
left=%defaultroute
leftauth=psk
leftsubnet=0.0.0.0/0
right=%any
rightauth=psk
rightauth2=xauth
rightsourceip=10.10.0.0/18
auto=add

conn networkmanager-strongswan
keyexchange=ikev2
ike=aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048!
esp=aes128-sha256
left=%defaultroute
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=pubkey
rightsourceip=10.10.0.0/18
rightcert=client.cert.pem
auto=add

conn ios_ikev2
keyexchange=ikev2
ike=aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048!
esp=aes256-sha256,3des-sha1,aes256-sha1!
rekey=no
left=%defaultroute
leftid=#IKEv2服务器的域名
leftsendcert=always
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=eap-mschapv2
rightsourceip=10.10.0.0/18
rightsendcert=never
eap_identity=%any
dpdaction=clear
fragmentation=yes
auto=add

conn windows7
keyexchange=ikev2
ike=aes256-sha1-modp1024!
rekey=no
left=%defaultroute
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=eap-mschapv2
rightsourceip=10.10.0.0/18
rightsendcert=never
eap_identity=%any
auto=add

设置 DNS 使用学校自建 DNS 服务器

# file:/usr/local/etc/strongswan.conf
charon {
load_modular = yes
duplicheck {
enable = no
}
compress = yes
plugins {
include strongswan.d/charon/*.conf
}
dns1 = #学校DNS服务器ip1
dns2 = #学校DNS服务器ip2
nbns1 = #学校DNS服务器ip1
nbns2 = #学校DNS服务器ip2
}

使用这种方式安装,请务必将如下命令添加到 /etc/rc.local 做开机自启

# file:/etc/rc.local
# 在最下面添加
ipsec start

配置 Freeradius+mysql+daloradius

安装 Freeradius 和 Mysql

# 安装 Freeradius 及所需的插件
yum -y install freeradius freeradius-mysql freeradius-utils
# 设置 radius 开机自启
systemctl enable radiusd.service

修改用户管理配置文件
vi /etc/raddb/users
打开文件后,查找 steve Cleartext-Password :=“testing” (73行), 取消该段内容的注释,用于开放端口后的测试,测试完成后请注释回去

关闭防火墙及selinux

前面应该已经关过防火墙了

Systemctl stop firewall
Systemctl disable firewall
setenforce 0

iptables 开放 1812 和 1813 端口(1812 用于 Radius 认证 ,1813 用于计费)

-A INPUT -i ens33 -p udp -m udp --dport 1813 -j ACCEPT
-A INPUT -i ens33 -p udp -m udp --dport 1812 -j ACCEPT

改好了建议先重启一下电脑

测试 Radius

# 以调试方式启动 freeradius
radiusd –X

再开一个新的终端

radtest steve testing localhost 0 testing123

返回 Accent-Accent 说明认证成功

Mysql

使用 MariaDB

安装

yum install -y mariadb-server mariadb
systemctl start mariadb
systemctl enable mariadb
mysql_secure_installation

配置数据库

# 请将 '123abc' 换为自己设置的数据库的密码
mysql -u root -p
MariaDB [(none)]> create database radius;
MariaDB [(none)]> grant all on radius.* to radius@localhost identified by '123abc';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit

安装 WEB 和 PHP 服务

# 如果 yum install 找不到部分包,请添加 EPEL 源
yum install -y epel-release
# WEB
yum install -y httpd
systemctl enable httpd
systemctl start httpd
# PHP
yum install -y php php-mysql php-pear php-devel php-common php-gd php-mbstring php-mcrypt php-xml php-pear-DB
systemctl restart httpd

对接 FreeRadius 和 MariaDB 数据库

mysql -u root -p radius < /etc/raddb/mods-config/sql/main/mysql/schema.sql

修改 FreeRadius 配置文件

vi /etc/raddb/mods-available/sql
# file:/etc/raddb/mods-available/sql
# 修改内容如下
drive = "rlm_sql_mysql"
dialect = "mysql"
server = "localhost"
port = 3306
login = "radius"
password = "刚刚设置的数据库密码"
# 修改文件权限,改了/etc/raddb/mods-available/sql就得把权限还回去
chgrp -h radiusd /etc/raddb/mods-available/sql
systemctl restart radiusd.service

daloradius

依赖:unzip

下载DaloRadius源代码并解压后将文件夹移动到Apache Web服务器工作目录

wget https://github.com/lirantal/daloradius/archive/master.zip
unzip master.zip
rm -f master.zip
mv daloradius-master/ /var/www/html/daloradius

汉化

有中文包,但是默认没有启用

vi /var/www/html/daloradius/config-lang.php

# 要加入的是 zh 那一行
<select name="config_lang" class='form'>
<option value="en"> English </option>
<option value="zh"> Simplified Chinese </option>
<option value="ru"> Russian </option>
<option value="hu"> Hungarian </option>
<option value="it"> Italian </option>
<option value="es_VE"> Spanish - Venezuelan </option>
<option value="pt_br"> Portuguese - Brazilian </option>
<option value="ja"> Japanese </option>
</select>

设置 DaloRadius 目录权限及属主信息

# 这两句的位置交换一下
# chown -R apache:apache /var/www/html/daloradius
# chmod -R 664 /var/www/html/daloradius/library/daloradius.conf.php

chmod -R 664 /var/www/html/daloradius/library/daloradius.conf.php
chown -R apache:apache /var/www/html/daloradius

修改 iptables

# file:/etc/sysconfig/iptables
# 下面是改好之后的样子,需要加入的语句如下
# 开放 80 端口用于 http
# -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
# 3306 端口可供开放调试 mysql
# -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 10.10.0.0/18 -o ens33 -m policy --dir out --pol ipsec -j ACCEPT
-A POSTROUTING -s 10.10.0.0/18 -o ens33 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 1812 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 1813 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
-A INPUT -i ens33 -p ah -j ACCEPT
-A INPUT -i ens33 -p esp -j ACCEPT
-A INPUT -i ens33 -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -i ens33 -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i ens33 -m policy --dir in --pol ipsec -j ACCEPT
-A FORWARD -d 10.10.0.0/18 -o ens33 -m policy --dir out --pol ipsec -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

在数据库中创建 DaloRadius 数据对象

mysql -u root -p radius < /var/www/html/daloradius/contrib/db/fr2-mysql-daloradius-and-freeradius.sql
mysql -u root -p radius < /var/www/html/daloradius/contrib/db/mysql-daloradius.sql

修改 DaloRadius 配置文件

vi /var/www/html/daloradius/library/daloradius.conf.php
# file:/var/www/html/daloradius/library/daloradius.conf.php
# 根据实际情况修改以下四项
$configValues['CONFIG_DB_HOST'] = 'localhost';
$configValues['CONFIG_DB_PORT'] = '3306';
$configValues['CONFIG_DB_USER'] = 'radius';
$configValues['CONFIG_DB_PASS'] = '你的密码';

全部配置完了一定要link过去才能启用sql

ln -s /etc/raddb/mods-available/sql /etc/raddb/mods-enabled/

测试 daloradius

浏览器访问:http://[ip]/daloradius

(默认用户名:administrator 密码:radius)

请务必立即修改密码!

对接 StrongSwan 和 Freeradius

vim /usr/local/etc/strongswan.d/charon/eap-radius.conf

# 第4行
accounting = yes
# 第8行
accounting_close_on_timeout = yes
# 63行
# IP/Hostname of RADIUS server.
secret = radius的通信密钥
server = 127.0.0.1

修改 radius 通信密钥

/etc/raddb/clients.conf

        #  The default secret below is only for testing, and should
# not be used in any real environment.
#
secret = testing123
# secret = 密码,上面的/usr/local/etc/strongswan.d/charon/eap-radius.conf填的就是这个

配置 ikev2 兼容苹果 Mac 系统

vim /etc/raddb/mods-enabled/eap

# default_eap_type = md5 改为
default_eap_type = mschapv2
service radiusd restart
ipsec restart

到此,我们这套系统就配置好了,是不是非常简单呢?你,学废了吗?

滑稽_喝嘤料

日常管理

可以通过 Daloradius 的 WEB 或者 批量操作数据库来完成,这里涉及到测试账号名称了,就不给大伙上截图了, Daloradius 的界面大概长肿么个样子:

Daloradius界面

常见问题

daloradius提示Unknown column ‘acctupdatetime’ in ‘field list’错误,并且无法连接vpn、无法查看在线用户

查看日志显示如下信息

rlm_sql_mysql: MySQL error ‘Unknown column ‘acctupdatetime’ in ‘field list”

解决方法如下:

删除radacct表 并重新建立

mysql -u radius -p

use radius;
DROP TABLE radacct;
CREATE TABLE radacct (
radacctid bigint(21) NOT NULL auto_increment,
acctsessionid varchar(64) NOT NULL default '',
acctuniqueid varchar(32) NOT NULL default '',
username varchar(64) NOT NULL default '',
groupname varchar(64) NOT NULL default '',
realm varchar(64) default '',
nasipaddress varchar(15) NOT NULL default '',
nasportid varchar(15) default NULL,
nasporttype varchar(32) default NULL,
acctstarttime datetime NULL default NULL,
acctupdatetime datetime NULL default NULL,
acctstoptime datetime NULL default NULL,
acctinterval int(12) default NULL,
acctsessiontime int(12) unsigned default NULL,
acctauthentic varchar(32) default NULL,
connectinfo_start varchar(50) default NULL,
connectinfo_stop varchar(50) default NULL,
acctinputoctets bigint(20) default NULL,
acctoutputoctets bigint(20) default NULL,
calledstationid varchar(50) NOT NULL default '',
callingstationid varchar(50) NOT NULL default '',
acctterminatecause varchar(32) NOT NULL default '',
servicetype varchar(32) default NULL,
framedprotocol varchar(32) default NULL,
framedipaddress varchar(15) NOT NULL default '',
PRIMARY KEY (radacctid),
UNIQUE KEY acctuniqueid (acctuniqueid),
KEY username (username),
KEY framedipaddress (framedipaddress),
KEY acctsessionid (acctsessionid),
KEY acctsessiontime (acctsessiontime),
KEY acctstarttime (acctstarttime),
KEY acctinterval (acctinterval),
KEY acctstoptime (acctstoptime),
KEY nasipaddress (nasipaddress)
) ENGINE = INNODB;

总结

①这套系统虽然部署非常麻烦,但是适合高校、企业这样的大规模远程接入场景的部署,部署上线之后,后面的运维工作还是很方便的;

上海交大同款方案,接入可靠性高,性能好;

③存在一些缺陷,客户端密钥交换使用的是 mschapv2 ,这种加密方式要求数据库必须明文存储密码,一旦被拖库,后果不堪设想!

基于第③点原因,我们最终没有把这套方案作为生产环境的解决方案,我们另选了另外一种方案,这个就留到下回再分解啦~