赞
踩
文章是作者基于一段时间的学习成果而写的,主要是为了记录下使用strongswan下的ipsec协议ikev2版本用于加密通信的过程以及遇到的一些坑和错误,方便之后继续学习或者使用。当然如果能帮到一些读者自然是更好的。鉴于本人水平有限,文章之中难免会出现错漏不足之处,敬请批评指正、留言讨论。
学习过程中在网友文章中发现此图,诚不我欺(手动狗头)。
VPN即虚拟专用网络,用于在公网上建立专用网络,使得网络俩端可以进行加密通信。有着多种连接协议如PPTP、L2TP、IPSec,多用于企业网络、工业网络中。
IPsec 是 虚拟私密网络(VPN) 的一种连接协议,用于在服务器和客户端之间建立加密隧道并传输敏感数据之用。它由两个阶段组成,第一阶段(Phrase 1, ph1),交换金钥建立连接,使用互联网金钥交换(ike)协议,ike密钥交换协议又有着俩个版本分别是ikev1、ikev2; 第二阶段(Phrase 2, ph2),连接建立后对数据进行加密传输,使用封装安全载荷(esp)协议。参考:维基百科 IPsec 词条。
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端口。
strongSwan是一个完整的2.4和2.6的Linux内核下的IPsec和IKEv1 的实现。它也完全支持新的IKEv2协议的Linux 2.6内核。结合IKEv1和IKEv2模式与大多数其他基于IPSec的VPN产品。
硬件:俩台openwrt系统路由器、一部手机(安卓、苹果都行略有差别后续会说到)、PC、网线三条、耳机一副。
软件:SecureCRT、winscp、tftpd32、Notepad++、Wireshark(抓包分析)、网易云音乐。
安装Strongswan这一步网上搜索可以很轻松看到许多保姆级别教程,写得很详细,这里就不赘述。这里主要写证书的生成步骤。
ipsec pki --gen --outform pem > ca.key.pem
ipsec pki --self --in ca.key.pem --dn "C=com, O=myvpn, CN=VPN CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
ipsec pki --gen --outform pem > server.pem
ipsec pki --pub --in server.pem --outform pem > server.pub.pem
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,需要对应否则连接时会出现错误。
ipsec pki --gen --outform pem > client.pem
ipsec pki --pub --in client.pem --outform pem > client.pub.pem
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中保持一致。
至此你应该生成了8个文件
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.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.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对端子网测试网络是否通畅。这里我有个疑问没有解开,为什么俩端都使用证书认证,配置却不是“对称的”,为什么配置不能是类似俩端都使用共享密钥认证那样对称的配置。也许是我的证书、或者配置还是有问题,但至少俩端都以证书认证建立起连接。
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"
openwrt连接阿里云上搭建的VPN证书安装与上述一致,手机连接则略有不同。安卓手机连接需要将ca证书发送到手机下载安装,IOS手机稍微麻烦一点,需要将证书以邮件附件的形式发送到手机,再从设置中下载安装描述文件。
这里以IOS系统为例安卓系统大同小异。
ipsec.secrets文件配置错误,注意EAP前后的空格,注意用户与服务器leftid一致,或者根本没有配置EAP用户名密码。
找不到RSA公钥,本端安装对端的公钥,添加配置
rightsigkey = server.pub.pem //server.pub.pem 为对端的公钥名称
检查俩端ike版本是否一致,ike以及esp加密方式是否一致。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。