openwrt strongswan IPSec IKEV2
前言:文章是作者基于一段时间的学习成果而写的,主要是为了记录下搭建VPN的过程以及遇到的一些麻烦错误,方便之后继续学习或者使用。当然如果能帮到一些读者自然是更好的。鉴于本人水平有限,文章之中难免会出现错漏不足之处,恳请批评指教、留言讨论。学习过程中在网友文章中发现此图,诚不我欺(手动狗头)。0.准备俩台openwrt系统路由器、一部手机(安卓、苹果都行略有差别后续会说到)、阿里云服务器、1.安装s
前言
文章是作者基于一段时间的学习成果而写的,主要是为了记录下使用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 源码分析
更多推荐
所有评论(0)