在 Centos 7 上搭建 strongSwan VPN IKEv2 整合 FreeRadius 用户认证系统
第一步
安装strongSwan
1
2
yum -y install epel-release
yum -y install strongswan openssl
1
2
strongswan pki --gen --type rsa --size 4096 --outform pem > ca.key.pem
strongswan pki --self --in ca.key.pem --dn "C=CN, O=Linux strongSwan, CN=VPN CA" --ca --lifetime 3650 --type rsa --outform pem > ca.cert.pem
- –self 表示自签证书
- –in 是输入的私钥
- –dn 是判别名
- –ca 表示生成 CA 根证书
- –lifetime 为有效期, 单位是天
- C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名
- O 组织名称
- CN 友好显示的通用名
服务器外网IP : 10.1.1.2
1
2
3
4
5
6
strongswan pki --gen --type rsa --size 4096 --outform pem > server.key.pem
strongswan pki --pub --in server.key.pem --outform pem > server.pub.pem
strongswan pki --pub --in server.key.pem | strongswan pki --issue --lifetime 3650 --cacert ca.cert.pem \
--cakey ca.key.pem --dn "C=CN, O=Linux strongSwan, CN=10.1.1.2" \
--san="10.1.1.2" --san="10.1.1.2" --flag serverAuth --flag ikeIntermediate \
--outform pem > server.cert.pem
- –issue, –cacert 和 –cakey 就是表明要用刚才自签的 CA 证书来签这个服务器证书。
- –dn, –san,–flag 是一些客户端方面的特殊要求:
iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址;
Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),–flag serverAuth;
非 iOS 的 Mac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU),–flag ikdeIntermediate;
Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,–san。
复制证书到指定目录
1
2
3
4
5
cp -r ca.key.pem /etc/strongswan/ipsec.d/private/
cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/
cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r server.pub.pem /etc/strongswan/ipsec.d/certs/
cp -r server.key.pem /etc/strongswan/ipsec.d/private/
配置VPN 这里只配置了IKEV2-mschapv2认证方式 IpsecConf
1
# vim /etc/strongswan/ipsec.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
config setup
# strictcrlpolicy=yes # 是否严格执行证书吊销规则
uniqueids = never # 如果同一个用户在不同的设备上重复登录,yes 断开旧连接,创建新连接;no 保持旧连接,并发送通知; never 同 no, 但不发送通知.
conn %default
compress = yes # 是否启用压缩, yes 表示如果支持压缩会启用
dpdaction = clear # 当意外断开后尝试的操作
dpddelay = 30s # dpd时间间隔
inactivity = 300s # 闲置时长,超过后断开连接
left = %any # 服务器端标识,可以是魔术字 %any,表示从本地ip地址表中取
leftid = 10.1.1.2 # 服务器端ID标识
leftsubnet = 0.0.0.0/0 # 服务器端虚拟IP,0.0.0.0/0表示通配
leftcert = server.cert.pem # 服务器端证书
right=%any # 客户端标识,%any表示任意
rightsourceip=192.168.99.0/24 # 客户端IP地址分配范围
conn IKEv2-EAP
keyexchange = ikev2 # 使用 IKEv2
leftca = "C=CN, O=Linux strongSwan, CN=VPN CA" # 服务器端根证书DN名称
leftsendcert = always # 是否发送服务器证书到客户端
rightsendcert = never # 客户端不发送证书
left=%any # 服务器端标识,%any表示任意
leftauth=pubkey # 服务器校验方式,使用证书
rightauth=eap-mschapv2 #KEv2 EAP(Username/Password)
eap_identity = %any # 指定客户端eap id
rekey = no # 不自动重置密钥
auto = add # 当服务启动时, 应该如何处理这个连接项,add 添加到连接表中
ike = aes256-aes128-3des-sha1-modp1024!
# 密钥交换协议加密算法列表,可以包括多个算法和协议。
# 5.0.2增加了配置与完整性保护定义的PRF算法不同的PRF算法的能力。
esp = aes256-3des-sha256-sha1!
# 数据传输协议加密算法列表,对于IKEv2,可以在包含相同类型的多个算法(由-分隔)。
# IKEv1仅包含协议中的第一个算法。只能使用ah或esp关键字,不支持AH+ESP。
配置strongSwan参数
1
# vim /etc/strongswan/strongswan.conf
1
2
3
4
5
6
7
8
9
10
charon {
load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
dns1 = 8.8.8.8 #配置客户端使用的DNS
dns2 = 8.8.4.4
}
include strongswan.d/*.conf
配置VPN账号 IpsecSecrets
1
vim /etc/strongswan/ipsec.secrets
用户名: user
密码: password
1
2
3
4
5
6
# ipsec.secrets - strongSwan IPsec secrets file
# 使用证书验证时的服务器端私钥
# 格式 : RSA <private key file> [ <passphrase> | %prompt ]
: RSA server.key.pem
#EAP 方式, 格式同 psk 相同
user %any : EAP "password"
内核转发
1
2
3
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
sysctl -p
配置firewalld防火墙 端口允许和ip伪装
1
2
3
4
5
firewall-cmd --permanent --add-service="ipsec"
firewall-cmd --permanent --add-port=500/udp
firewall-cmd --permanent --add-port=4500/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
1
2
systemctl start strongswan
systemctl enable strongswan
第二步
客户端测试
IOS
- 先导入 CA 证书 将之前创建的
ca.cert.pem
文件放在web中,使用iOS自带的浏览器Safari访问ca.cert.pem,然后进行安装。 - 使用 IKEv2 + EAP 认证找到手机上 “设置->VPN->添加配置”, 选IKEv2
描 述:随便填
服 务 器:10.1.1.2 #填url或ip
远 程 ID:10.1.1.2 #填url或ip
用户鉴定:用户名
用 户 名:username #EAP 项用户名
密 码:password #EAP 项密码
Windows10
- 将 CA 根证书 ca.cert.pem 重命名为 ca.cert.crt
- 按win+r 运行mmc;
- 文件>添加删除管理单元;
- 在可用的管理单元中选择“证书”,点击添加 > 选择本地计算机用户> 确定; 在控制节点中展开证书 > 受信任的证书颁发机构 > 右击所有任务 > 导入。
“控制面板”-“网络和共享中心”-“设置新的连接或网络”-“连接到工作区”-“使用我的 Internet 连接”
Internet 地址写服务器 IP 或 URL。
描述随便写。
用户名密码写之前配置的 EAP 的那个。
确定
转到 控制面板网络和 Internet网络连接
在新建的 VPN 连接上右键属性然后切换到“安全”选项卡
VPN 类型选 IKEv2
数据加密选“需要加密”
身份认证,使用 EAP 认证选择“Microsoft:安全密码(EAP-MSCHAP v2)”;
再切换到 “网络” 选项卡, 双击 “Internet 协议版本 4” 以打开属性窗口,
点击 “高级” 按钮, 勾选 “在远程网络上使用默认网关”, 确定退出。
测试是否无误 没有问题再进行第二步
第二步
安装freeradius
1
yum install -y freeradius freeradius-mysql # 这里用了mysql数据库如果需要sqlite 换成 freeradius-sqlite
1
2
3
4
vim /etc/raddb/clients.conf
client localhost {
ipaddr = 127.0.0.1
secret = 123456789 //修改 secret 的密码
设置用户名和密码 testing password
1
2
vim /etc/raddb/users
testing Cleartext-Password := "password"
尝试运行服务在Debug模式
1
2
radiusd -X
Read to process requests. # 如果看到这行说明能成功运行
导入radius 所需要的数据库脚本
1
2
3
4
5
mysql -uroot -p
CREATE DATABASE radius;
exit
mysql -uroot -p radius < /etc/raddb/mods-config/sql/main/mysql/schema.sql
mysql -uroot -p radius < /etc/raddb/mods-config/sql/main/mysql/setup.sql # 这个可执行也可不执行 非必需 该脚本创建一个mysql用户
配置FreeRadius 的SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd /etc/raddb/mods-enabled
ln -s ../mods-available/sql sql
vim sql
sql {
driver = "rlm_sql_mysql"
dialect = "mysql"
# Connection info:
#
server = "localhost"
port = 3306
login = "root"
password = "root"
# Database table configuration for everything except Oracle
radius_db = "radius"
}
编辑/etc/raddb/sites-available/default
取消authorize {}
部分中包含sql的注释行。即 -sql
修改为 sql
此外,编辑/etc/raddb/sites-available/inner-tunnel
取消authorize {}
下包含sql的注释行。即 -sql
修改为 sql
新增用户名/密码 test/testpassword
1
2
3
mysql -u radius -p
use radius;
insert into radcheck (username,attribute,op,value) values("test", "Cleartext-Password", ":=", "testpassword");
再次执行 radiusd -X
查看是否有问题
1
systemctl start radiusd
第三步
整合
请确保以上都正确执行没有错误
1
2
3
4
5
6
7
8
vim /etc/strongswan/strongswan.d/charon/eap-radius.conf
eap-radius {
accounting = yes
load = yes
port = 1812
secret = 123456789
server = 127.0.0.1
}
strongSwan 修改认证方式
1
2
3
4
5
6
vim /etc/strongswan/ipsec.conf
conn IKEv2-EAP {
rightauth=eap-radius # eap-mschapv2 修改成 eap-radius
}
vim /etc/strongswan/ipsec.secrets
#user %any : EAP "password" #该行注释掉用radius认证
1
2
systemctl restart strongswan
systemctl restart radiusd
最后用 test testpassword 进行账户登陆
免CA证书实现登录
免CA证书的主要原理还是基于信任,上面的手动安装CA证书就要设置信任,所以只要我们有一些机构签发的证书,那就可以试用,这里主要使用Let’sencrypt 使用这个需要每三个月需要一次续签
1
2
3
4
5
yum -y install certbot
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
certbot certonly --rsa-key-size 4096 --standalone --agree-tos --no-eff-email --email hakase@gmail.com -d 域名
证书路径 /etc/letsencrypt/live/域名
1
2
3
ln -s /etc/letsencrypt/live/域名/fullchain.pem /etc/strongswan/ipsec.d/certs/
ln -s /etc/letsencrypt/live/域名/privkey.pem /etc/strongswan/ipsec.d/private/
ln -s /etc/letsencrypt/live/域名/chain.pem /etc/strongswan/ipsec.d/cacerts/
使用链接的好处就是下次更新时不需要复制文件
- 修改ipsec.conf leftcert = fullchain.pem
- 修改ipsec.conf 删除leftca
1 2 3
vim ipsec.secrets //上面的 : RSA server.key.pem 修改成以下并保存 : RSA "privkey.pem"
http://wiki.freeradius.org/guide/SQL-HOWTO-for-freeradius-3.x-on-Debian-Ubuntu
how-to-setup-ikev2-vpn-using-strongswan-and-letsencrypt-on-centos-7