对于VPN开源工具,以前用过不少,也部署过几次,比如OpenVPN、Libreswan、Windows server自带的VPN,基于用户名和密码认证登录的,都比较简单,测试也方便。
如果你不缺钱,建议直接买阿里云、腾讯云、华为云等现成的VPN,减少很多不必要的麻烦,会少踩很多坑。如果想节约成本,继续往下看,阿汤博客把这一周踩的坑全部分享给你,觉得有用,记得好评一个。服务器是阿里云1H2G的低配服务器,一年几百块,比阿里云的低配VPN 3825一年还是便宜了3100左右。
最近项目和银行对接,需要使用ipsec ikev1 vpn 通信,第一次接触这个协议,不是很了解,网上各种软件找了一通,发现也有几款开源工具支持这个协议,比如:Openswan、Libreswan、StrongSwan。但是支持路由器的好像只有StrongSwan,思科官网也是用StrongSwan做的配置示例,具体参考思科官网文档:在Cisco IOS和strongSwan配置示例之间的IKEv1/IKEv2 。
既然选定了工具,就去网上找部署文档,真的是五花八门,只好随便用一个看着还行的文档测试,部署倒是简单,centos7 一条命令:yum install -y strongSwan 。
然后就是参数的配置,先看参数说明,光这些参数的坑,我就花了几天。
config setup # 是否缓存证书吊销列表 # <em>cachecrls = yes</em> # 是否严格执行证书吊销规则 # strictcrlpolicy=yes # 如果同一个用户在不同的设备上重复登录,yes 断开旧连接,创建新连接;no 保持旧连接,并发送通知;never 同 no,但不发送通知。 uniqueids=no # 配置根证书,如果不使用证书吊销列表,可以不用这段。命名为 %default 所有配置节都会继承它 # ca %default # 证书吊销列表 URL,可以是 LDAP,HTTP,或文件路径 # crluri = <uri> # 定义连接项,命名为 %default 所有连接都会继承它 conn %default # 是否启用压缩,yes 表示如果支持压缩会启用 compress = yes # 当意外断开后尝试的操作,hold,保持并重连直到超时 dpdaction = hold # 意外断开后尝试重连时长 dpddelay = 30s # 意外断开后超时时长,只对 IKEv1 起作用 dpdtimeout = 60s # 闲置时长,超过后断开连接 inactivity = 300s # 数据传输协议加密算法列表 esp = aes256-sha256,aes256-sha1,3des-sha1! # 密钥交换协议加密算法列表 ike = aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! # 默认的密钥交换算法,ike 为自动,优先使用 IKEv2 keyexchange = ike # 服务端公网 IP,可以是魔术字 %any,表示从本地 IP 地址表中取 left = %any # 客户端 IP,同上 right = %any # 指定服务端与客户端的 DNS,多个用“,”分隔 leftdns = 8.8.8.8,8.8.4.4 rightdns = 8.8.8.8,8.8.4.4 # 服务端用于 ike 认证时使用的端口,默认为 500,如果使用了 nat 转发,则使用 4500 # leftikeport = <port> # 服务器端虚拟 IP 地址 # leftsourceip = %config # 客户端虚拟 IP 段 rightsourceip = 10.0.0.0/24 # 服务器端子网,魔术字 0.0.0.0/0 。如果为客户端分配虚拟 IP 地址的话,那表示之后要做 iptables 转发,那么服务器端就必须是用魔术字 leftsubnet = 0.0.0.0/0 # rightsubnet = <ip subnet>[[<proto/port>]][,...] conn IKEv2-BASE # 服务器端根证书 DN 名称 leftca = "C=CN, O=123si, CN=123si StrongSwan CA" # 服务器证书,可以是 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 = vpn.itnmg.net # 客户端 id,任意 rightid = %any # ios, mac os, win7+, linux conn IKEv2-EAP also = IKEv2-BASE # 指定客户端 eap id eap_identity = %any # 不自动重置密钥 rekey = no # 开启 IKE 消息分片 fragmentation = yes # 当服务启动时,应该如何处理这个连接项。add 添加到连接表中。 auto = add
这里我直接用我自己测试成功的配置(/etc/strongswan/ipsec.conf):
config setup # strictcrlpolicy=yes # uniqueids = no conn ipsec-server #连接名 leftid=xx.xx.xx.xx #本端身份验证信息 left=%any #本端ipsec互联ip leftsubnet=0.0.0.0/0 #本端内网网段 right=xx.xx.xx.xx #对端ipsec互联ip rightsubnet=xx.xx.xx.xx/xx #对端内网ip rightid=xxx.xxx.xxx.xxx #对端身份信息 #leftfirewall=yes aggressive=no #开启野蛮模式 keyexchange=ikev1 #ike版本 #ike=3des-md5-modp1536,3des-md5-modp1024,3des-sha1-modp1024,3des-sha1-modp1536,aes256-sha1-modp1536,aes256-sha1-modp1024,aes128-sha1-modp1024! ike=aes128-sha1-modp1024! #第一阶段的验证加密和算法 ,Cisco路由器不支持aes256。 ikelifetime=3600s #第一阶段的生存时间,h、m、s分别代表小时、分钟、秒 #esp=3des-md5,3des-sha1,aes-sha1,aes-md5,aes256-sha1! esp=aes128-sha1 #第二阶段数据封装加密认证算法,主要看对端路由器用的加密和算法。 lifetime=28800s #第二阶段的存活时间28800s是8小时 authby=secret #两端验证方式 #authby=psk #type=tunnel auto=add #是否自动连接,start代表自动连接,route为发起请求自动连接,比如ping
还有一个就是PSK(预共享密钥)(/etc/strongswan/ipsec.secrets):
#格式 [ <id selectors> ] : PSK <secret>
leftid的值 rightid的值 : PSK "yourpak"
配置就这些,主要说下注意的地方:
1、默认情况下, Cisco IOS使用IP地址作为IKE ID ,所以rightid和leftid最好用两端服务器的公网IP,用%any可以试一下,我没测试。
2、由于阿里云服务器没有配置公网IP,所以left不一定不能填服务器的公网IP,否则无法通信。
3、如果VPN连接不需要做IP限制,right可以填写%any,如果需要做IP限制,填写对应的公网IP,如果对端是路由器,不支持client,就是不能主动发送加密和认证算法,这里就要配对端实际的公网IP。
4、leftsubnet和rightsubnet内网IP段也是一样的,不作限制就填写0.0.0.0/0,填写实际的IP段注意子网掩码。
5、auto正常情况下服务器端应该是add,但是如果对端路由器不支持client,这里就要配置成start,自动连接,这个坑,花了一天时间。
6、ike和esp 加密和认证算法,strongswan官网有详细的参数,参考https://wiki.strongswan.org/projects/strongswan/wiki/IKEv1CipherSuites 这个值是组成是 加密算法-认证算法-DH分组 和这个需要根据路由器的配置来设置。
7、思科路由器默认是主模式。两种模式的区别参考:http://blog.sina.com.cn/s/blog_e6ea327d0102xr7y.html
关于测试IKEv1 psk,目前我自己用过的有三种方法:
1、路由器或者防火墙上面直接测试。
2、下载思科模拟器VPN Access Manager,我没有测试成功。
3、使用strongswan直接测试。
/etc/strongswan/ipsec.conf
config setup # strictcrlpolicy=yes # uniqueids = no conn ipsec-client left=%any leftsubnet=0.0.0.0/0 right=vpn服务器的公网IP rightsubnet=0.0.0.0/0 aggressive=no keyexchange=ikev1 ike=3des-sha1-modp1536 esp=3des-sha1 ikelifetime=3600s lifetime=28800s #authby=secret authby=psk type=tunnel auto=start rightid=这里填VPN服务器配置里面的 leftid leftid=这里填VPN服务器配置里面的 rightid
/etc/strongswan/ipsec.secrets
leftid的值 rightid的值 : PSK "yourpak" #一定要和VPN服务器的psk一致。
配置好直接启动就可以了systemctl restart strongswan,查看链接状态strongswan status。注意一定要有VNC链接的情况下,才去连VPN,通过xshell登录的,连上VPN,你就断开了。
关于报错可以直接参考阿里云的IPsec连接常见问题 和 http://docs.netgate.com/pfsense/en/latest/vpn/ipsec/ipsec-troubleshooting.html
这里主要说下报错:
parsed INFORMATIONAL_V1 request xxxx [ HASH N(NO_PROP) ]
received NO_PROPOSAL_CHOSEN error notify
阿里云说的是 加密算法或认证算法不一致。实际上不完全对,我就是被这个坑了。
如果是两边加密算法不一致,日志会返回类似下面的报错:
charon: 14[CFG] received proposals: IKE:AES_CBC_256/MODP_1024 #这个是说你客户端的加密和算法
charon: 14[CFG] configured proposals: IKE:AES_CBC_256/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024 #这个是说,服务器有支持哪些认证,推荐你配置。
charon: 14[IKE] no proposal found
charon: 14[ENC] generating INFORMATIONAL_V1 request 2774552374 [ N(NO_PROP) ]
如果单单只是有这个报错:
parsed INFORMATIONAL_V1 request xxxx [ HASH N(NO_PROP) ]
received NO_PROPOSAL_CHOSEN error notify
没有其他报错了,那实际上客户端无法正常传递算法和认证给服务器端,就需要按照我注意里面说的把auto改成 auto=start,把right改成right=客户端公网IP,再重启strongswan。
目前就遇到这些坑,前前后后搞了一周多,如果你正好也在搞strongswan IKEv1,也被坑得不要不要的,可以加我QQ一起探讨。
2021年7月7日 下午3:41 沙发
博主,您好;我最近在搭建strongswan和飞塔(FortiGate)之间点对点的连接,遇到了相关的一些问题,不知道您有没有遇到过相关的问题,想跟您探讨下
2021年7月12日 下午9:24 1层
@前行520 什么问题,具体说下呢。
2022年9月6日 下午5:32 2层
@阿汤博客 博主,我遇到received INVALID_ID_INFORMATION error notify的错误,不知道如何解决,麻烦解析下