使用 StrongSwan设置 IKEv2/IPSec
最近公司迁移相关项目,之前使用的pptpd 比较老了,安全性也不高,所以决定部署一个安全稳定的V*P*N 服务
最终决定部署IPsec/IKEv2 这个不需要客户端,而且速度快,安全性也高,而且linux 扩展包就有相关的 软件包
如果想源码编译最新的版本,可以去官网下载
官方文档:https://docs.strongswan.org/
生产环境提前配置:Rocky Linux release 8.10
需要有root权限
配置网络和防火墙
#开启内核ipv4转发
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
iptables 这个是网上给的配置,我感觉没必要这样复杂
有下面这几条就可以了
# 允许 IKEv2 协商 (UDP 500 和 4500)
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
# 启用 NAT 转发
sudo iptables -t nat -A POSTROUTING -s 10.255.255.0/24 -j MASQUERADE
因为涉及到证书,这边使用自签的证书,当然也可以用免费的证书相关配置参考,如:Let's Encrypt证书
为什么选择 Let's Encrypt?
-
免费且自动续期:90天有效期,自动续期
-
广泛信任:被所有主流操作系统和浏览器信任
-
符合最佳实践:自动遵循证书安全标准
但是,VPN 是我们公司自用的,为了考虑续签的问题,决定用自签的,当然小伙伴也可以用,就是定期去更新证书就行
我这边自签,自签的方式可以通过openssl 也可以用strongswan PKI 提供的工具来生成
官网的介绍,
https://docs.strongswan.org/docs/latest/pki/pkiQuickstart.html
官网用的是ed25519
因为我用的客户端是win11 有些安全的算法不支持,这边直接用RSA 来自签证书,方便兼容各种客户端
用ED25519 提示不支持,所以直接改用RSA
安装 epel 源
dnf install epel-release -y
dnf update -y
dnf install strongswan -y
所以需要安装相关的RPM包,官网也可以下载到
当然,在生成证书之前,最好能给V*P*N 所在的服务器解析一个公网的域名
如果创建证书出现这个错误
dnf install tpm2-tss tpm2-tools -y
#创建CA私钥,使用RSA算法
strongswan pki --gen --type rsa --outform pem > ca_key.pem
#生成自签名CA根证书 #直接通过lifetime 延长证书的时间
strongswan pki --self --ca --lifetime 9650 --in ca_key.pem --dn "C=CN,O=strongSwan,CN=strongSwan Root CA" --outform pem > ca.pem
#创建服务器证书的私钥,使用RSA算法
strongswan pki --gen --type rsa --size 2048 > key.pem
#生成证书请求文件
strongswan pki --req --type priv --in key.pem --dn "C=CN,O=strongswan,CN=vpn.xxx.com" --san vpn.xxx.com --outform pem > vReq.pem
#使用自签名CA根证书签发 直接通过lifetime 延长证书的时间
strongswan pki --issue --cacert ca.pem --cakey ca_key.pem --type pkcs10 --in vReq.pem --serial 01 --lifetime 9650 --flag serverAuth pki --flag clientAuth --flag ikeIntermediate --outform pem > v.pem
#查看自签名CA根证书
strongswan pki --print --in v.pem
提示: 如果 --lifetime 36500 会有问题,过期时间直接到1989年了
配置strongswan
在5.8版本之前,strongswan 默认使用 ipsec.conf 配置文件,之后改用 swanctl.conf 配置。网上充斥着大量老的配置方式,确很少能看到基于 swanctl 配置的,官网也说弃用了
不过看官网文档,基本都是让你选择用swanctl 配置,所以安装什么软件之前,最好参考官网
https://docs.strongswan.org/docs/5.9/config/quickstart.html
这个/etc/strongswan/swanctl 目录是swanctl 所有的配置目录,包括证书和vpn 的配置
证书相关的文件
private 存放证书私钥文件
x509 存放证书文件
x509ca 存放自签ca证书
cp key.pem /etc/strongswan/swanctl/private/
cp v.pem /etc/strongswan/swanctl/x509/
cp ca.pem /etc/strongswan/swanctl/x509ca/
#当然为了安全起见,权限给到600
chmod 600 /etc/strongswan/swanctl/private/key.pem
chmod 600 /etc/strongswan/swanctl/x509/v.pem
chmod 600 /etc/strongswan/swanctl/x509ca/ca.pem
证书出来完成,现在就是关键的配置文件了
通过查看配置文件,发现,所有的自定义配置文件,都可以放到conf.d 下面
cd conf.d
vim vpn.conf # 不知道为什么,通过这个页面复制的配置文件就是有问题,建议参考官网模版修改一下,可能是格式的问题,线上环境和这个一模一样就没问题,能启动起来,我按官网模版修改了一下就好了
connections {
ikev2-eap-mschapv2 {
version = 2
encap = yes
proposals = aes256-sha256-modp4096,aes256-sha256-modp2048,aes256gcm16-sha256-modp1024 #为了适配windows 相关的算法 ,不配置连接V*P*N 会提示策略匹配失败
rekey_time = 0s
pools = pool-ipv4 #定义V*P*N 后分配的IP地址池
fragmentation = yes
dpd_delay = 30s
send_cert=always
unique = never
local {
auth = pubkey
id = v.xxx.com #记住一点和证书里面的CN 和SAN 配置一致 #altNames
certs = v.pem # /etc/strongswan/swanctl/x509/vpn.pem
}
remote {
auth = eap-mschapv2 #win11 的认证方式# 如果使用EAP认证,则auth设置为eap;如果使用客户端证书,则设置为pubkey
eap_id = %any #匹配所有,当然可以精确匹配
}
children {
ikev2-eap-mschapv2 {
local_ts = 0.0.0.0/0
rekey_time = 0s
dpd_action = clear
}
}
}
pools {
pool-ipv4 {
addrs = 10.255.255.0/24
dns = 114.114.114.114, 8.8.8.8
}
}
secrets {
eap-user {
id = user1 #连接的用户
secret = "daydayup1" #l连接的密码
}
}
swanctl 工具的一些使用方法
swanctl -h
systemctl enable strongswan
问题处理
无法匹配策略
这个问题官方文档有提到
https://docs.strongswan.org/docs/5.9/interop/windowsClients.html#strong_ke
修改一下算法协议
查看日志显示这个
检查windows
终端中的应用日志,发现错误代码13801
https://learn.microsoft.com/zh-cn/troubleshoot/windows-server/networking/troubleshoot-always-on-vpn
首先第一个 ”验证服务器证书是否在“增强型密钥用法”下包含“服务器身份验证”。 我创建证书的时候,确实加入serverAuth
的标志
第二个证书时间肯定是没问题的,我们定义那么长时间
第三个 确保客户端计算机具有根证书,那就是这个问题了,我们自签的证书是不受信任的,所以我们需要把根证书下载下来
重命名成ca.crt(crt 格式可以安装证书)
这个IP 就是你的V*P*N 服务IP
MAC 电脑的证书安装 :https://blog.csdn.net/qq_43004620/article/details/137969884
参考的文档:
https://cn.linux-console.net/?p=30801
https://zhuanlan.zhihu.com/p/645782263
https://zhuanlan.zhihu.com/p/579200485