Centos7部署strongswan IKEv1 VPN 和Cisco路由器點對點連接

2020年7月10日23:11:05 3 12,267 ℃

對于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的錯誤,不知道如何解決,麻煩解析下