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