前言

文章是作者基于一段时间的学习成果而写的,主要是为了记录下使用strongswan下的ipsec协议ikev2版本用于加密通信的过程以及遇到的一些坑和错误,方便之后继续学习或者使用。当然如果能帮到一些读者自然是更好的。鉴于本人水平有限,文章之中难免会出现错漏不足之处,敬请批评指正、留言讨论。

学习过程中在网友文章中发现此图,诚不我欺(手动狗头)。

一、理论知识储备

1.什么是VPN(Virtual Private Network)?

VPN即虚拟专用网络,用于在公网上建立专用网络,使得网络俩端可以进行加密通信。有着多种连接协议如PPTP、L2TP、IPSec,多用于企业网络、工业网络中。

2.什么是IPsec

IPsec 是 虚拟私密网络(VPN) 的一种连接协议,用于在服务器和客户端之间建立加密隧道并传输敏感数据之用。它由两个阶段组成,第一阶段(Phrase 1, ph1),交换金钥建立连接,使用互联网金钥交换(ike)协议,ike密钥交换协议又有着俩个版本分别是ikev1、ikev2; 第二阶段(Phrase 2, ph2),连接建立后对数据进行加密传输,使用封装安全载荷(esp)协议。参考:维基百科 IPsec 词条。

3.ike是什么ikev2是什么?

IKE属于一种混合型协议,由Internet安全关联和密钥管理协议(ISAKMP)和两种密钥交换协议OAKLEY与SKEME组成。IKE创建在由ISAKMP定义的框架上,沿用了OAKLEY的密钥交换模式以及SKEME的共享和密钥更新技术,还定义了它自己的两种密钥交换方式:主模式和积极模式(ikev1才有)。ike有着俩个版本ikev1、ikev2。ikev2不兼容IKEv1,IKEv1不支持认证,IKEv2支持认证,支持EAP认证。支持NAT穿越。IKEv2支持私密性、完整性、源认证。工作在UDP 的 500 /4500端口。NAT-T用的是UDP4500端口。

4.什么是strongswan?

strongSwan是一个完整的2.4和2.6的Linux内核下的IPsec和IKEv1 的实现。它也完全支持新的IKEv2协议的Linux 2.6内核。结合IKEv1和IKEv2模式与大多数其他基于IPSec的VPN产品。

二、前期准备及证书生成

1.前期准备(不同项目环境略有出入)

硬件:俩台openwrt系统路由器、一部手机(安卓、苹果都行略有差别后续会说到)、PC、网线三条、耳机一副。
软件:SecureCRT、winscp、tftpd32、Notepad++、Wireshark(抓包分析)、网易云音乐。

2.安装strongswan 5.6.3、openssl(生成证书)

安装Strongswan这一步网上搜索可以很轻松看到许多保姆级别教程,写得很详细,这里就不赘述。这里主要写证书的生成步骤。

2.1生成一个私钥

ipsec pki --gen --outform pem > ca.key.pem

2.2基于私钥签名一个CA证书

ipsec pki --self --in ca.key.pem --dn "C=com, O=myvpn, CN=VPN CA" --ca --lifetime 3650 --outform pem > ca.cert.pem

2.3生成服务器私钥

ipsec pki --gen --outform pem > server.pem

2.4从服务器私钥中提取公钥

ipsec pki --pub --in server.pem --outform pem > server.pub.pem

2.5用CA证书签发服务器证书

ipsec pki --issue --lifetime 3600 --cacert ca.cert.pem --cakey ca.key.pem --in server.pub.pem --dn "C=com, O=myvpn, CN=${yourip}" --san="${yourip}" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem

ps:需要注意的是${yourip}要替换成你的服务器域名或者服务器IP,需要对应否则连接时会出现错误。

2.6生成客户端私钥

ipsec pki --gen --outform pem > client.pem

2.7从客户端私钥中提取出公钥

ipsec pki --pub --in client.pem --outform pem > client.pub.pem

2.8用CA证书签发客户端证书

ipsec pki --issue --lifetime 1200 --cacert ca.cert.pem --cakey ca.key.pem --in client.pub.pem --dn "C=com, O=myvpn, CN=client" --outform pem > client.cert.pem

ps:这里需要注意DN值中的前俩个参数应与2.5中保持一致。

2.9 证书清单

至此你应该生成了8个文件
在这里插入图片描述

三、openwrt路由器连接

1.共享密钥连接(俩端无需证书)

ps:服务器公网IP:172.17.144.222、客户端公网IP:172.17.144.192

1.1修改服务器配置文件
编辑服务器ipsec.conf

config setup

conn %default
        ikelifetime=28800
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev2
        
conn site_to_site
        left=172.17.144.222
        leftsubnet=192.168.2.0/24
        leftid=172.17.144.222
        leftauth=secret
        rightauth=secret
        right=172.17.144.192
        rightsubnet=192.168.1.0/24
        rightid=172.17.144.192
        ike=aes128-sha1-modp2048!
        esp=aes128-sha1!
        auto=start

编辑ipsec.secrets

172.17.144.222 172.17.144.192 : PSK 123456abc

—上面是服务端配置—这是一条草率的分割线—下面是客户端配置—
1.2 修改客户端配置文件
编辑客户端ipsec.conf

config setup

conn %default
        ikelifetime=28800
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev2

conn site_to_site
        left=172.17.144.192
        leftsubnet=192.168.1.0/24
        leftid=172.17.144.192
        leftauth=secret
        rightauth=secret
        right=172.17.144.222
        rightsubnet=192.168.2.0/24
        rightid=172.17.144.222
        ike=aes128-sha1-modp2048!
        esp=aes128-sha1!
        auto=start

编辑客户端ipsec.secrets

172.17.144.192 172.17.144.222 : PSK 123456abc

1.3 命令行执行命令 ipsec restart 重启ipsec服务
1.4 命令行执行 ipsec statusall 如果你看到下图那么恭喜你
在这里插入图片描述
ps:如果你看到up数为1则表示你已经成功搭建一条虚拟专用网络隧道。此时可以尝试在客户端去ping服务端的子网。
在这里插入图片描述

2.服务端采取证书认证,客户端使用EAP

2.1证书安装

ca.cert.pem /etc/ipsec.d/cacerts/
server.cert.pem /etc/ipsec.d/certs/
server.pem /etc/ipsec.d/private/

client.cert.pem /etc/ipsec.d/certs/
server.pub.pem /etc/ipsec.d/certs
client.pem /etc/ipsec.d/private/

2.2 修改服务端配置文件
ipsec.conf

config setup

conn %default
        ikelifetime=28800
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev2
        
conn site_to_site
        left=172.17.144.222
        leftsubnet=192.168.2.0/24
        leftid=172.17.144.222
        leftcert=server.cert.pem
        leftauth=pubkey
        rightauth=eap-mschapv2
        right=172.17.144.192
        rightsubnet=192.168.1.0/24
        rightid=172.17.144.192
        ike=aes128-sha1-modp2048!
        esp=aes128-sha1!
        auto=start

ipsec.secrets

: RSA server.pem
172.17.144.222 : EAP "123456" 

—上面是服务端配置—这是一条草率的分割线—下面是客户端配置—
2.3 修改客户端配置文件
ipsec.conf

config setup

conn %default
        ikelifetime=28800
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev2

conn site_to_site
        left=172.17.144.192
        leftsubnet=192.168.1.0/24
        leftid=172.17.144.192
        leftauth=eap-mschapv2
        rightauth=pubkey
        rightrsasigkey = server.pub.pem
        right=172.17.144.222
        rightsubnet=192.168.2.0/24
        rightid=172.17.144.222
        ike=aes128-sha1-modp2048!
        esp=aes128-sha1!
        auto=start

ipsec.secrets

: RSA client.pem
172.17.144.222 : EAP "123456"

2.4同样使用ipsec status或者ipsec statusall命令查看连接信息,ping对端子网IP来检查网络是否联通。值得一提的是在这种认证方式下,客户端需要添加服务端公钥server.pub.pem。否则将无法建立连接并报错:No trusted RSA public key found for “xxx.xxx.xxx.xxx”。

3. 服务器客户端均采用证书认证

3.1 证书安装

3.2 修改服务器配置文件
ipsec.conf

config setup

conn %default
        ikelifetime=28800
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev2

conn site_to_site
        left=172.17.144.222
        leftsubnet=192.168.2.0/24
        leftid=172.17.144.222
        leftcert=server.cert.pem
        leftauth=pubkey
        rightauth=pubkey
        rightcert=client.cert.pem
        right=172.17.144.192
        rightsubnet=192.168.1.0/24
        rightid=172.17.144.192
        ike=aes128-sha1-modp2048!
        esp=aes128-sha1!
        auto=start
        dpdaction=restart
        dpddelay=60s
        dpdtimeout=60s


ipsec.secrets

: RSA server.pem

—上面是服务端配置—这是一条草率的分割线—下面是客户端配置—
3.3 修改客户端配置文件
ipsec.conf

config setup

conn %default
        ikelifetime=28800
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev2

conn site_to_site
        left=172.17.144.192
        leftsubnet=192.168.1.0/24
        leftid=172.17.144.192
        leftcert=client.cert.pem
        leftauth=pubkey
        rightauth=pubkey
        rightsigkey=server.pub.pem
        right=172.17.144.222
        rightsubnet=192.168.2.0/24
        rightid=172.17.144.222
        ike=aes128-sha1-modp2048!
        esp=aes128-sha1!
        auto=start

ipsec.secrets

: RSA client.pem

3.4 依旧是ipsec restart重启服务ipsec statusall查看连接状态,ping对端子网测试网络是否通畅。这里我有个疑问没有解开,为什么俩端都使用证书认证,配置却不是“对称的”,为什么配置不能是类似俩端都使用共享密钥认证那样对称的配置。也许是我的证书、或者配置还是有问题,但至少俩端都以证书认证建立起连接。

四、手机连接阿里云服务器架设的VPN

1.阿里云服务器配置

ipsec.conf

config setup
  uniqueids=no

conn %default
  keyexchange=ikev2
  compress = yes 
  ikelifetime=60m
  keylife=20m
  rekeymargin=3m
  keyingtries=1
  rekey=no
  ike=chacha20poly1305-prfsha256-newhope128,chacha20poly1305-prfsha256-ecp256,aes128gcm16-prfsha256-ecp256,aes256-sha256-modp2048,aes256-sha256-modp1024!
  esp=aes128gcm16-ecp256,aes256-sha256-modp2048,aes256-sha256,aes256-sha1!
  dpdaction=clear
  dpddelay=120s
  auto=add

conn roadwarrior
  left=%any
  leftid=@ztest.vip  
  leftauth=XAUTH
  leftcert=server.cert.pem
  leftsendcert=always
  leftsubnet=0.0.0.0/0,::/0
  leftupdown=/etc/ipsec.d/firewall.updown
  #leftfirewall=yes
  right=%any
  rightauth=XAUTH
  #rightsourceip=%dhcp,fdef:a51d:f888::/112
  rightsourceip=192.168.12.0/24,fdef:a51d:f888::/112
    rightdns=8.8.8.8,2001:4860:4860::8888
   leftsendcert = always

conn roadwarrior-eap
  also=roadwarrior
  rightauth=eap-dynamic
  eap_identity=%any

conn roadwarrior-pubkey-eap
  also=roadwarrior
  rightauth2=eap-dynamic
  eap_identity=%any    
   
conn route
	ikelifetime=28800
    keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev1
        aggressive=no
        left=%any
        leftsubnet=0.0.0.0/24
        leftid=ztest.vip
        leftauth=secret
        rightauth=secret
        right=172.17.144.184
        rightsubnet=192.168.3.0/24
        rightid=172.17.144.184
        ike=aes128-sha1-modp2048!
        esp=aes128-sha1!
        auto=start
        dpdaction=none
        dpddelay=150s
        dpdtimeout=150s

conn ios
	ike = aes128-sha1-modp2048!
	esp = aes128-sha1!
	auto = add
	fragmentation = yes
	ikelifetime = 60m
	keylife = 20m
	rekeymargin = 3m
	rekey = no
	        
	left = %any
	leftid = ztest.vip
	leftauth = pubkey
	leftcert = server.cert.pem    	
	leftsubnet = 192.168.2.0/24
	
	rightauth = eap-mschapv2
	right = %any
	rightsendcert = never
	rightdns=8.8.8.8,2001:4860:4860::8888
	rightsubnet=192.168.1.0/24

ipsec.secrets

: RSA server.pem
: PSK "123456789a"
zikev : XAUTH "123456"
zikev : EAP "123456"
ztest.vip : EAP "123456"

2.证书

openwrt连接阿里云上搭建的VPN证书安装与上述一致,手机连接则略有不同。安卓手机连接需要将ca证书发送到手机下载安装,IOS手机稍微麻烦一点,需要将证书以邮件附件的形式发送到手机,再从设置中下载安装描述文件。

3.设置连接

这里以IOS系统为例安卓系统大同小异。
在这里插入图片描述

五、一些错误日志及好的文章

1. no EAP key found for hosts ‘xxx.xxx.xxx.xxx’ - ‘xxx.xxx.xxx.xxx’

ipsec.secrets文件配置错误,注意EAP前后的空格,注意用户与服务器leftid一致,或者根本没有配置EAP用户名密码。

2. No trusted RSA public key found for

找不到RSA公钥,本端安装对端的公钥,添加配置

rightsigkey = server.pub.pem //server.pub.pem 为对端的公钥名称

3. no matching peer config found

参考这篇文章

4. ECP384 no support

官网加密方式支持文档

5. received NO_PROPOSAL_CHOSEN error notify

检查俩端ike版本是否一致,ike以及esp加密方式是否一致。

6. 官网FAQ

官网常见问题清单

7.strongswan ipsec 源码分析

大佬文章

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐