ubuntu使用strongswan搭建IpsecVPN
安装strongSwan
安装strongswan,安装成功后是使用自签证书,客户端连接前需要导入自签的ca证书到设备中。
# apt-get update && sudo apt-get upgrade
# apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins libtss2-tcti-tabrmd0 -y
生成服务器密钥和证书
1、创建 IPsec 私钥
# ipsec pki --gen --size 4096 --type rsa --outform pem > /etc/ipsec.d/private/ca.key.pem
2、创建并签署根证书。确保将 CN
配置的值替换为自己想要的 StrongSwan VPN 服务器名称
# --lifetime 3650 配置将证书的生命周期设置为 3650 天或大约十年。
# ipsec pki --self --in /etc/ipsec.d/private/ca.key.pem --type rsa --dn "CN=ares" --ca --lifetime 3650 --outform pem > /etc/ipsec.d/cacerts/ca.cert.pem
3、生成 StrongSwan VPN 服务器的私有证书
# ipsec pki --gen --size 4096 --type rsa --outform pem > /etc/ipsec.d/private/server.key.pem
4、生成主机服务器证书,指定网关服务器的 IPv4 地址
# ipsec pki --pub --in /etc/ipsec.d/private/server.key.pem --type rsa | ipsec pki --issue --lifetime 3650 --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem --dn "CN=123.123.123.123" –san=”123.123.123.123” --san="123.123.123.123" --flag serverAuth --flag ikeIntermediate --outform pem > /etc/ipsec.d/certs/server.cert.pem
# –issue, –cacert 和 –cakey 就是表明要用刚才自签的 CA 证书来签这个服务器证书
参数含义:
–self 表示自签证书
–in 是输入的私钥
–dn 是判别名
–ca 表示生成 CA 根证书
–lifetime 为有效期, 单位是天
C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名
O 组织名称
CN 友好显示的通用名
最终证书文件:
/etc/ipsec.d/private/ca.key.pem VPN 主机网关私钥
/etc/ipsec.d/cacerts/ca.cert.pem VPN 主机网关根证书
/etc/ipsec.d/private/server.key.pem VPN 主机网关私钥
/etc/ipsec.d/certs/server.cert.pem VPN 主机网关服务器证书
StrongSwan 配置
1、开始linux内核转发
# tail -6 /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# sysctl -p
2、配置StrongSwan 文件
# cat /etc/ipsec.conf
config setup
charondebug="ike 1, knl 1, cfg 0, net 1"
strictcrlpolicy=no
uniqueids=yes # 如果同一个用户在不同的设备上重复登录,yes 断开旧连接,创建新连接;no 保持旧连接,并发送通知; never 同 no, 但不发送通知.
cachecrls=no
conn ipsec-ikev2-vpn #XAUTH认证需要
auto=add # 当服务启动时, 应该如何处理这个连接项,add 添加到连接表中
compress=no # 是否启用压缩, yes 表示如果支持压缩会启用
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
dpdaction=clear # 当意外断开后尝试的操作
dpddelay=300s # dpd时间间隔
rekey=no # 不自动重置密钥
left=%any # 服务器端标识,可以是魔术字 %any,表示从本地ip地址表中取
leftid=123.13.12.1 # 服务器端ID标识,这里为你的公网ip,或者@你的域名
leftcert=server.cert.pem # 服务器端证书
leftsendcert=always # 是否发送服务器证书到客户端
leftsubnet=0.0.0.0/0
right=%any # 客户端标识,%any表示任意
rightid=%any
rightauth=eap-mschapv2 #KEv2 EAP(Username/Password)
rightsourceip=192.168.137.0/24 # 客户端IP地址分配范围
rightdns=223.5.5.5,223.6.6.6 # DNS
rightsendcert=never # 客户端不发送证书
eap_identity=%identity # 指定客户端eap id
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! # 密钥交换协议加密算法列表,可以包括多个算法和协议。
esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1! # 数据传输协议加密算法列表,对于IKEv2,可以在包含相同类型的多个算法(由-分隔)
conn xauth_psk #PSK认证需要
keyexchange=ikev2 # 使用 IKEv2
left=%defaultroute
leftauth=psk # 服务器校验方式
leftsubnet=0.0.0.0/0
right=%any
rightauth=psk
rightsourceip=192.168.137.0/24
auto=add
conn IKEv2-pubkey #RSA认证
# 服务器端根证书 DN 名称
leftca="CN=ares"
# 服务器证书,可以是 PEM 或 DER 格式
leftcert=server.cert.pem
# 不指定客户端证书路径
# rightcert = <path>
# 指定服务器证书的公钥
leftsigkey=server.pub.pem
# rightsigkey = <raw public key> | <path to public key>
# 是否发送服务器证书到客户端
leftsendcert=always
# 客户端不发送证书
rightsendcert=never
# 服务端认证方法,使用证书
leftauth=pubkey
# 客户端认证使用 EAP 扩展认证,貌似 eap-mschapv2 比较通用
rightauth=eap-mschapv2
# 服务端 ID,可以任意指定,默认为服务器证书的 subject,还可以是魔术字 %any,表示什么都行
leftid=%any
# 客户端 id,任意
rightid=%any
3、创建身份验证和访问机密
# cat /etc/ipsec.secrets
# This file holds shared secrets or RSA private keys for authentication.
# RSA private key for this host, authenticating it to any other host
# which knows the public part.
: RSA "/etc/ipsec.d/private/server.key.pem"
: PSK "1234567890"
: XAUTH "123456"
test : EAP "test123"
4、启动服务
# ipsec restart
5、添加iptables转发,添加后才可以通外网
# iptables -t nat -A POSTROUTING -s 192.168.137.0/24 -o ens160 -j MASQUERADE
# 网段为ipsec.conf中配置的客户端网段,ens160为网卡名称
客户端测试
需要导入ca证书。