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