Centos7部署strongswan IKEv1 VPN 和Cisco路由器点对点连接

2020年7月10日23:11:05 3 8,203 ℃

对于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一起探讨。

【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:3   其中:访客  0   博主  0

    • avatar 前行520 0

      博主,您好;我最近在搭建strongswan和飞塔(FortiGate)之间点对点的连接,遇到了相关的一些问题,不知道您有没有遇到过相关的问题,想跟您探讨下

        • avatar 阿汤博客 Admin

          @前行520 什么问题,具体说下呢。

            • avatar 少年 0

              @阿汤博客 博主,我遇到received INVALID_ID_INFORMATION error notify的错误,不知道如何解决,麻烦解析下