對(duì)于VPN開(kāi)源工具,以前用過(guò)不少,也部署過(guò)幾次,比如OpenVPN、Libreswan、Windows server自帶的VPN,基于用戶(hù)名和密碼認(rèn)證登錄的,都比較簡(jiǎn)單,測(cè)試也方便。
如果你不缺錢(qián),建議直接買(mǎi)阿里云、騰訊云、華為云等現(xiàn)成的VPN,減少很多不必要的麻煩,會(huì)少踩很多坑。如果想節(jié)約成本,繼續(xù)往下看,阿湯博客把這一周踩的坑全部分享給你,覺(jué)得有用,記得好評(píng)一個(gè)。服務(wù)器是阿里云1H2G的低配服務(wù)器,一年幾百塊,比阿里云的低配VPN 3825一年還是便宜了3100左右。
最近項(xiàng)目和銀行對(duì)接,需要使用ipsec ikev1 vpn 通信,第一次接觸這個(gè)協(xié)議,不是很了解,網(wǎng)上各種軟件找了一通,發(fā)現(xiàn)也有幾款開(kāi)源工具支持這個(gè)協(xié)議,比如:Openswan、Libreswan、StrongSwan。但是支持路由器的好像只有StrongSwan,思科官網(wǎng)也是用StrongSwan做的配置示例,具體參考思科官網(wǎng)文檔:在Cisco IOS和strongSwan配置示例之間的IKEv1/IKEv2 。
既然選定了工具,就去網(wǎng)上找部署文檔,真的是五花八門(mén),只好隨便用一個(gè)看著還行的文檔測(cè)試,部署倒是簡(jiǎn)單,centos7 一條命令:yum install -y strongSwan 。
然后就是參數(shù)的配置,先看參數(shù)說(shuō)明,光這些參數(shù)的坑,我就花了幾天。
config setup # 是否緩存證書(shū)吊銷(xiāo)列表 # <em>cachecrls = yes</em> # 是否嚴(yán)格執(zhí)行證書(shū)吊銷(xiāo)規(guī)則 # strictcrlpolicy=yes # 如果同一個(gè)用戶(hù)在不同的設(shè)備上重復(fù)登錄,yes 斷開(kāi)舊連接,創(chuàng)建新連接;no 保持舊連接,并發(fā)送通知;never 同 no,但不發(fā)送通知。 uniqueids=no # 配置根證書(shū),如果不使用證書(shū)吊銷(xiāo)列表,可以不用這段。命名為 %default 所有配置節(jié)都會(huì)繼承它 # ca %default # 證書(shū)吊銷(xiāo)列表 URL,可以是 LDAP,HTTP,或文件路徑 # crluri = <uri> # 定義連接項(xiàng),命名為 %default 所有連接都會(huì)繼承它 conn %default # 是否啟用壓縮,yes 表示如果支持壓縮會(huì)啟用 compress = yes # 當(dāng)意外斷開(kāi)后嘗試的操作,hold,保持并重連直到超時(shí) dpdaction = hold # 意外斷開(kāi)后嘗試重連時(shí)長(zhǎng) dpddelay = 30s # 意外斷開(kāi)后超時(shí)時(shí)長(zhǎng),只對(duì) IKEv1 起作用 dpdtimeout = 60s # 閑置時(shí)長(zhǎng),超過(guò)后斷開(kāi)連接 inactivity = 300s # 數(shù)據(jù)傳輸協(xié)議加密算法列表 esp = aes256-sha256,aes256-sha1,3des-sha1! # 密鑰交換協(xié)議加密算法列表 ike = aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! # 默認(rèn)的密鑰交換算法,ike 為自動(dòng),優(yōu)先使用 IKEv2 keyexchange = ike # 服務(wù)端公網(wǎng) IP,可以是魔術(shù)字 %any,表示從本地 IP 地址表中取 left = %any # 客戶(hù)端 IP,同上 right = %any # 指定服務(wù)端與客戶(hù)端的 DNS,多個(gè)用“,”分隔 leftdns = 8.8.8.8,8.8.4.4 rightdns = 8.8.8.8,8.8.4.4 # 服務(wù)端用于 ike 認(rèn)證時(shí)使用的端口,默認(rèn)為 500,如果使用了 nat 轉(zhuǎn)發(fā),則使用 4500 # leftikeport = <port> # 服務(wù)器端虛擬 IP 地址 # leftsourceip = %config # 客戶(hù)端虛擬 IP 段 rightsourceip = 10.0.0.0/24 # 服務(wù)器端子網(wǎng),魔術(shù)字 0.0.0.0/0 。如果為客戶(hù)端分配虛擬 IP 地址的話,那表示之后要做 iptables 轉(zhuǎn)發(fā),那么服務(wù)器端就必須是用魔術(shù)字 leftsubnet = 0.0.0.0/0 # rightsubnet = <ip subnet>[[<proto/port>]][,...] conn IKEv2-BASE # 服務(wù)器端根證書(shū) DN 名稱(chēng) leftca = "C=CN, O=123si, CN=123si StrongSwan CA" # 服務(wù)器證書(shū),可以是 PEM 或 DER 格式 leftcert = server.cert.pem # 不指定客戶(hù)端證書(shū)路徑 # rightcert = <path> # 指定服務(wù)器證書(shū)的公鑰 leftsigkey = server.pub.pem # rightsigkey = <raw public key> | <path to public key> # 是否發(fā)送服務(wù)器證書(shū)到客戶(hù)端 leftsendcert = always # 客戶(hù)端不發(fā)送證書(shū) rightsendcert = never # 服務(wù)端認(rèn)證方法,使用證書(shū) leftauth = pubkey # 客戶(hù)端認(rèn)證使用 EAP 擴(kuò)展認(rèn)證,貌似 eap-mschapv2 比較通用 rightauth = eap-mschapv2 # 服務(wù)端 ID,可以任意指定,默認(rèn)為服務(wù)器證書(shū)的 subject,還可以是魔術(shù)字 %any,表示什么都行 leftid = vpn.itnmg.net # 客戶(hù)端 id,任意 rightid = %any # ios, mac os, win7+, linux conn IKEv2-EAP also = IKEv2-BASE # 指定客戶(hù)端 eap id eap_identity = %any # 不自動(dòng)重置密鑰 rekey = no # 開(kāi)啟 IKE 消息分片 fragmentation = yes # 當(dāng)服務(wù)啟動(dòng)時(shí),應(yīng)該如何處理這個(gè)連接項(xiàng)。add 添加到連接表中。 auto = add
這里我直接用我自己測(cè)試成功的配置(/etc/strongswan/ipsec.conf):
config setup # strictcrlpolicy=yes # uniqueids = no conn ipsec-server #連接名 leftid=xx.xx.xx.xx #本端身份驗(yàn)證信息 left=%any #本端ipsec互聯(lián)ip leftsubnet=0.0.0.0/0 #本端內(nèi)網(wǎng)網(wǎng)段 right=xx.xx.xx.xx #對(duì)端ipsec互聯(lián)ip rightsubnet=xx.xx.xx.xx/xx #對(duì)端內(nèi)網(wǎng)ip rightid=xxx.xxx.xxx.xxx #對(duì)端身份信息 #leftfirewall=yes aggressive=no #開(kāi)啟野蠻模式 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! #第一階段的驗(yàn)證加密和算法 ,Cisco路由器不支持aes256。 ikelifetime=3600s #第一階段的生存時(shí)間,h、m、s分別代表小時(shí)、分鐘、秒 #esp=3des-md5,3des-sha1,aes-sha1,aes-md5,aes256-sha1! esp=aes128-sha1 #第二階段數(shù)據(jù)封裝加密認(rèn)證算法,主要看對(duì)端路由器用的加密和算法。 lifetime=28800s #第二階段的存活時(shí)間28800s是8小時(shí) authby=secret #兩端驗(yàn)證方式 #authby=psk #type=tunnel auto=add #是否自動(dòng)連接,start代表自動(dòng)連接,route為發(fā)起請(qǐng)求自動(dòng)連接,比如ping
還有一個(gè)就是PSK(預(yù)共享密鑰)(/etc/strongswan/ipsec.secrets):
#格式 [ <id selectors> ] : PSK <secret>
leftid的值 rightid的值 : PSK "yourpak"
配置就這些,主要說(shuō)下注意的地方:
1、默認(rèn)情況下, Cisco IOS使用IP地址作為IKE ID ,所以rightid和leftid最好用兩端服務(wù)器的公網(wǎng)IP,用%any可以試一下,我沒(méi)測(cè)試。
2、由于阿里云服務(wù)器沒(méi)有配置公網(wǎng)IP,所以left不一定不能填服務(wù)器的公網(wǎng)IP,否則無(wú)法通信。
3、如果VPN連接不需要做IP限制,right可以填寫(xiě)%any,如果需要做IP限制,填寫(xiě)對(duì)應(yīng)的公網(wǎng)IP,如果對(duì)端是路由器,不支持client,就是不能主動(dòng)發(fā)送加密和認(rèn)證算法,這里就要配對(duì)端實(shí)際的公網(wǎng)IP。
4、leftsubnet和rightsubnet內(nèi)網(wǎng)IP段也是一樣的,不作限制就填寫(xiě)0.0.0.0/0,填寫(xiě)實(shí)際的IP段注意子網(wǎng)掩碼。
5、auto正常情況下服務(wù)器端應(yīng)該是add,但是如果對(duì)端路由器不支持client,這里就要配置成start,自動(dòng)連接,這個(gè)坑,花了一天時(shí)間。
6、ike和esp 加密和認(rèn)證算法,strongswan官網(wǎng)有詳細(xì)的參數(shù),參考https://wiki.strongswan.org/projects/strongswan/wiki/IKEv1CipherSuites 這個(gè)值是組成是 加密算法-認(rèn)證算法-DH分組 和這個(gè)需要根據(jù)路由器的配置來(lái)設(shè)置。
7、思科路由器默認(rèn)是主模式。兩種模式的區(qū)別參考:http://blog.sina.com.cn/s/blog_e6ea327d0102xr7y.html
關(guān)于測(cè)試IKEv1 psk,目前我自己用過(guò)的有三種方法:
1、路由器或者防火墻上面直接測(cè)試。
2、下載思科模擬器VPN Access Manager,我沒(méi)有測(cè)試成功。
3、使用strongswan直接測(cè)試。
/etc/strongswan/ipsec.conf
config setup # strictcrlpolicy=yes # uniqueids = no conn ipsec-client left=%any leftsubnet=0.0.0.0/0 right=vpn服務(wù)器的公網(wǎng)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服務(wù)器配置里面的 leftid leftid=這里填VPN服務(wù)器配置里面的 rightid
/etc/strongswan/ipsec.secrets
leftid的值 rightid的值 : PSK "yourpak" #一定要和VPN服務(wù)器的psk一致。
配置好直接啟動(dòng)就可以了systemctl restart strongswan,查看鏈接狀態(tài)strongswan status。注意一定要有VNC鏈接的情況下,才去連VPN,通過(guò)xshell登錄的,連上VPN,你就斷開(kāi)了。
關(guān)于報(bào)錯(cuò)可以直接參考阿里云的IPsec連接常見(jiàn)問(wèn)題 和 http://docs.netgate.com/pfsense/en/latest/vpn/ipsec/ipsec-troubleshooting.html
這里主要說(shuō)下報(bào)錯(cuò):
parsed INFORMATIONAL_V1 request xxxx [ HASH N(NO_PROP) ]
received NO_PROPOSAL_CHOSEN error notify
阿里云說(shuō)的是 加密算法或認(rèn)證算法不一致。實(shí)際上不完全對(duì),我就是被這個(gè)坑了。
如果是兩邊加密算法不一致,日志會(huì)返回類(lèi)似下面的報(bào)錯(cuò):
charon: 14[CFG] received proposals: IKE:AES_CBC_256/MODP_1024 #這個(gè)是說(shuō)你客戶(hù)端的加密和算法
charon: 14[CFG] configured proposals: IKE:AES_CBC_256/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024 #這個(gè)是說(shuō),服務(wù)器有支持哪些認(rèn)證,推薦你配置。
charon: 14[IKE] no proposal found
charon: 14[ENC] generating INFORMATIONAL_V1 request 2774552374 [ N(NO_PROP) ]
如果單單只是有這個(gè)報(bào)錯(cuò):
parsed INFORMATIONAL_V1 request xxxx [ HASH N(NO_PROP) ]
received NO_PROPOSAL_CHOSEN error notify
沒(méi)有其他報(bào)錯(cuò)了,那實(shí)際上客戶(hù)端無(wú)法正常傳遞算法和認(rèn)證給服務(wù)器端,就需要按照我注意里面說(shuō)的把a(bǔ)uto改成 auto=start,把right改成right=客戶(hù)端公網(wǎng)IP,再重啟strongswan。
目前就遇到這些坑,前前后后搞了一周多,如果你正好也在搞strongswan IKEv1,也被坑得不要不要的,可以加我QQ一起探討。
2021年7月7日 下午3:41 沙發(fā)
博主,您好;我最近在搭建strongswan和飛塔(FortiGate)之間點(diǎn)對(duì)點(diǎn)的連接,遇到了相關(guān)的一些問(wèn)題,不知道您有沒(méi)有遇到過(guò)相關(guān)的問(wèn)題,想跟您探討下
2021年7月12日 下午9:24 1層
@前行520 什么問(wèn)題,具體說(shuō)下呢。
2022年9月6日 下午5:32 2層
@阿湯博客 博主,我遇到received INVALID_ID_INFORMATION error notify的錯(cuò)誤,不知道如何解決,麻煩解析下