使用Linux L2TP/IPsec VPN 伺服器

火星人 @ 2014-03-04 , reply:0


使用Linux L2TP/IPsec VPN 伺服器

原文地址:http://www.jacco2.dds.nl/networking/freeswan-l2tp.html

首先聲明一下,我只有初中文化程度,在做Linux VPN接入伺服器時發現網上這方面的中文資料太少,無奈只好自己用金山詞霸一個單詞一個單詞地把它翻譯了出來,不敢獨享,現貼出來,希望大家不要嘲笑我的英文水平,也希望高手多多指教。同時也希望大家為了國家的興旺,堅決抵制國外列強的經濟侵略和文化侵略,一定要支持民族產業,少買洋貨,少看洋片……。

1 緒論
這篇文章包含了如何使用微軟、蘋果或其它第三方廠商的L2TP/IPsec客戶端來設置讓Road Warrior連接到一個基於FreeS/WAN或後續軟體的Linux伺服器。
IPsec是一個安全通信的網路協議。它是一個正式的互聯網標準。不同廠家生產的客戶端和設備應該能夠協同工作(從理論上說),只要他們支持IPsec標準。
2 目錄
緒論
目錄
背景
過程概況
安全注意事項
VPN的選擇
用L2TP使用IPsec的優勢和劣勢
支持Road Warrior
安裝(Linux 內核等)
配置FreeS/WAN
配置L2TP/IPsec客戶端
開始L2TP/IPsec連接
L2TP概況
安裝和配置L2TP(Linux)
PPP認證、壓縮和加密
安裝和配置PPP(Linux)
再一次開始L2TP/IPsec連接
L2TP/IPsec的一些評論
NAT-Traversal
Windows網路(WINS等)
分離隧道
發現並解決故障
證書
保護無線連接
Linux作為L2TP/IPsec客戶端
一些思考
有關的鏈接
修訂的版本
3 背景
微軟在Windows 2000 Professional/Server、Windows XP Home/Professional和Pocket PC 2003中包含了一個IPsec客戶端。因為客戶端支持是基於操作系統的,所以不用再下載。
可以免費從微軟網站上下載另一個不同的IPsec客戶端,「MSL2TP client」,它可以安裝在Windows 95/98/Me/NT4上。儘管與Windows 2000/XP自帶的不同,但在功能上與它十分相似。
到目前為止,微軟好象還沒有Windows 3.X、Windows NT 4.0 Server和Pocket PC 2002及以前版本的客戶端。對於這些不常見的用戶,你可以下載免費的PGPNET,不過它只能用於主機到主機的連接。
可是微軟免費的IPsec客戶端有一個障礙,它只能與另一個協議L2TP結合使用,不與L2TP結合使用可能非常困難(Widnows 2000/XP)或許根本不可能(MSL2TP,Pocket PC)。有的說微軟按照真正的微軟風格採用並增強了IPsec標準。雖然是合理的,但L2TP目前是一個被提議的互聯網標準(RFC 2661)並且是L2TP over IPsec(RFC3193)。另外,PPTP是另一個廣泛被用於VPN的協議,但它不是一個正式的標準。
使用L2TP協議意味著你將使用一個L2TP守護進程。有許多可以使用的L2TP守護進程。當Windows L2TP/IPsec客戶端連接到你的Linux伺服器時,首先打開一個到Openswan的IPsec隧道,然後使用這個隧道連接到 Linux伺服器上的L2TP守護進程,最後客戶端就可以訪問內網的計算機。
一種辦法是,如果你有一台Windows 200X伺服器,用L2TP/IPsec客戶端連接到Linux IPsec伺服器,然後使用IPsec隧道連接到Windows 200X的L2TP服務來代替Linux。這樣的優勢是Windows的L2TP服務對Windows客戶端的兼容性大概比開源的L2TP守護進程要好。註:這樣的安裝,Windows 200X伺服器不是直接連接到Internet,Linux伺服器是。有人可能關心這個安全優勢。如果依靠Windows 200X代替Linux通過 PPP對用戶進行認證,因而你需要客戶訪問許可。
微軟顯然不認為IPsec是為遠程工作者(Road Warriors)提供認證的一個好協議。說點多餘的,因為第三方客戶(PGPNet,SoftRemote等)在這方面完全沒有任何問題。微軟的解釋陳述在它們網頁中的VPN FAQ中。基本上他們主張口令比證書容易使用。但我認為在這後面大概有另外的戰略決定,顯然L2TP協議提供了更加適合微軟的額外認證機制(比如,通過Windows登錄證書認證意味著銷售出更多的NT/200X客戶許可)。
4 過程概況
• 下載Openswan、L2TP 服務、PPP 服務和示範腳本/配置文件。
• 閱讀文檔(包括本文, Openswan文檔, 微軟文檔)。
• 使用你的Linux發行版提供的支持IPsec的內核,如果不支持則要為你的發行版下載支持IPsec的內核。如果沒有,要自己編譯並安裝一個新的支持IPsec的內核。
• 為你的Linux發行版安裝Openswan用戶態工具,如果沒有,你需要自己編譯並安裝它們。
• 修改Openswan配置文件。
• 如果你的Windows或Macintosh沒有內建L2TP/IPsec客戶端,就安裝它。
• 配置客戶端,使用「預共享密鑰」(「口令」)。
• 在客戶端開始(或稱「撥號」) L2TP/IPsec連接。
• 驗證Linux VPN伺服器的IPsec部分成功連接。
• 在Linux上下載、安裝並配置L2TP和PPP服務。
• 調整防火牆,阻止通過外部介面UDP 1701埠進來的數據(非常重要)。
• 在客戶端再次開始L2TP/IPsec連接。
• 驗證Linux VPN伺服器IPsec和L2TP都能工作。
• (可選的)用X.509證書代替「預共享密鑰」。
下面是安裝示意圖。

或許看起來有些困難,不過如果你已經有一個正常工作的Openswan系統,那麼只不過再安裝一個額外的L2TP守護進程軟體包而已。或許你還需要修改一下配置文件。有點複雜的事情是支持NAT-Traversal。我們假設一開始你不需要NAT。
5 安全考慮
認真地看這一部分,如果剛開始看,不要立即採取行動。等你理解並記住后再回過來,這時你已經知道了全部的工作並且你也知道如何避開如Internet這樣的不安全網路。
5.1 阻止外部訪問L2TP守護進程。
應該對L2TP守護進程建立防火牆,使外部介面不能訪問。也可以說:必須為L2TP守護進程建立防火牆,否則你將冒巨大的風險。因此,應該建立防火牆,除ipsec0介面外,阻止從所有介面進來的L2TP連接(UDP 1701)。
5.2 監聽地址參數(僅KLIPS有效)
除對L2TP守護進程建立防火牆外,還有一種更加安全的設置方法。默認情況下,L2TP守護進程監聽UDP 1701埠,假如防火牆關閉,L2TP守護進程將暴露在外部介面。因此,不需要任何人通過Linux VPN伺服器外部介面訪問L2TP守護進程,你需要的是只有經過IPsec認證的客戶可以訪問L2TP守護進程,也就是說L2TP數據包應該通過IPsec隧道,並且伺服器與客戶機之間不是沒有加密的直接相連。可是,默認情況下L2TP守護進程監聽所有介面,包括外部介面(不友好的),它綁定到INADDR_ANY(它能夠識別的那些)。你更願意L2TP僅綁定到ipsec0介面,不過,這是不可能的。不像低層網路應用程序(tcpdump和Ethereal)那樣,你不能將L2TP綁定到某個特定的介面。
幸運的是,L2TP可以綁定到某個特定的IP地址。兩個主流的開源L2TP守護進程(l2tpd和rp-l2tp)提供了補丁,使之可以綁定(監聽)某個特定的IP地址。這個補丁稱為:listen-addr patch。打了該補丁后你只要在L2TP守護進程的配置文件(l2tpd.conf)中增加一行「listen-addr 192.168.1.98」,L2TP守護進程就會綁定(監聽)這個IP地址(一般情況下是內網IP地址)。
因為L2TP守護進程在內部介面上監聽,所以外部介面不能直接訪問守護進程,這很好,可是L2TP守護進程必須通過ipsec0介面才能訪問,所以要配置一下防火牆,讓ipsec0的數據包能夠到達內網。
iptables -t nat --append PREROUTING -i ipsec0 -p udp --sport 1701 --dport 1701 -j DNAT --to-destination 192.168.1.98
這裡的192.168.1.98也是內網介面的IP地址。刪除規則的方法是:
iptables -t nat --delete PREROUTING -i ipsec0 -p udp --sport 1701 --dport 1701 -j DNAT --to-destination 192.168.1.98
在執行這一行時Openswan必須運行,也就是說ipsec0必須存在。作為選擇,你可以增加額外的防火牆腳本供Openswan調用,也就是指定「leftfirewall=參數」。參考這方面的FreeS/WAN文檔(http://www.freeswan.org/freeswan_snaps/CURRENT-SNAP/doc/firewall.html#up_down)。
當正確地使用了listen-addr參數后,L2TP守護進程將不再監聽外部介面,因此就算防火牆停止,L2TP守護進程也不會暴露在外部介面上。可是仍需要對除ipsec0以外的所有介面進來的L2TP連接謹慎地設置防火牆。同時使用防火牆保護和「listen-addr」參數(就像腰帶與弔帶一樣)。
5.3 監聽地址參數和26sec
不幸的是,上面提到的「listen-addr」不能用在2.6內核的本地IPsec執行者(26sec)上,因為26sec沒有ipsec0這樣的介面,而且在普通的2.6內核上IPsec後面進行網路地址轉換(NAT-after-IPsec)會普遍被破壞。在2.6內核上的這些問題有5種解決方法。第一,在2.6內核中使用KLIPS,這樣你就有了ipsec0這樣的介面,FreeS/WAN 2.05支持這樣,Openswan 2.3支持在2.6內核中使用KLIPS,但它仍在開發中。第二,等出現新的IPsec後面進行網路地址轉換(NAT-after-IPsec)不再被破壞的2.6.x內核。第三,用非正式開發的Netfilter補丁來編譯你自己的內核。第四,也是最不理想的,在IPsec伺服器上使用防火牆,也就是讓L2TP守護進程監聽所有介面,防範從外部介面進來的所有L2TP連接。第五,在VPN伺服器前邊放一個有防火牆(也可能是NAT)的路由器,並且允許L2TP監聽所有介面。後邊兩種方法依賴於防火牆,是一種折衷的辦法,萬一禁用或者發生其它原因,L2TP就暴露了。
5.4 ip_forward(IP傳遞)
另一個值得注意的安全點是,人們通常將/proc/sys/net/ipv4/ip_forward設置為1來啟用路由(VPN已經啟用),這樣從IPsec隧道來的數據包將被轉發到內網。可是有一些安全含意,當對某個介面做了限制后,也許一個或多個iptables forward規則同樣可能被欺騙。否則你可以使用iproute2(高級路由)。這有點超出本文的範圍。
《解決方案》

使用Linux L2TP/IPsec VPN 伺服器

6 VPN的選擇
在發掘安裝Openswan和L2TP的技術細節前,先停一下。假設你有興趣讓你的用戶通過Internet遠程訪問,主要原因是:價格、安全、友善的用戶界面,有以下幾種方案供選擇:
1、客戶端用硬體設施。
2、PPTP,例如Windows包含客戶端的。
3、像Citrix、Windows終端伺服器、pcAnywhere或VNC等遠程桌面解決方案。
4、基於SSL的VPN,例如HOB或者Citrix Secure Gateway。
5、非標準的,基於開源的解決方案,如CIPE、vtun、tinc和OpenVPN。
6、第三方IPsec解決方案,如PGP、SafeNet SoftRemote、SSH Sentinel或TheGreenBow VPN客戶端。
7、Windows 2000/XP自帶的IPsec客戶端,手工配置去除掉L2TP。
8、Windows 2000/XP自帶的IPsec客戶端,用免費工具軟體配置去除掉L2TP。
9、像Windows 2000/XP、Pocket PC 2003、Mac OS X v10.3+ 自帶的IPsec/L2TP客戶端,為Windows 95/ME/NT4設計的MSL2TP客戶端。
7 帶L2TP的IPsec的優勢和劣勢
下面是用Windows和Mac Panther自帶的帶L2TP的IPsec客戶端連接到Linux伺服器的優勢和劣勢。
優勢:
1、「免費」。Windows自帶客戶端或者可以免費從微軟下載。Mac OS X 10.3+也帶了一個客戶端,當然客戶端本身不是真正免費,因為已經從Windows/Mac OS許可中支付了。很明顯,它不像免費軟體基金會的軟體那樣真正免費。
2、在客戶端上安裝還算簡單。默認情況下Windows 2000/XP、Pocket PC 2003和Mac OS X 10.3+已經安裝了一個客戶端。Windows 9x/ME/NT4需要下載一些額外的軟體(需要Dial-Up Networking 1.4和IE 5.01以上)。也可以安裝第三方客戶端。
3、使用還算簡單。沒有更多的配置,所以更少出錯。
4、「本地的」客戶端。也就是微軟的蘋果。
5、安全。一般認為IPsec是一個安全的VPN協議。例如,遠遠超過PPTP。L2TP沒有把握,但無論如何L2TP數據包用IPsec加密了。
6、支持「虛擬IP地址」。這意味著遠程客戶一旦登錄后就可以從內網獲得一個IP地址。對其它計算機來說,遠程用戶就像在內部網路上一樣。
7、支持TCP/IP和IPX隧道。使用L2TP,你可以建立一個第二層的隧道,因此從理論上任何三層協議都可以通過隧道。可是多數情況下TCP/IP協議被使用到VPN隧道中,據報道,IPX也能很好地工作。微軟客戶端支持NetBEUI,但pppd不支持,看來NetBEUI大概不能工作。
8、L2TP over IPsec是IETE的一個正式標準(RFC2661)。這意味著許多廠商支持這個協議,像PPTP、MPPE、PEAP、L2sec和OpenVPN等這些相關的VPN方案仍然不是正式標準。
9、NAT-Travelsal。多數IPsec客戶端支持它(但像Windows 2000/XP等只有更新后才支持。
劣勢:
1、可能在伺服器上比較難安裝。L2TP/IPsec或許在客戶端比較容易安裝,但比較來看,它在伺服器上安裝要比PPTP和簡單的IPsec難。因此,很大程度上取決於你的操作技巧和你選擇的Linux發行版。
2、較少的特性。比如一般情況下微軟的客戶端不支持AES加密,很多商業的客戶端和Mac OS X支持AES加密,它要比3DES快得多。
3、支持。在客戶端,你可以請求誰來為你提供支持?微軟嗎?微軟轉售者嗎?Openswan和l2tpd的郵件列表對人們非常有用,但是如果你微軟客戶端的臭蟲,只有微軟能修補它。像Astaro和Xelerance這樣的公司對它們的VPN產品提供支持。
4、需要一個L2TP服務。Openswan提供了IPsec服務,但你還需要一個L2TP服務。還有許多執行者,但它們在Linux/Unix下不常用。
5、需要證書。除非你的客戶端有固定IP地址,否則需要X.509證書。換句話說,你需要一個公鑰基礎設施(PKI:Public Key Infrastructure),另一方面,PPP僅需要口令。
6、沒有更多可用的經驗。帶L2TP和IPsec的結合使用在Linux上還算比較新。大概很少有人會立即使用這樣的配置。
7、不穩定的升級路線。2003年6月微軟對它們Windows 2000/XP自帶的IPsec客戶端進行了升級。MSL2TP基本上是1.0版,儘管它是基於SoftRemote客戶端的。或許微軟不會再更新了,因為Windows版的客戶端已經處於「不支持階段」了。
8、信息包的頂部裝置。通信負載被多次封裝(IPsec、L2TP、PPP),這就需要更多的帶寬,這就導致了一個MTU大小的問題,如果我沒有記錯的話,簡單的IPsec每個數據包有56個位元組的頂部裝置,L2TP會在每個數據包上再增加16個位元組,如果使用NAT-Traversal(IPsec被封裝到UDP里)頂部裝置會更大。我無法做更多的性能測試,
9、慢。L2TP和PPP協議需要在Linux伺服器上運行額外的守護進程。這些守護進程運行在用戶態,這意味著信息包的額外處理和更多的延遲。一般情況情況下,在ADSL線路上,線路速度是瓶頸,不是VPN,但如果VPN運行在LAN上,那麼VPN是瓶頸。
10、在非微軟的客戶端事上比較複雜。L2TP在IPsec頂上對Windows的本地客戶端來說設置比較容易,但不是所有的第三方客戶端都支持L2TP。比如如果你有Linux用戶,讓他們運行L2TP客戶端有點無聊,也意味著你需要做更多的工作,因為你希望提供的支持不只一個,而是不同的VPN選項,也就是IPsec和L2TP/IPsec。
11、NAT-Travelsal。有L2TP/IPsec的NAT-Traversal在Linux上現在是實驗性的。NAT-T由IETE批准,但多數廠商的執行者比草案要早。
12、沒有「完美的安全傳送」PFS是一個可以被IPsec通信啟用的安全特徵,但是Windows和Mac的L2TP/IPsec客戶端不支持(除非用戶手工建立一個IPsec策略,但是那樣用戶界面又不友好,而且容易出錯)。
13、專利問題。Cisco擁有L2F協議的專利,L2TP本質上是由Cisco的L2F協議和微軟的PPTP協議組合而成的。Cisco在L2TP協議上同樣有專利。人們都知道,不排除Cisco想尋求版稅或什麼的。同樣一些公司擁有NAT-Traversal的專利。這個專利問題也許只對美國、日本等軟體專利法非常愚蠢的國家的用戶有影響。
就像你看到的,有這麼多好的原因使你不使用帶L2TP的IPsec,但是,在像IKEv2和DHCP over IPsec這樣更好的解決方案更普遍地使用前,它還因為相當安全這一面和價格影響使人有興趣來考慮它。
8 Road Warrior支持
VPN用戶經常使用動態IP:在他們連接的每一次IP地址都可能不同。比如,一個旅行者用它的筆記本電腦從賓館或會議室發起的連接;一些cable/ADSL提供商使用DHCP來分配有規律地改變的動態IP地址。
使用IPsec有多種方法來支持這種設想:
• 每個用戶共享的「預共享密鑰」(PSK:PreShared Key)。
• RSA認證。
• 在「好鬥模式」(Aggressive Mode)下的「多重預共享密鑰」(Multiple PreShared Key)。
• DHCP over IPsec。
• IKEv2
• X.509證書。
「預共享密鑰」(PSK:PreShared Key)是一個IPsec隧道兩端共享的安全口令。PSK的分發是「脫離網路」(out of band)的,也就是,不通過不友好的網路(Internet),例如,你可以面對面地把寫在紙片上的PSK交給用戶。PSK使用起來比較簡單,但是當用戶數量較多並且你想為Road Warrior使用PSK時,就不太好衡量了,所有使用動態IP地址的用戶使用相同的PSK(「group secret」),當然這是重大的安全風險,假如一個用戶離開了公司或丟失了他的手提電腦,其他所有的用戶必須更換新的PSK。另一種方法是給每個用戶一個不同的PSK,但在IPsec下要求所有用戶都是固定IP地址。因為這些限制,PSK不能用於Road Warrior,除非只有一個用戶或每個用戶都有固定IP地址。
使用RSA認證。你在Openswan的配置中為用戶指定一個處於自然狀態的RSA公鑰。RSA認證支持靜態IP和動態IP地址,RSA認證執行起來也相對光明有份量,並且使用起來幾乎同口令一樣簡單。因為口令不可能被猜出,所以RSA密鑰自然更加安全,這是它的優勢所在。不像口令那樣,用戶記不住RSA密鑰,需要剪切到配置中。不幸的是,支持RSA認證像支持L2TP/IPSec那樣的IPsec客戶端,反之亦然。
一些IPsec客戶端支持「好鬥模式」(Aggressive Mode)。允許動態IP地址使用PSK。尤其是設備只有很小處理能力的客戶端(像Pocket PC和Palm)使用「好鬥模式」,因為RSA加密要比對稱密鑰更加慢。FreeS/WAN需要一個補丁才能支持「好鬥模式」,但Openswan 1.x和SuperFreeS/WAN已經包含了這個補丁。使用「好鬥模式」的麻煩是,安全依賴於口令本身的強度(PPTP有同樣的問題)。像IKEcrack(http://ikecrack.sourceforge.net/)和Cain&Abel(http://www.oxid.it/cain.html)的程序嘗試截取會話並破解「預共享密鑰」。http://www.ernw.de/download/pskattack.pdf有解釋。
XAUTH(混合模式)是IPsec的擴建部分,因為它需要修改IKE標準,所以至今未被IETE批准。Cisco看來是XAUTH的最大支持者。FreeS/WAN和Strongswan不支持XAUTH,但Openswan有一個執行者(默認是禁用的,需要重新編譯)。Philippe Sultan證明(http://www-rocq.inria.fr/who/Philippe.Sultan/vpn/spoofed_vpn_server.html)如果知道「預共享密鑰」可以使用一個被欺騙的伺服器獲得XAUTH用戶名和口令,「預共享密鑰」可以通過「暴力破解」(brute force cracking)獲得或從客戶端複製(磁碟或內存)。關於這個問題可以參看Cisco的「Mutual Group Authentication」(http://www.cisco.com/en/US/products/sw/secursw/ps2308/prod_release_note09186a00802d398a.html#wp1382364),(註:伺服器認證和客戶口令,目前只有Cisico的VPN連接者支持,不是IOS),也可以使用證書來解決這個問題。
DHCP-over-IPsec。Openswan支持,不過只有很少的客戶端支持,Windows客戶端現在只有SSH Sentinel,但它已經廢止了。
IKEv2。是目前IKE的繼承者,它將支持「繼承」像口通過EAP這樣的認證模式,在提議被IETE批准之前大概還需要一段時間,並且Linux上的一個執行者已經可用,IKEv2有望成為主流標準。
X.509證書。幾乎所有L2TP/IPsec客戶端都支持。Openswan也支持它,當然是由Strongsec提供的補丁。證書一般被Road Warrios所推崇。不利的是你需要設置多種PKI(Public Key Infrastructure),這也許是管理負擔,你需要為Openswan主機和L2TP/IPsec客戶端的X.509證書進行生成、發布、撤銷等。
像CRACK、HYBRID、PIC等仍然存在,但當前它們沒有針對Openswan或其它Linux IPsec執行者的執行體。
《解決方案》

使用Linux L2TP/IPsec VPN 伺服器

9 安裝(Linux 內核等)
伺服器端需要以下幾部分:
• Linux內核。需要一個新的,完整的內核,2.4.18或更高,2.6.6或更高。2.6內核包含了「26sec」,一個基於KAME的本地IPsec執行者。
• Openswan 或者Strongwan。
• Strongse的X.509證書補丁。通常情況下Frees/Wan需要。Openswan和Strongswan已經包含了這個補丁。
• 可選的(但對低於2.00的Frees/WAN強烈建議):打Delete/Notification補丁,Openswan和Strongswan已經包含這個補丁。
• 可選的:Mathieu Lafon的NAT-Traversal補丁(http://open-source.arkoon.net/)。
• 如果你使用MSL2TP客戶端,建議對Frees/WAN使用JuanJo Ciarlante的補丁(http://www.jacco2.dds.nl/networking/freeswan-msl2tp-payload-malformed-workaround-1.diff)。
• L2TP服務。Ll2tpd-0.69不能工作,需要使用l2tpd的郵件列表中的額外補丁或自己創建補丁。
• PPP服務。你需要啟用內核的PPP支持。
• Openswan、L2TPD、PPPD的配置文件。
9.1 獲得Openswan、Strongswan或FreeS/WAN
你大概更喜歡使用你的發行版提供的包含KLIPS或26sec的內核,它們可能更先進。稍後,如果你覺得你需要最新的版本、額外的補丁或更多的特性,你可以決定來編譯你自己的內核和用戶態工具。多數多行版包含Openswan或Frees/WAN,當然你也可以下載源代碼來重新編譯。
9.2 X.509證書補丁
Strongsec發布的X.509證書補丁讓FreeS/WAN增加了支持可變IP地址。Openswan和Strongswan已經包含這個補丁。除X.509支持外,這個補丁為L2TP/IPsec提供了額外的極為重要的特性,L2TP/IPsec客戶端應該對IPsec隧道作出:因此只有UDP數據包(IP 協議17)可以穿過隧道的限制。標準版的FreeS/WAN不能做到這樣的限制,普通的FreeS/WAN加密它和另外一端之間的所有協議,而不只是L2TP通信。X.509證書補丁增加了兩個參數來解決這個問題,leftprotoport和rightprotoport。不幸的是存在兩種不同的情況。Windows 2000和XP帶的最初的L2TP/IPsec客戶端需要這樣:
leftprotoport=17/0
rightprotoport=17/1701
其它所有的客戶端(包括更新后的Windows 2000/XP和XP SP2+)使用:
leftprotoport=17/1701
rightprotoport=17/1701
看起來微軟在Windows 2000/XP帶的最初的L2TP/IPsec上犯了一個錯誤(如果不是錯誤就是矛盾)。因此在一個兩種情況混合的環境(包括沒有升級的Windows 2000/XP和其它客戶端),不得不使用分類別的配置文件來支持這兩種類型。
只有最新版的X.509補丁(比如針對FreeS/WAN2.x的1.4.8+和針對FreeS/WAN1.99的0.9.37+)可以真正把IPsec連接限制到指定的協議和埠。老版本的X.509不支持leftprotoport和rightprotoport參數,但它們不能執行這些限制,它們接受協議17(UDP)/埠1701(L2TP)限制,但忽略限制,仍通過IPsec隧道恰當地發送其它所有通信(ICMP、HTTP、SSH等)。
9.2.2隧道協議問題
如果你不使用X.509補丁,L2TP/IPsec客戶端和FreeS/WAN之間會有一個協同工作的問題,IPsec連接不能建議,因為FreeS/WAN報錯:
"peer client ID payload ID_IPV4_ADDR specifies protocol 17; we only support 0"
如果你得到這個錯誤,那麼你需要為FreeS/WAN用戶態程序打X.509補丁。
9.2.3 「Delete/Notification」支持
FreeS/WAN低於2.00的版本忽略「Delete/Notification」信息。Mathieu Lafon為FreeS/WAN製作了一個補丁(http://open-source.arkoon.net/),這個補丁包含了支持這些信息的功能。Openswan、Strongswan和FreeS/WAN 2.00或更高已經包含了這個補丁。
客戶端也許想通知伺服器,它要關閉IPsec連接,它可能通過發送一個「Delete SA」信息來完成。如果伺服器不支持「Delete SA」信息,它簡單的忽略它們,並且IPsec連接也許超時,然而,這時候客戶端當然不能重新連接到伺服器,伺服器對這時發來的數據包感到困惑,它認為這些數據包是舊連接的,反之,客戶端確信它擁有了一個新的IPsec連接。Mathieu Lafon的「Delete/Notification」補丁修正了這個問題。記住,如果客戶端當機或Internet連接被中斷,客戶端不會有發送「Delete SA」信息的機會,在這種情況下,有沒有「Delete/Notification」補丁伺服器都將超時。「Delete/Notification」補丁看起來對MSL2TP客戶端特別有用。(註:MSL2TP客戶端大概發送「Delete SA」信息兩次,第一次將正確地刪除SA,因此第二次將導致一個無害的「ignoring Delete SA payload」信息。)
10、配置Openswan
當你有了支持IPsec的內核,你就需要配置一條或多條IPsec連接。
Openswan文檔中的示例假設Road Warrior客戶想做「主機到網路」的IPsec連接。這裡也這樣假設,另一方面你想訪問被Openswan網關保護的內網。在「普通」的IPsec(也就是無L2TP)下,你使用left/rightsubnet關鍵字。
Openswan文檔不包括L2TP/IPsec連接。在L2TP/IPSec下用戶同樣想訪問內網,但是完成這樣的機制不同。首先,你聲明一個Windows/Macintosh客戶與Openswan伺服器之間的「主機到主機」IPsec隧道。當這個IPsec連接啟動,客戶連接到在Openswan伺服器上的L2TP服務。L2TP服務這時將數據包發往內網。在「普通」IPsec下,Openswan不會把它自身向前轉發。
10.1 預共享密鑰(PSK:Preshared Keys)概述
大多數L2TP/IPsec客戶支持兩種認證方法:X.509證書和預共享密鑰。我假你首先嘗試預共享密鑰方式,當理解IPsec和L2TP/IPsec客戶之如何工作時然後再根據你的需要切換到證書方式。
10.1.1        預共享密鑰(PSK:Preshared Keys):配置一條IPsec連接
下邊是一個Openswan配置文件的示例。它為一個用戶定義了一條IPsec連接。 註:如果你想使用這個配置,你需要修改你的ipsec.conf文件(或在你的ipsec.conf文件增加下邊這句:include L2TP*.conf)。
conn L2TP-PSK-orgWIN2KXP
        #
        # Use a Preshared Key. Disable Perfect Forward Secrecy.
        #
        authby=secret
        pfs=no
        #
        left=123.123.123.123
        #
        # Required for original (non-updated) Windows 2000/XP clients.
        leftprotoport=17/0
        #
        # The remote user.
        #
        right=234.234.234.234
        rightprotoport=17/1701
        #
        # Authorize this connection, and wait for connection from user.
        #
        auto=ignore
        keyingtries=3
你可以看到,配置比較簡單,記住,上邊的說明沒有leftsubnet和rightsubnet。下邊根據多數人的習慣,使用「left」表示伺服器(「local」),使用「right」表示Road Warriors。最新的FreeS/WAN、Openswan和Strongwan支持預共享密鑰和證書方式使用「right=%any」。
註:默認情況下,配置文件不是有效的(為了安全)。如果你想啟用它們,需要把auto=ignore改為auto=add。
10.1.2 指定預共享密鑰
將把預共享密鑰輸入到/etc/ipsec.secrets。
#
# Sample /etc/ipsec.secrets file for server at 123.123.123.123
#
123.123.123.123 234.234.234.234: PSK "thisismytopsecretkey"
123.123.123.123 111.222.111.222: PSK "keyforanotherclient"
# Line below only works on recent versions:

# 123.123.123.123 %any: "keysharedbyallusers"
格式解釋:
#源IP指伺服器,目標IP指客戶。當目標IP地址為0.0.0.0時表示接受任何IP地址。
#新版的軟體支持目標為%any。這兩種情況適用於Road Warrior
源IP         目標IP :PSK        "口令"
10.2 完美安全傳送(PFS:Perfect Forward Secrecy)
「完美安全傳送」提供特佳的安全。當你啟用了PFS,你的敵人(黑客、競爭者等)就不能破解通過IPsec連接傳送的數據包,就是他們可以監聽加密后的連接並且他們擁有你的密鑰(通過黑客、法院指令、第三者等)也不可以。PFS的這個屬性就是著名的「阻止第三者」(escrow-foilage)。
上邊的示例中有這樣一行:
        pfs=no
因為蘋果和微軟的L2TP/IPsec客戶沒有啟用PFS,所以這一行是必需的。另一方面,Openswan默認是啟用PFS的。(有人可能思考,為什麼蘋果和微軟默認情況下沒有使用PFS?這是因為<插入你中意的3個字母的政府部門>;?)
解決這個互通性的問題非常簡單,在FreeS/WAN明確地禁用它。但是這裡有FreeS/WAN小組關於它的說明。
FreeS/WAN默認是。我們認為沒有不的理由;這是更為安全而且成本很小。兩個終端的PFS設置必須相同。如果你在FreeS/WAN的配置文件中ipsec.conf中用pfs=no關閉PFS,但是我們假設有可能你在另一端啟用了PFS。這更加安全。
他們大概是對的,因為在這種情況它工作更好。「另一端」指微軟客戶端或Mac OS X v10.3+。編輯Windows註冊表可以啟用MSL2TP客戶的PFS。這可能有一點危險,如果要求你的用戶來做可能有點難度,因此我們只有每台客戶上啟用PFS或者在伺服器上加一句來關閉PFS。不幸的是我不知道如何在Windows 2000/XP或Mac OS X10.3+的圖形界面下打開PFS。
註:當客戶端請求時Openswan將使用PFS,甚至在Openswan配置文件中指定pfs=no時也會啟用。
11 配置L2TP/IPsec客戶端
假設現在你已經配置好了Openswan,那麼,現在就開始安裝並配置L2TP/IPsec客戶。這根據你的客戶類型(Windows 2000/XP、SoftRemote、Panther、Pocket PC等)不同而不同。
在你配置完你的客戶端后,你應該開始VPN連接,它將首先啟動一個IPsec連接,然後是一個L2TP連接。
12 開始IPsec連接
開始(「撥號」)VPN連接。這一步的過程依賴於不同的客戶端。客戶端將報告一個錯誤(「你撥叫的計算機沒有響應」或類似的信息)。出錯是應該的,你仍沒有配置L2TP服務,所以這時應該忽略錯誤。
不過,IPsec連接應該啟動成功。你可以檢查Openswan的日誌文件(通常是/var/log/secure),它看起像這樣:
Nov  1 14:09:59 xxx Pluto: "L2TP-PSK" #7: responding to Main Mode
Nov  1 14:09:59 xxx Pluto: "L2TP-PSK" #7: Peer ID is ID_IPV4_ADDR: '234.234.234.234'
Nov  1 14:09:59 xxx Pluto: "L2TP-PSK" #7: STATE_MAIN_R3: sent MR3, ISAKMP SA established
Nov  1 14:09:59 xxx Pluto: "L2TP-PSK" #8: responding to Quick Mode
Nov  1 14:10:00 xxx Pluto: "L2TP-PSK" #8: STATE_QUICK_R2: IPsec SA established
如果你看到這樣,祝賀你,你已經完成了IPsec部分,繼續下邊的L2TP部分。如果不是,檢查你的配置或參閱「問題解答(22)」
13 L2TP概述
你剛才配置的IPsec連接是被用來開L2TP協議隧道的(RFC3193中定義了L2TP在IPsec之上)。L2TP在運行時會打開PPP隧道,而PPP為實際負荷開隧道。這意味著在你的Linux系統上你需要一個L2TP服務。
常見的L2TP服務軟體有:l2tpd、rp-l2tp、OpenL2TP、l2tp、internat-l2tp等。
l2tpd和rp-l2tp守護進程使用相同的名字:/usr/sbin/l2tpd,這非常不幸,很多情況下你只能安裝它們中的一個。rp-l2tp看來比l2tpd代碼更好,可是rp-l2tp有一個缺點,它不能自己指動態內網(虛擬)IP地址,如果你為你的用戶分配固定內網地址這就不是一個問題了。有三種解決方案:rp-l2tp可以被延伸,因為它動態分配IP地址,這更接受或有點違反OSI網路分層模型,但方個方法l2tpd可以做到。仍沒有人可以為rp-l2tp執行這個解決方案。第二種解決方案是讓PPP服務從一個DHCP服務(在你的網路上你已經擁有的)獲得IP地址,要想這樣,你需要一個pppd插件——ppp-dhcp。第三種解決方案是使用支持RADIUS的pppd 2.4.2或更高版本,這當然是最靈活的解決方案,但是需要一個RADIUS服務,增加複雜性,尤其是你只有很少用戶時。如果你想讓RADIUS伺服器同PPP一起工作,它必須支持一個稱為「IP pools」的特性。註:后兩種方案在所有L2TP執行者上應該都可以工作,因為它們是pppd的特性,因而它們與你使用的L2TP服務無關。
除L2TP服務之外,你還需要一個PPP服務,因為L2TP被用來開PPP隧道。多數發行版包含一個PPP服務(pppd)。
14 安裝和配置L2TP(Linux)
大概安裝l2tpd最容易的方法就是使用你的發行版中的軟體包。
; Sample l2tpd.conf
;

; listen-addr = 192.168.1.98


ip range = 192.168.1.128-192.168.1.254
local ip = 192.168.1.99
require chap = yes
refuse pap = yes
require authentication = yes
name = LinuxVPNserver
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd
length bit = yes
l2tpd.conf中的參數介紹:
listen-addr        指定l2tpd監聽的IP地址。默認情況下,l2tpd將監聽本機所有IP地址。
ip range        指定供遠程用戶使用的一段內網IP地址範圍。
local ip        指定供Linux伺服器上ppp0介面使用的IP地址。這個IP地址必須是內網的有效地址。這意味著,這個IP地址必須屬於ip range相同的網路,但是它又不在ip range中。
require chap        或refuse chap        和require pap或refuse pap        一般情況下啟用CHAP並且禁止PAP,因為Windows客戶端會提示口令沒有加密(當然是廢話,IPsec已經將連接加密了)。
length bit 一般情況下設為yes,因為沒有它后連接會不太穩定。
14.1 L2TP認證和客戶IP限制(不是重點)
IPsec支持通過「預共享密鑰」和證書方式進行認證。PPP也提供了認證,比如通過口令。生產出來的L2TP也支持認證。問題是,在Windows/Mac的L2TP客戶中,你不能在任何地方指定這些口令。可能沒有哪個廠商認為L2TP認證是必要的。並且正因為如此,它看起不是那麼有用。對於任何人來說,IPsec和PPP認證應該足夠了。
在l2tpd.conf中,require authentication參數容易引起誤會。這個參數在啟用L2TP認證后沒有任何作用。它實際上PPP認證(也就是PAP/CHAP)。Windows客戶端會默認這樣使用,因此你需要在l2tpd.conf配置文件中包含require authentication來啟用PPP認證。
在另一方面,指定參數auth file和challenge后,可以啟用L2TP認證。但就像上邊說的那樣,一般情況不需要L2TP認證。
L2TP也可以根據IP地址進行訪問控制。這比L2TP認證稍微有點令人感興趣。不過,Openswan已經根據IP地址進行了訪問控制。你可以使用l2tpd的訪問控制作為額外的安全方法(就像腰帶與弔帶)。只有在預先知道所有客戶的IP地址時它才能使用,並且毫無錯誤。不包括動態IP地址的Road Warrior。假如你想把l2tpd訪問限制為一個IP地址為234.234.234.234的客戶,那麼你的l2tpd.conf必須增加以下幾行:

access control = yes

lac = 234.234.234.234
15 PPP認證、壓縮和加密
IPsec被用來開L2TP隧道,L2TP在運行時開PPP隧道。PPP有幾種認證方法。最常用的是PAP(不加密口令)和CHAP(基於認證的挑戰/回應)。你可以自由地選擇兩者,最好是CHAP。如果你用PAP,Windows客戶會提示口令沒有加密。這有點離題,IPsec已經加密了。PAP和CHAP都是IETE標準,但微軟收購併增強了CHAP,推出一一個新的MS-CHAP(最近確定為MS-CHAPv2)。
默認情況下,Windows客戶會使用MS-CHAP進行PPP認證。問題是大多數發行版包含的PPP服務不支持MS-CHAP,比如Red Hat Linux 9或更早的版。一個解決方法是配置每個Windows客戶使用CHAP。另一個解決方法是更新pppd到包含MS-CHAP(v2)的2.4.2或更高版本。如果你連接一個不支持MS-CHAP的伺服器,客戶端配置為使用MS-CHAP,pppd將會提示「auth chap 81」和「peer will not authorize」。一但你安裝一個支持MS-CHAP的pppd,你需要在/etc/ppp/options.l2tpd增一行(根據你的pppd版本,參照man pppd):
+mschap-v2
或者
require-chapms-v2
使用PAP或(MS-)CHAP最容易的方法是一個口令文件(secrets)。口令文件指定為/etc/ppp/chap-secrets或者/etc/ppp/pap-secrets(分別對應於PAP還是CHAP/MS-CHAP)。當用戶數量較多而更為複雜的情況下,你也許會尋找更為靈活的東西。這是來自文檔(畢竟它是PPP出版)的一小部分,但是這有多種可能的解決方案:
在l2tpd.conf中使用「unix authentication」關鍵字。賬戶名和口令將依靠Linux用戶資料庫(/etc/passwd)來檢查。為PPP選項增加「login」關鍵字後會它會做什麼。記住,你最好使用PAP,因為(MS-)CHAP不能使用保存在/etc/pssswd文件中的預加密用戶口令。賬戶名仍由/etc/ppp/pap-secrets指定,但是在這個文件中口令為空字元串(「」)時,pppd使用Unix口令。參見:man pppd。
pppd2.4.2以上版本包含了RADIUS插件(radius.so,radattr.so),允許你依靠RADIUS服務對用戶進行認證。在http://poptop.sourceforge.net/dox/radius_mysql.html有利用RADIUS和MySQL的安裝示範。他們使用pppd,同樣也適用於L2TP。
pppd2.4.3及以上版本包含了一個由Samba小組的Andrew Bartlet提供的winbind插件(winbind.so),它提供依靠Samba或Windows域控制器使用MS-CHAP或MS-CHAPv2對用戶認證的能力。Andrew發布了安裝文檔:http://hawkerc.net/staff/abartlet/comp3700/final-report.pdf。
多數ppp守護進程目前編譯時都有PAM支持。這意味著你可以使用所有的認證機制來認證。例如:插入上面提到的winbind插件,你可以用像pam smb(包含pam_smb_auth)、pam_winbind或pam_ntdom(已經停止)的模塊依靠Samba或Windows伺服器認證。還有,你可以用pam_ldap來依靠LDAP服務認證。
在/etc/ppp/options.l2tpd中指定noauth,你就可以完全忘記PPP認證。它可以在任何版本的pppd上工作,因為它不再要求客戶進行PPP認證(當然客戶仍然有IPsec認證)。但是,這還算是一個比較激烈的解決辦法。你不應該簡單地省去PPP認證,儘管它不會對整個安全增強多少。
微軟也開發了MPPE,一種PPP加密協議。它基於RSA安全體系RC4加密演算法,並且被用到了PPTP中。通常,你不要想使用MPPE與L2TP/IPsec結合使用,因為它意味著IPsec和MPPE雙重加密。有時Windows客戶想強制使用MPPE。如果那樣的話,在那些Windows客戶上禁用加密。這可能把用戶搞混。他禁用MPPE加密,認為根本沒有任何加密,IPsec已經提供了加密,但是用戶大概不會知道這些。一些Windows客戶也支持壓縮。你注意,這是PPP壓縮,不是IPsec壓縮(IPCOMP)。微軟使用的壓縮協議(MPPC)是有專利限制的。如果你仍想使用MPPC,參考配置一個LINUX PPP伺服器(http://www.poptop.org)。
《解決方案》

使用Linux L2TP/IPsec VPN 伺服器

16.1 安裝和配置PPP(LINUX)
一旦L2TP連接啟用,它將控制權移交給PPP守護進程。明顯地,你需要一個PPP服務。幾乎每個發行版都有一個pppd。安裝一個最新的版本,比如2.4.1或更高。另外,相同的PPP軟體也可以用來做點別的事情(比如:用於撥號連接的模擬數據機)。幸運的是,你可以在l2tpd.conf文件中用pppoptfile參數來為L2TP守護進程指定一個單獨的PPP選項文件。
注意:PPP守護進程的口令共享給所有PPP進程,不僅僅是l2tpd啟動的那個。可是,你可以限制用戶名/口令的有效性到某些IP地址,就像這個chap-secrets示例文件那樣。
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
jacco           *       "mysecret"              192.168.1.128/25
*               jacco   "mysecret"              192.168.1.128/25
sam             *       "rumpelstiltskin"       192.168.1.5
*               sam     "rumpelstiltskin"       192.168.1.5
每個用戶都有兩個入口,兩端的認證。在這種情況下,用戶jacco將從像/etc/l2tpd/l2tpd.conf文件中指定的l2tpd的IP地址池(在示範配置文件中是192.168.1.128——192.168.1.254符合192.168.1.128/25) 獲得一個地址。用戶sam總是從PPP服務獲得192.168.1.5。這是一種給用戶在你的內部區域網上的固定虛擬地址的方法(它看起來能工作,但是不能100%確認在任何情況下都能工作)。如果你不想在IP地址作任何限制,你可以使用通配符「*」來代替IP地址(不推薦這樣,因為它會允許用戶自己確定自己的地址,有一定的風險)。
微軟客戶端有一個選項「登錄到Windows」如果啟用它,客戶端嘗試用「\\DOMAINNAME\username」驗證。另外,你還可以在chap-secrets或者pap-secrets文件中指定這個用戶名格式。
關於解決如何配置PPP伺服器這個主題的資料很多,如PPP Howto(http://www.linux.org/docs/ldp/howto/PPP-HOWTO/)。
簡單點,我們假設你的Linux伺服器外網介面是eth0,並且內網介面是eth1。PPP服務允許遠程用戶用一個內網的IP地址,一旦用戶連接上,ppp0介面將會自動啟動。l2tpd.conf中有一行「local ip」,用這個參數指定內網的一個固定IP地址供L2TP守護進程使用。
你看到的PPP選項文件示範那樣(/etc/ppp/options.l2tpd),你也可以指定DNS和WINS伺服器,當連接成功后,遠程客戶將會自動獲得這些參數。一般情況下,你應該為遠程客戶指定的DNS/WINS就像直接連接的內網客戶一樣。可是,Windows 2000/XP自己的L2TP/IPsec客戶端好象只支持獲這些DNS/WINS伺服器(當它的Internet連接配置為動態IP地址時)。
註:options.l2tpd包含proxyarp參數。這個參數將在內網介面(示例中的eth1)為遠程用戶打開一個代理ARP入口。如果這個關鍵字沒有指定,Windows客戶端發出的數據包將到達內網伺服器,但這些伺服器不知道向哪兒發出回應,因為沒有人回答它的ARP請求。用proxyarp參數,內網機器被到遠程Windows客戶到網關發送進來的數據包欺騙。網關讓IP繼續向前,因此它知道如何發送數據到Windows客戶端。
16.2 MTU問題
你的VPN連接有斷斷續續的問題,它可能是一個MTU問題。你大概會看這樣的問題:你可以ping內網的機器,並且你可以複製非常小的文件,但是你不能複製大文件,因為連接中斷。試著在/etc/ppp/options.l2tp文件中增加以下幾行減少MTU到1410(或許更低)。
mtu 1400
mru 1400
當你的連接通過VPN到用broken Path MTU Discovery站點時,這個問題可能特別明顯。大概用PPTP或PPPoE的ADSL連接同樣有這樣的問題。如果認證成功前連接失敗,減少PPP數據包的大小是沒有用的。試著使用更小的證書或不使用被NAT的連接。
FreeS/WAN的郵件列表中有一些討論,FreeS/WAN小組寫到:「可以在ipsec.conf的配置安裝用一節用overridemtu=參數改變MTU。」一般情況下,這個參數僅支持KLIPS,不支持26sec。其它的提有,減少你的證書大小(短姓名,更少的X.509v3選項等),或用IPCOMP壓縮。你也可以試著強制你的乙太網介面使用一個更小的MTU:ifconfig ethx mtu 1400。
Cisco也有關於這一問題的一些文檔。微軟知識庫中的Q314053解釋了如何為一個指定的適配器設置MTU。
17 再次開始L2TP/IPsec連接
到這裡,你已經配置好了IPsec、L2TP、PPP,在Windows或Mac客戶端再次開始VPN連接,這個過程和上邊的一樣,但這一次L2TP連接應該正常啟動,如果成功了,祝賀你,你獲得了一個成功的L2TP/IPsec配置。如果它不成功,檢查你的設置,也可以看下面的「檢查並修理故障」。
有兩種比較好的檢查辦法:
1、在客戶端和伺服器之間放一台計算機,你可以用這台計算機靠tcpdump或Ethereal這樣的網路監視程序來sniff客戶端和伺服器之間的通信。數據包必須被加密,如果你看到未被加密的數據包(舉例來說,出現文本「L2TP」),說明你的設置有問題。
2、在客戶端使用nmap或其它更好的埠掃描工具來掃描伺服器上開放的埠(用法:nmap –sU 123.123.123.123),你不應該能看到L2TP守護進程(UDP 1701),打開的埠應該只有IKE(UDP 500)和隨意的UDP埠,比如4500(NAT-T)。
18 對L2TP/IPsec的一些評論
在第一次測試期間,我忘了在Windows工作站的TCP/IP配置里輸入默認網關和主機名,對於Linux伺服器在本地網路來說真的不是一個問題,可是當我從Windows客戶端向Linux伺服器發起一個連接時,l2tpd在/var/log/message里提示一個有點模糊的錯誤信息「Specify you hostname」,最初我想大概是l2tpd不能探測到正在運行的Linux伺服器的主機名,我在Windows工作站里輸入主機名后這個問題解決了,我只是簡單地認為l2tpd不需要它。
19 NAT-Traversal
19.1 緒論
在客戶端和IPsec伺服器之間有時需要網路地址轉換(NAT:Network Address Translation)。比如:當用戶把他所有的計算機聯網並通過一個NAT路由器共享上互聯網。還有一種情況是VPN伺服器自己位於NAT設備(UDP 500、4500傳送到VPN伺服器)之後。甚至在有些情況下客戶端和伺服器都位於NAT之後。有些ISP也使用在他們的路由器上使用NAT,我們看到許多GPRS服務商使用NAT,比如,他們給GPRS電話分配10.x.x.x或192.168.x.x地址。
NAT將在數據包穿過時改變它。問題是VPN會設法防止數據包改變。一些NAT設備支持「IPsec passthrough」,允許一次一個用戶的IPsec通過,相同的NAT設備后的不允許多個連接的用戶。
如果同L2TP/IPsec一起使用NAT-T,考慮到是實驗性的並且不安全。Linux kernel 2.6包含的一個不同的IPsec執行者(「26sec」)也支持NAT-T。顯然它也有與Openswan等的NAT-T補丁相同的安全問題。26sec執行者支持KAME用戶態程序(多數發行版的ipsec-tools)也支持Openswan/Strongswan/FreeS/WAN 2.x。切換到ipsec-tools並不能改變安全問題。
19.2 局限性和需求
NAT-T支持26sec(推薦kernel 2.6.6及以上),最新的發行版如Fedora Core2+、Debian unstable、Mandrake 10.0+、SuSE 9.1+使用了帶26sec的內核,支持NAT-T。如果你在內核中使用KLIPS代替26sec,你需要Mathieu Lafon的NAT-Traversal補丁(http://open-source.arkoon.net/)。註:根據Mathieu,NAT-T在傳輸模式(Transport Mode)可能不安全。微軟、SSH、SafeNet不支持NAT-T,但他大概會對非安全工作區拿出一個方案。老版的Red HAT、Mandrake、SuSE內核沒有包含KLIPS的NAT-T補丁,對於這些版,你將需要重新編譯內核,因為NAT-T補丁涉及到了內核的TCP/IP部分。如果你用的是FreeS/WAN用戶態工具,你還要打這個補丁。Openswan和Strongswan已經包含了這個補丁。打過補丁后的FreeS/WAN在Makefile明確啟用了傳送模式下NAT-T。Openswan和Strongswan已經支持傳送模式下NA-T。
Openswan的NAT-T支持對26sec和KLIPS都有效,在配置文件ipsec.conf中添加「nat_traversal=yes」即可,客戶端不在NAT後面不受影響,客戶端的任何程序都仍將正常工作。
KLIPS的NAT-T補丁目前不支持使用「預共享密鑰」認證的連接。如果你在KILPS和NAT-T使用了「預共享密鑰」,Openswan將不允許連接,因為發送者的埠不是500,並且NAT-T補丁不能支持它,這應該引起程序員的注意。「預共享密鑰」有一些缺點,因此你應該使用證書。26sec執行者支持「預共享密鑰」,但你將不得不使用right=%any、leftid=和rightid=。如果你用right=a.b.c.d指定了一個IP地址,但沒有left=和right=,Openswan會提示「no connection authorized」。
如果你在同一NAT設備後面有多個客戶端,只有第一個客戶端可以連接,這大概是Linux內核的一個限制。另一個限制大概是客戶端不能共享相同的NAT-ed(internal)地址。當然這十分難以消除,尤其是遠程客戶端之間的一個小的團隊。另一個限制是如果客戶端和伺服器都位於NAT后,我沒有親自測試過,但是我收到這方面的一份報告,它不能工作,不過我不能確定到底是雙重NAT引起的還是其它原因。
幾乎所有L2TP/IPsec客戶端都支持NAT-T。Windows Server 2003也支持NAT-T。像承諾的那樣,微軟為Windows XP和Windows 2000 Professional發布了一個IPsec升級包(MS KB Q818043)。這個升級包同樣也包含在Windows XP Service Pack 2,可是它製造出來的NAT-T升級包有導致第三方應用程序出現一大堆錯誤印刷的問題,因此微軟要召回它的升級包,2003年8月他們重新發布了一個補丁,這個補丁可能通過Windows Update安裝,如果你使用的是Windows 2000 Professional,你需要先安裝Service Pack 3或更高版本,另外,IPsec升級包不會在Windows Update顯示,對於Windows XP,你需要Service Pack 1或更高版本。如果升級包仍沒有在Windows Update中顯示,轉到Windows Update Catalog並且使用「高級搜索選項」搜索「818043」,如果你想下載NAT-T升級程序到硬碟併發給更多的客戶端,你可以使用Windows Update的Download Basket(見:http://support.microsoft.com/default.aspx?scid=kb;ZH-CN;323166)或Software Update Services(見:http://www.microsoft.com/windowsserversystem/sus/default.mspx)。
依據微軟員工的信件,也將可以對Windows 2000 Server和ISA Server更新,不過微軟寧願你升級到Windows 2003。引用微軟的話(KB Q818043):「在 Windows 2000 路由和遠程訪問中不會增加 NAT-T 伺服器端支持。」如果你的伺服器運行的Linux,微軟的這個決定不會影響到你。
除SSH Sentinel之外所有的客戶端都會自動檢測NAT-T是否啟用。SSH Sentinel需要手動在VPN連接的「屬性」窗口的「高級」選項中啟用「NAT-Traversal」。
19.3 L2TP/IPsec客戶端支持NAT-T的情況
成功測試的(也就是看起來能工作,但是仍認為是試驗性的並且不安全的)。
• Windows XP Home/Professional(帶有IPsec update Q818043或Service Pack2)。支持Windows需要最新的高於0.6c的NAT-T補丁(檢查/var/log/messages里的Openswan的啟動信息來查看你伺服器上的NAT-T版本)。這個補丁已經包含在Openswan2.x和Strongswan中,如果你的伺服器沒有這個補丁,你將在LOG文件中看到「unsupported ID type ID FQDN」錯誤信息。如果沒有http://www.advancevpn.com/public/super-freeswan-818043NATv3.patch補丁(Openswan 2.x和Strongswan 2.0.2+包含有這個補丁),你將得到「no connection is know」的錯誤信息(LOG中顯示的IP地址和埠號被一個大數代替)。如果你用的是帶SP2的Windows XP並且你的Openswan伺服器位於NAT後面,你可能需要修改系統註冊表。
• Windows 2000 Professional(帶IPsec update Q818043,這個更新不包含在任何服務包中),參考上邊提到的Windows XP。
• Windows 2000 Server(當客戶端使用):據一黑客報道,它可以工作,這個版本的Windows在Windows Update中不會顯示IPsec update Q818043,但如果下載Windows 2000 Professional的IPsec update Q818043補丁並安裝。微軟大概不支持這樣,也就是說它可能會破壞你的「支持合同」。在Widnows Update,到Windows Update Catalogue並選擇「Windows 2000 Professional SP3和你的語言版本,在「高級搜索」中選擇「包含這些字元:818043」,把這個更新加入到「Download Basket」,下載並安裝。
• Windows Server 2003(當客戶端使用):內建了NAT-T支持,也使用ID_FQDN方法(參考上邊提到的Windows XP)。
• MSL2TP客戶端連接到一個基於Linux的KLIPS伺服器。
• SafeNet SoftRemote V7.0.5和9.2.1(可能僅用於KLIPS)。
• SSH Sentinel V1.4.1 build 98連接到基於KLIPS的伺服器。可是有一個斷開連接的問題,Sentinel看起來不會發送「Delete SA」數據包,Openswan仍認為這是一個IPsec連接,因此客戶端在IPsec連接超時前不能訪問Linux機器的在外部介面。
• Pocket PC 2003(「Windows Mobile 2003 for Pocket PC」)用證書連接。可以工作,但只有證書比較尺寸比較小時可以。
• Pocket PC 2003用「預共享密鑰」連接到基於26sec的伺服器。
不能工作的:
• MSL2TP客戶端連接到基於26sec的伺服器。
• SSH Sentinel V1.41 build 98連接到基於26sec的伺服器。
• SSH Sentinel V1.4 build 177。
• SSH Sentinel V1.3或更低。
• Pocket PC 2003用「預共享密鑰」連接到基於KLIPS的伺服器。
至今不能工作的:
• Mac OS 10.3 Panther。
19.4 準備NAT-T
啟用NAT-T的過程:開始取決於你的發行版的內核是否包含26sec或KLIPS,如果你的內核支持26sec那麼內核已經支持NAT-T。如果你的發行版的內核既沒有包含26sec也沒有包含KLIPS,那麼很明顯沒有為IPsec提供NAT-T支持。即使你的內核支持KLIPS,大概仍不支持NAT-T。發行版根本不帶任何IPsec支持或帶一個基於內核沒有NAT-T補丁的KLIPS大概需要安裝一個新的內核。如果你需要安裝並且重新啟用一個新內核RPM,確認獲得了對內核RPM的一般警惕,也就是不要更新內核,要重新安裝新內核來代替當前內核,並且在lilo.conf中為新內核增加一個入口,然後重新運行一下lilo(也可能使用GRUB)。
19.4.1 基於內核的26sec使用NAT-T
不像KLIPS的NAT-T補丁,26sec執行者支持「預共享密鑰」認證的NAT-T。可是你不能用right=a.b.c.d參數指定一個固定IP地址,將將只好指定right=%any並且使用leftid=/rightid=,這意味著「預共享密鑰」被所有Road Warriors共享。你也只好在ipsec.secrets中使用%any:
123.123.123.123 %any : PSK 「thisismytopsecretkey」
不能使用l2tpd的listen-addr參數,因為26sec沒有使用ipsec0樣式的介面。
19.4.2 基於內核的KLIPS使用NAT-T
KLIPS的NAT-T補丁不支持「預共享密鑰」。
19.5 關於NAT-T的發行版細節信息

19.6 啟用NAT-T的過程
當你有一個支持NAT-T的內核和用戶態工具,你可以依照下面的過程為L2TP/IPsec客戶端啟用NAT-T。
• 確認L2TP/IPsec客戶端支持NAT-T,這常意味著你需要獲得最新版或安裝更新。
• 如果你的NAT設備支持IPsec passthrough,修改它的配置來禁用IPsec passthrough。
• 如果你的Openswan服務位於一個NAT設備後面並且你使用的客戶端運行的是帶SP2的Windows XP,你可能需要修改客戶端的註冊表。
• 在Openswan的配置文件ipsec.conf里添加一行nat_traversal=yes。
• 如果用戶的工作站位於NAT設備後面,IP地址是私網地址,Openswan在它可以商談一個連接前需要知道關於這個地址的一點情況,用戶NAT設備的公網IP用right=參數指定,有三種方法指定位於NAT設備後面的用戶工作站的私網地址:
方法1:rightsubnet=192.168.111.40/32
方法2:rightsubnetwithin=192.168.111.0/24
方法3:rightsubnet=vhost:%no,%priv        (推薦)
第一種方法Openswan、Strongswan和所有的FreeS/WAN都支持,但明顯它不是特別靈活,你的每個Road Warriors可能使用單獨的/32,這種方法不方便。第二種方法是X.509補丁的一個特點,這意味著只有Openswan和Strongswan支持,FreeS/WAN打過X.509補丁后才能支持。可以接受你指定的一個子網並且客戶端使用的私有的地址(/32)位於這個子網。注,這和簡單的配置rightsubnetwinthin=0.0.0.0/0相比不是一個好的主意。第三種方法是NAT-T補丁的一個特性。這意味著Openswan和Strong在KLIPS和26sec上都支持,FreeS/WAN需要打過補丁后才支持。首先你在ipsec.conf文件中用virtual_private=192.168.101.0/24參數指定子網。一些人更願意使用這個參數來列舉所有的RFC1918子網,除這些之外都用在你的Linux伺服器上。參考NAT-T文檔的示例,客戶端的私有地址(/32)在任何這些子網都可以接受。另外,%no允許相同的配置文件用到沒有位於NAT設備後面的客戶。
20 Windows網路(WINS等)
在許多方案中,VPN是用來開NetBIOS/SMB/CIFS網路傳輸(Windows網路)隧道的,不幸的是Windows網路是一個很糟的協議(可以諮詢Samba的開發人員)並且它經常導致各種問題,這不是一篇Windows網路指南,因此我不能在那方面幫助你,但是我可以提供一些提示:
如果你想通過子網(包含WAN和VPN)瀏覽「網上鄰居」,非常推薦有一台WINS伺服器,如果你沒有一台可用的Windows NT/2000/2003或你不想購買它,你可以下載Samba(網址:http://www.samba.org)並且將它配置成WINS伺服器。記住這個重要的部分:所有計算機必須配置成使用WINS服務,否則一些計算機看其它計算機可能有點麻煩。
我也注意到,最好的結果是所有的客戶端應該配置成使用相同的工作組名或域名,也就是辦公網路。許多客戶端都有一個默認的工作組名或域名(比如WORKGROUP或MSHOME),與實際辦公網路的工作組名域名不同,最好將這些改成相同的名字。在ISA Server.org網站(http://www.tacteam.net/isaserverorg/vpnkitbeta2/vpnclientbrowsing.htm)可以找到類似的技巧。
微軟的客戶端有一個「登錄到網路」的選項,如果你想登錄到域控制器就啟用它。
Windows XP Home不能加入一個域,可是你應該可以訪問域中的資源。
自從微軟認可L2TP/IPsec協議以來,我還沒有真正試過讓登錄腳本(批處理文件)工作,理論上它應該可以工作。在連接嚮導的最後一步,計算機詢問你這個連接是供「我自己」還是「使用這台計算機的所有人」使用,應該選擇「所有人」。你也許喜歡不輸入口令,在你下一次登錄時點擊「選項」按鈕,你可以看到出現一個複選框「通過撥號網路登錄」,選中這個複選框,用你的Windows用戶名和口令登錄,你可以看到一個窗口讓你選擇的連接,其中有你剛才創建的VPN連接,選擇它你就可以通過VPN連接登錄,並且登錄腳本就會啟動。
《解決方案》

使用Linux L2TP/IPsec VPN 伺服器

21 分離隧道
如果你一個連接到辦公室的VPN,一般情況所有的數據包通過VPN隧道發送,這不僅是傳送到內網伺服器上的,而且也有傳送到互聯網上的,比如當你在互聯網上衝浪時。這是一個缺點,互聯網通信要通過辦公室的互聯網連接兩次,一次從本機到辦公室,第二次從辦公室到互聯網。
另一方面,如果你使用「分離隧道」,所有內部通信將通過VPN進行隧道傳輸,但所有互聯網傳輸將被直接發送到互聯網,也就是不通過辦公室的互聯網連接。但這樣做缺乏安全,這時客戶端用戶有兩條連接:一條到辦公室,另一條到互聯網,理論上黑客可以突破並進入用戶的家庭計算機並從那裡訪問辦公室。如果禁用「分離隧道」,這將難以做到。
在Windows 2000/XP和MSL2TP,通過修改你創建的VPN的「高級」TCP/IP設置,可以啟用或禁用「分離隧道」。你可以取消選擇稱為「使用遠程網路的默認網關」來啟用「分離隧道」。在SSH Sentinel 1.4或更高版本上,你可以在「高級」選項中啟用或禁用「分離隧道」。
通常,推薦避免啟用「分離隧道」。你得到一點額外的帶寬但你也引入了一個安全問題。如果你擔心用戶沒有經過你的許可秘密地啟用了「分離隧道」,你可以考慮給VPN客戶端分配不在子網內的虛擬IP地址,這不是一個萬全之策,但可以保證防範多數用戶。不在子網內意味著虛擬IP地址(用l2tpd的「ip range」參數指定)不屬於內網。你將只好在VPN伺服器上做一些額外的路由,這樣在虛擬IP子網上的客戶仍然可以訪問在內網上的資源。假設你配置了不在內網的虛擬IP地址,因此當一個用戶連接時會發生什麼?當一個用戶禁用了「分離隧道」,默認路由將到達VPN伺服器,用戶可以訪問內網資源,因為VPN伺服器上有額外的路由。互聯網端也通過VPN伺服器的路由操作從而可以訪問。可是當用戶啟用「分離隧道」,事情就有一點不同了,VPN客戶默認路由將成為到達互聯網,因此互聯網端將可以訪問。但內網的資源將不再可以訪問。客戶端是不在內網的虛擬IP地址,因此到達內部網的數據包將被送到默認路由(互聯網)而不是VPN伺服器。如果你在內網使用私有的不可路由的IP地址(根據RFC 1618 e.g.192.168.1.0/24),那麼IPS將丟棄這些數據包。換句話說,啟用「分離隧道」后VPN客戶將不能訪問在內網的資源,這完全是客觀事實。不幸的是,這個方法可以被用戶繞過,只要用戶在他們的工作站上定義了一個到內網的靜態路由即可。對粗心大意的用戶沒有辦法,除非根本不用VPN。
22.1 發現並修理故障
很自然,VPN使維修工作更困難,VPN不想對假設潛在的攻擊問題給出更多的信息,數據包被伺服器默默地丟棄,發送到的客戶端的錯誤信息大概沒有多大幫助。所以說要對你的L2TP/IPsec連接可能出現的問題給出一些技巧。
使用ipsec verify命令。不是報告的每個錯誤是真實的問題,不過在某一種情況可能有幫助。例如,如果你不是用「隨機加密」(Opportunistic Encryption),你應該忽略關於「丟失反向DNS記錄」(missing reverse DNS entries)的錯誤信息。
一些IPsec數據包被封鎖。例如,當在路由器上有一個限制過分的防火牆或者ISP總是阻礙VPN協議。用tcpdump驗證IPsec數據包(UDP 500/4500和IP 50)真正到達你的Linux伺服器,你也可以使用Openswan的ipsec ikeping命令,通過一層一層地跟蹤數據包就可以把問題診斷出來。
tcpdump -n -i eth0 not port 22
tcpdump -n -i ipsec0 -s 1500
tcpdump -n -i ppp0 -s 1500
tcpdump -n -i eth1
(eth0是敵對網路也就是互聯網,ipsec0是運行在敵對網上的IPsec連接,ppp0是通過IPsec隧道的L2TP/PPP連接,eth1是內網,如果你的設備命名不同,依照你的設備修改。)
在eth0介面上,你不應該看到任何未加密的數據包(比如出現「L2TP」),如果你看到未加密的數據包,這不是一個安全的VPN。有一個例外,2.6內核自帶的IPsec執行者(「26sec」)沒有ipsec0介面,你在外部介面eth0上運行tcpdump,你可以在一個方向上看到未加密的數據包。在Mandrake 10上,tcpdump可能在對數據包解碼時會出現錯誤,大概是校驗和無效。最好的解決方案是在客戶端和伺服器之間用第三個系統檢查,在這兩者之間的通信上用tcpdump或Ethereal等嗅探,你將看到所有的數據包被加密。
使用ping測試數據包流程。
ping <external IP>;
ping <internal IP >;
ping <local ip in l2tpd.conf>;
ping <any IP address on internal network>;
22.2 IPsec日誌
Openswan的錯誤信息日誌在/var/log/secure。如果你需要更詳細的,你可以在ipsec.conf中添加plutodebug=all啟用Pluto(IKE守護進程)診斷功能,如果出現嚴重的問題,比如執行或協同工作的問題,你甚至可以添加klipsdebug=all啟用KLIPS(內核)診斷功能。這也將顯示被內核默默地丟棄的數據包。激活這些設置需要重新啟動Pluto。更多的信息請參考FreeS/WAN Troubleshooting Guide(http://www.freeswan.org/freeswan_snaps/CURRENT-SNAP/doc/trouble.html)。不要在產品安裝中使用這些設置,因為它們非常容易讓壞傢伙進行DOS(Denial Of Service)攻擊。
如果你的IPsec能工作,但你仍不能登錄,你也許需要看一下L2TP和PPP錯誤信息,它們保存在/var/log/messages。但不是所有的錯誤信息都記錄在這裡,Mandrake把詳細診斷信息記錄在/var/log/deamons/*。在RedHat上,你可以修改/etc/syslogd.conf並且在包含/var/log/messages的這行增加「*.debug;」來增大診斷等級,然後輸入service syslog restart來重新啟動系統日誌服務(syslogd)。
22.3 網關不可到達
如果你使用KLIPS並且得到下面的錯誤:
route-host output: /usr/lib/ipsec/_updown: doroute `ip route add x.x.x.x/32 via x.x.x.x dev ipsec0 ' failed
(RTNETLINK answers: Network is unreachable)
這意味著數據包不能路由到適當的ipsecN介面,因此它們沒有被KLIPS處理。你可以在Openswan的配置文件中增加額外的一行來解決這個問題。如:
conn L2TP-CERT
        authby=rsasig
        pfs=no
        left=123.123.123.123
        leftnexthop=<IP_address_of_your_gateway>;
        leftrsasigkey=%cert
        leftcert=/etc/ipsec.d/ssl/localCERT.pem
        etc.
如果你用26sec代替KLIPS的話就沒有ipsecN介面,所以從理論上說「leftnexthop」參數不會工作,但我注意到,當Openswan伺服器位於NAT後面時需要使用這個參數。
22.4 戰神攻擊
如果tcpdump顯示Linux伺服器看起來沒有對來自Windows/Mac客戶端的數據包做出響應,那麼可能沒有禁用反向路徑過濾(Reverse Path Filtering)。如果你在/var/log/messages里看到這樣:
martian destination 127.0.0.1 from 192.168.0.222, dev ipsec0
martian source 192.168.0.200 from 192.168.0.222, on dev eth0
ll header: 00:00:00:00:00:00:00:40:33:2c:70:c8:08:00
那麼你需要清空rp_filter。如果在/var/log/messages向回翻,你可以看到FreeS/WAN有這樣的提示:
ipsec_setup: (/proc/sys/net/ipv4/conf/eth0/rp_filter = `1', should be 0)
如是eth0設備,使用echo 0 >; /proc/ss/net/ipv4/conf/eth0/rp_filter可以快速修復這個問題。作為選擇,你可以在/etc/sysctl.conf中添加net.ipv4.conf.default.rp_filter=0。
22.5 Windows診斷
另外,你可以檢查Windows客戶端的日誌,我對在Windows上的錯誤信息沒有較好的印象,我發現Linux端的論斷信息(Openswan、l2tpd、pppd)更加有用。下面有兩篇微軟的關於啟用Windows 2000/XP的IPsec和PPP日誌功能的文章:
啟用對IKE商議詳細過程日誌(http://www.microsoft.com/technet/prodtechnol/windowsserver2003/proddocs/standard/sag_ipsec_tools.asp)。
HOW TO:在Windows上啟用PPP日誌(Q234014)(http://support.microsoft.com/default.aspx?scid=kb;en-us;234014)。(技巧:set tracing * enable將記錄更多)
如果你為IPsec和PPP啟用日誌,你將分別得到OAKLEY.LOG和PPP.LOG文件。PPP.LOG不總是有用,因為很多細節被記錄成十六進位轉儲的二進位。你可以使用Windows 2000 Professional的網路監視器(Network Monitor)檢查客戶端和伺服器之間的通信。Windows XP沒有帶網路監視器,但你可以安裝網路監視器驅動程序(Network Monitor Driver)然後使用Netcap把通信過程寫入一個文件,這個文件可以被Windows 2000的網路監視器或像Ethereal這樣的軟體分析。
悲哀的是在Windows的比較晦澀的錯誤信息中很難找到好的信息,例如,一次想連接到一個Windows伺服器,但是失敗了,啟用IKE踴躍后,OAKLEY.LOG顯示出這些錯誤:
7-26: 13:50:20:656:1e4 Policy mismatch on offer method 1 policy method 1
7-26: 13:50:20:656:1e4 Attribute Phase II Diffie-Hellman group descriptor
7-26: 13:50:20:656:1e4      Expected: 0
7-26: 13:50:20:656:1e4      Received: 2
它簡單地意味著Windows不想用FPS,但另外一端使用了PFS(DH Group2),當我在另一端禁用PFS后,你在哪裡可以發現這些論斷信息?你告訴我……
MSL2TP客戶端更多的「發現並修理故障」信息在「Administrator』s Guide to Microsoft L2TP/IPsec VPN Client」( http://www.microsoft.com/technet/itsolutions/network/maintain/security/vpnclnta.asp或者http://www.microsoft.com/windows2000/docs/VPNClient_AdminGuide.doc)。你應該做的一件是是:在MSL2TP客戶端啟用日誌。「開始」菜單里有一個目錄「Microsoft L2TP/IPSec VPN Client」,這個目錄里的有一個L2TPConfig.exe(稱為:Microsoft IPsec VPN Configuration),裡面有一個設置「Enable IPsec logging」,然後它會在C:\Program Files\Microsoft IPSec VPN Client目錄下創建一個名為Isakmp.log的日誌文件。在微軟TechNet的Cable Guy(http://www.microsoft.com/technet/columns/cableguy/cg0502.asp)也有這方面的診斷技巧。如果你用的是Windows 2000/XP,下面的微軟知識庫文檔也許有用:
Basic L2TP/IPSec Troubleshooting in Windows XP
(http://support.microsoft.com/?kbid=314831)
Basic IPSec Troubleshooting in Windows 2000
(http://support.microsoft.com/?kbid=257225)
Basic IPSec Troubleshooting in Windows
(http://support.microsoft.com/?kbid=259335)
在VPN上DNS問題比較普遍,下面這個網站有解答這方面問題的技巧:http://www.tacteam.net/isaserverorg/vpnkitbeta2/dnsvpn.htm
23.1 證書
X.509證書可以像「預共享密鑰」那樣來使用。你需要設立多種公鑰基礎設施(PKI:Public Key Infrastructure)來為Openswan主機和Windows IPsec客戶端創建私有密鑰和X.509證書。
不要忘了,一旦你開始使用證書,就要禁用「預共享密鑰」配置文件。如果「預共享密鑰」和證書配置文件在同一個客戶端(或IP地址)上,將會把Openswan搞混。「預共享密鑰」配置將優先。如果你需要證書和「預共享密鑰」為Road Warriors同時工作,請參考Sverre Gunnersen的使用說明(http://www.nthdegree.com.au/sverre/publications/141004.html)。
OpenSSL是生成證書的常見選擇,因為它是開放源代碼的並且自由使用,
應避免在證書中使用特殊字元。像OpenCA、TinyCA、IDX-PKI這樣的軟體在建立「認證中心」時非常有用。作為選擇,你可以購買一些軟體來生成證書。Windows NT/2000/2003帶了「認證中心」軟體。SSH銷售Certifier,一個「在管理服務提供者和企業環境發布和管理數字證書的PKI平台產品」。還有許多像Verisign和Baltimore等廠商。
任一種方法,最終都將得到PKCS#12格式的證書。PKCS#12是一個發布密鑰和證書的標準。PKCS#12文件的擴展名為.p12或.pfx,包含了客戶端的私有密鑰,相應的證書和根CA的證書(甚至可能是一個CA證書鏈)。既然它包含了客戶端的私有密鑰,PKCS#12文件被使用口令加密。記住,客戶端證書不得不通過相同的「認證中心」簽名,像Openswan的證書一樣。
在Windows 2000/XP下使用MMC(Microsoft Management Console)為L2TP/IPsec導入證書。因為Windows 95/98/Me沒有帶MMC,只好在Internet Explorer中導入PKCS#12文件,也就是在「工具」——「Internet 選項」下的「保存證書」。OpenSSL命名文件的擴展名是.p12,介是Internet Explorer只識別擴展名為.pfx文件,所以必須選擇「顯示所有文件」,然後再導入.p12文件。一旦證書(帶機器的私有密鑰)被導入到Internet Explorer中,它也適用於MSL2TP客戶端。
Windows 2000/2003 Server包含的CA,對證書支持 「增強型密鑰用法」(EKU:Enhanced Key Usages)屬性。這些EKU限制證書,所以它只能用到IPsec連接。其它用途(比如,用到WEB伺服器)則不允許,這為伺服器的PKI增加了一點額外的安全。如果你使用OpenSSL,你大概也可以建立帶這些EKU屬性的證書。
有一份Bugtraq郵件列表報告部分IPsec執行者有 「潛在的中間人攻擊」(potential Man-in-the-Middle vulnerability)。如果客戶端證書受到危害(這不太困難,例如手提電腦被盜),它可能被攻擊者用來為第二台客戶端偽造一個伺服器證書,畢竟第一台客戶端受到危害的證書是由CA發布的有效證書。可以在FreeS/WAN的郵件列中找到更多的信息。
23.2 在智能卡上的證書
為了額外的安全,證書可以存儲在智能卡上(包括USB token)。在MSL2TP客戶端上已經測試過了,並且它可以工作。當我開始連接時,它提示需要Ikey 2032 token的PIN號碼,於是建立起連接。SSH Sentinel也應該能工作(它有一個稱為Accession Lite的seperate智能卡應用程序),但有點與IKey驅動不兼容。Windows 2000/XP自帶的IPsec客戶端使用智能卡可能有問題,好象沒有辦法將「本地計算機證書」保存到USB token上。根據微軟的文檔,它可以指定不同的「密碼服務提供者」(CSP:Cryptographic Service Provider),比如某個能支持你智能卡或USB token的,但僅當你通過WEB介面(「web enrollment」)申請證書,不是當你通過一個PKCS#12格式的文件導入你的證書。
24 保護無線連接
WEP加密演算法是無線802.11標準(WiFi)的一部分,它完全可以被破解。任何小孩用像Airsnorp這樣的工具都可以破解WEP口令,只要他有足夠的時間來收集確定數量的數據包。另一個問題是發布WEP密鑰沒有很好的等級,比如你正好多了一些用戶。許多無線訪問節點(access point)有額外的安全方法(比如SSID認證,禁用SSID廣播和基於MAC地址的訪問控制),但這仍然不牢固,利用Airsnort或Kismet等工具很容易被繞過。一些人提議用像IPsec或PPTP這樣的VPN協議代替WEP,這些協議時間上經受了考驗,並且它們的安全性也很被大家所熟悉。很明顯,你不應該只依靠WEP。
在無線連接上運行VPN的問題是,不能被阻止壞傢伙們訪問你的無線網路,他們仍可以做像攻擊訪問節點(AP:access point)或無線客戶端的下流事情。如果一個用戶的工作站沒有被安全保護,通過無線連接它可以被黑客或病毒利用,例如:工作站可能開有埠,文件和列印共享沒有被關閉,沒有安裝個人防火牆或缺少安全補丁。WEP和它的繼承者如WPA、802.1x、EAP/LEAP/PEAP和802.11x防止沒有正確的證書的人加入你的無線網路。微軟為Windows XP/2003中的無線網路積極推行PEAP,因此,如果你沒有使用一個好的無線安全協議(WEP不算在內),在客戶端工作站上至少安裝一個個人防火牆和可以防病毒的軟體是明智的。
IPsec支持「預共享密鑰」和證書。如果用戶比較少「預共享密鑰」比較容易使用,但劣勢是用戶必須有固定(靜態)IP地址。幸運的是,RFC 1918範圍的固定地址(192.168.x.x、10.x.x.x等)可以分配給無線用戶。有一個例外:使用Windows 2000的「新建連接嚮導」不能工作,因為這個「嚮導」不支持「預共享密鑰」。
另一個需要密切注意的事情是,如果VPN連接停止,明顯地客戶端應該不能訪問你被保護的網路。這種說法是愚蠢的,如果你打開IP傳送(IP forwarding),從無線網路來的數據包將被恰當地傳送到你的內部網路。請確信為無線網路建立了防火牆或僅為內網地址配置IP傳送。
在基於802.11標準的無線網路中從一個訪問節點到另一個訪問節點漫遊時是一個普遍的問題,如果我沒有犯錯的話,無線連接將斷開連接,這意味著IPsec連接也將斷開連接,因為新的訪問節點也許分發了一個新的IP地址。可是在L2TP標準中規定應該快速重新連接,但我不知道它和Openswan和l2tpd之間工作的如何。
在無線網路上的最初測試沒有像一般的網路(比如:在以太崗上)那樣出現較多的MTU大小問題,複雜因素大概是內建的L2TP/IPsec客戶端從丟失的數據包中不能很好的恢復。
德國Stuttgart的學生在他們的宿舍里的無線網路上使用了Linksys WRT54g路由器和一個中樞FreeS/WAN伺服器,通過FreeRADIUS進行認證。
25 Linux作為一個L2TP/IPsec客戶端
可能有這種情況,你希望使用Linux作為一個客戶端連接到一個L2TP/IPsec VPN伺服器(比如Windows 2000/2003),這些情況下多數不是真正需要L2TP的,簡單的IPsec應該足夠了,並且Linux支持它。實際上,在Linux客戶端上使用L2TP會使事情變得複雜。但實際情況是你不能繞過它,比如,L2TP/IPsec VPN伺服器的管理員會拒絕容納Linux用戶。我沒有設法把Linux當作L2TP/IPsec客戶端,也許它可以工作。我希望它像上面所說的配置L2TP/IPsec伺服器那樣相似。主要的差異大概是在l2tpd.conf中加入一個「client」節。
; Connect as a client to a server at 123.123.123.123

lns = 123.123.123.123
; (rest of the parameters similar to the section)
同樣可能也要使用pppd的「usepeerdns」參數。Openswan的配置大概不需要改變。但開始一個到L2TP/IPsec伺服器的連接將會清楚,比如:用命令:ipsec auto –up L2TP-CERT。
一旦IPsec連接啟動,L2TP連接將(用類似下面的方法)被啟動。
echo 「c windowVPNserver」 >; /var/run/l2tp-control
參考包含在l2tpd中的README獲取關於L2TP連接的更多細節(less `rpm –ql l2tpd | grep \/README`)。默認情況下l2tpd監聽所有介面,如果你想使用Linux作為L2TP/IPsec客戶端,看來不需要把l2tpd 也作為一個服務運行。你可以使用「listen-addr」參數將它只綁定到內網介面,避免L2TP服務完全暴露在外部。
26 這完全是思考,但是……
微軟大概也試著把IPsec協議作為商品,所以支持它並擴充了由微軟和Cisco開發的L2TP協議。微軟把L2TP當成一個VPN協議來書寫,比如:在微軟的FAQ上有這樣的對話:
問:我可以使用PPTP或L2TP嗎?
答:L2TP被認為是比PPTP更安全並且允許你同第三方互相協同工作。
他們說的「L2TP」實際上是「L2TP/IPsec」,在L2TP/IPsec連接中是IPsec提供機密性和認證。看起來他們想把公眾的注意力從IPsec(許多廠商擁有幾個執行者)轉移到L2TP(沒有那麼的產品可用)。另外,沒有任何人願意使用L2TP。它導致了「雙重隧道」(額外的信息包頂部裝置)並且大概只有一種手段進行額外的認證(當然,更適宜依靠NT SAM用戶資料庫,這意味著購買更多的Windows客戶訪問許可)。
我有一點迷惑,為什麼微軟發布MSL2TP客戶端。他們最近已經停止了對「老版本」Windows的支持,而且這時候他們發布一個甚至能運行在Windows 95上的軟體。說得更廣一點,發布免費的MSL2T,也因SafeNet正在蠶食它自己的第三方Windows IPsec客戶端市場,引起了它的注意。
我也同意這樣的觀點:MSL2TP客戶端是由SafeNet為微軟開發的,Windows 2000/XP、Pkcket PC 2003的IKE/IPsec支持是和Cisco共同開發的,這顯示出微軟在內部全部的開發中所做的,沒有足夠高的優先權。
《解決方案》

使用Linux L2TP/IPsec VPN 伺服器

原文:http://www.funknet.org/doc/tunnel/l2tp.xml

本人初中畢業,請不要嘲笑我的英文水平!

緒論
本文描述了如何為IPsec/L2TP客戶端建立一個VPN網關,例如:Windows 2000/XP內建的客戶端、MSL2TP客戶端、MacOS10.3的VPN客戶端。
這裡的許多信息來自於Jacco de Leeuw描寫的使用Linx 2.4、FreeS/WAN和l2tpd。這裡使用Linux 2.6,因此一些IPsec細節不同,防火牆需求也不同。
2.6內核
在內核中需要以下幾部分:
CONFIG_INET_ESP=m
CONFIG_NET_KEY=m
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_MD5=m
CONFIG_CRYPTO_SHA1=m
CONFIG_CRYPTO_DES=m
當然,你也需要常用的網路選項,包括netfilter。
IPsec tools - racoon和setkey
對於使用預共享密鑰(好鬥模式)的Road Warrior VPN客戶端,racoon.conf需要這樣:
log debug;
path pre_shared_key "/etc/racoon/psk.txt";

listen {
        isakmp a.b.c.d ;
}

padding
{
        maximum_length 20;      # maximum padding length.
        randomize off;          # enable randomize length.
        strict_check off;       # enable strict check.
        exclusive_tail off;     # extract last one octet.
}

remote anonymous {
        exchange_mode aggressive,main;
        doi ipsec_doi;
        situation identity_only;
        generate_policy on;
        proposal_check obey;

        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method pre_shared_key;
                dh_group modp1024;
        }
}

sainfo anonymous {
        lifetime time 28800 sec;
        encryption_algorithm 3des ;
        authentication_algorithm hmac_md5;
        compression_algorithm deflate ;
}
把a.b.c.d換成網關的公網IP地址。
在Road Warrior可以使用主模塊(main mode)的情況下,也可以使用X.509證書。註:racoon不能讓你指定私鑰口令(passphrase),因此在這裡你需要為你的密鑰生成一個無口令(passphraseless)版本。
remote anonymous {
        exchange_mode main;
        doi ipsec_doi;
        situation identity_only;
        generate_policy on;

        my_identifier asn1dn;
        peers_identifier asn1dn;
        verify_identifier on;
        certificate_type x509 "mygateway.pem" "mygateway.key.un";

        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method rsasig;
                dh_group modp1024;
        }
}

sainfo anonymous {
        lifetime time 28800 sec;
        encryption_algorithm 3des ;
        authentication_algorithm hmac_md5;
        compression_algorithm deflate ;
}
看起來在同一個配置文件中指定兩種選項不是一個容易的方法,在我的試驗中,如果rsasig像一個選項一樣可用,那麼客戶端試著進行預共享密(Pre-Shared Keys)將被拒絕。
聲明IPsec策略
當racoon將為Road Warrior連接生成需要的策略部分時候,其它的策略需要用setkey設置。我創建了一個文件/etc/init.d/ipsec-policy,而且如果esp4模塊沒有自動載入的話也趁機載入了,還除去了任意以前存在的IPsec策略。把a.b.c.d換你網關的公網IP地址。
#!/bin/sh
/usr/sbin/setkey -FP
/usr/sbin/setkey -F
/usr/sbin/setkey -c << EOF

spdadd a.b.c.d 0.0.0.0/0 any
   -P out ipsec esp/transport//require ;

EOF
得到已經載入的esp模塊
為了實現esp模塊自動載入,下面幾行涉及到的esp4需要寫入/etc/modprobe.conf中。全套的ipsec模塊要完全顯示。
alias xfrm-type-2-50 esp4
alias xfrm-type-2-51 ah4
alias xfrm-type-2-108 ipcomp
alias xfrm-type-10-50 esp6
alias xfrm-type-10-51 ah6
alias xfrm-type-10-108 ipcomp6
l2tpd
我使用了Jacco的l2tpd rpm,l2tpd的非穩定版和Windows XP之間確實有一個「loopback」問題,所以我使用了這個l2tpd.conf:

port = 1701


ip range = 10.1.161.1 - 10.1.163.254
local ip = 10.1.160.2
require chap = yes
refuse pap = yes
require authentication = yes
hostname = LinuxVPNserver
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd
length bit = yes
我的/etc/ppp/options.l2tpd:
ipcp-accept-local
ipcp-accept-remote
ms-dns  10.1.128.171
ms-wins 10.1.96.3
auth
crtscts
idle 1800
mtu 1400
mru 1400
nodefaultroute
nodetach
debug
lock
#proxyarp
connect-delay 5000
註:在這種情況下我不使用ARP代理(我不希望VPN客戶端可以訪問網關所在的區域網上——客戶端使用其它的IPsec隧道)。但是如果你需要ppp這樣做,你應該在這裡指定。
PPP chat-secrets文件應該包含你的PPP認證密鑰——Windows將詢問用戶的用戶名和口令。
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
*               xpuser  "sekrit"                10.1.161.0/24
xpuser          *       "sekrit"                10.1.161.0/24
防火牆
像Linux 2.6的KAME IPsec不提供ipsec0樣式的介面,同樣像FreeS/WAN、iptables的安裝也不同,因此我們試著完成同樣的效果——禁止未解密的數據包訪問L2TP守護進程。
我們使用iptables的「fwmark」匹配來完成——把數據包作一個標記,從它加密后一直到解密后保持不變,我們可以它來確定哪些數據包是通過IPsec SA到達的。「mark」是在內核里的,不能用於離開系統的數據包,因此用這個匹配是安全的。
iptables -t mangle -A PREROUTING -i eth0 -p esp -j MARK --set-mark 1
iptables -A INPUT -i eth0 -m mark --mark 1 -j ACCEPT

iptables -A OUTPUT -s a.b.c.d -p udp -m udp --sport 1701 -j ACCEPT

iptables -A INPUT -p esp -j ACCEPT
iptables -A OUTPUT -p esp -j ACCEPT

iptables -A INPUT -d a.b.c.d -p udp -m udp --dport 500 -j ACCEPT
iptables -A OUTPUT -s a.b.c.d -p udp -m udp --sport 500 -j ACCEPT
把a.b.c.d換你網關的公網IP地址。
突出的問題
用證書和預共享密鑰共同訪問。
《解決方案》

使用Linux L2TP/IPsec VPN 伺服器

本人初中畢業,不要嘲笑我的英文水平。

需求
要配置「網路到網路」的連接你必須有:
兩個有固定IP地址的Linux網關。
一個位於每個網關後面的網路,網路上沒有重疊IP範圍。
兩個網關上必須都安裝FreeS/WAN
在本地網關上有tcpdump等軟體,用來測試連接。
為Road Warrior配置,你需要:
一個有固定IP地址的Linux機器
一個動態IP的Linux筆記本電腦
兩台計算機上都安裝FreeS/WAN
在兩台計算機的任意一台上安裝tcpdump,用來測試連接。
如果兩台計算機都是動態IP地址,這種情況比較棘手。
網路到網路的連接
對於每個網關,收集下面這些信息:
• 網關的IP地址
• 用保護的網路的IP地址範圍。這肯定不是你的整個物理網路。
• 網關的名字,在IPsec商議過程中用來識別網關自己。它的格式是一個完全合格的域名(Fully Qualified Domain Name)加上一個@符號。比如@xy.example.com。
這不一定要求在你現有的域中,它可以是一個捏造(made-up)的名字。
獲得leftrsasigkey
在你的本地Linux FreeS/WAN網關上列印你的IPsec公鑰。
ipsec showhostkey --left
輸出結果應該像這樣(為了便於閱讀,縮短了密鑰長度)。
# RSA 2048 bits   xy.example.com   Fri Apr 26 15:01:41 2002
leftrsasigkey=0sAQOnwiBPt...
沒有密鑰?使用ipsec newhostkey創建一個吧!
然後是rightrsasingkey
獲得遠程計算機的控制權:
ssh2 ab.example.com
在那個窗口中輸入:
ipsec showhostkey --right
你將看到像下面這樣的輸出:
# RSA 2192 bits   ab.example.com   Thu May 16 15:26:20 2002
rightrsasigkey=0sAQOqH55O...
編輯/etc/ipsec.conf
返回本地網關,複製樣本到/etc/ipsec.conf。用你收集的信息替換樣本中的數據。
conn net-to-net
    left=192.0.2.2                 # Local vitals
    leftsubnet=192.0.2.128/29      #
    leftid=@xy.example.com         #   
    leftrsasigkey=0s1LgR7/oUM...   #
    leftnexthop=%defaultroute      # correct in many situations
    right=192.0.2.9                # Remote vitals
    rightsubnet=10.0.0.0/24        #
    rightid=@ab.example.com        #
    rightrsasigkey=0sAQOqH55O...   #
    rightnexthop=%defaultroute     # correct in many situations
    auto=add                       # authorizes but doesn't start this
                                   # connection at startup
「Left」和「Right」代表安裝FreeS/WAN軟體的機器,「leftsubnet」和「rightsubnet」代表被保護的計算機。/32為left/right和left/rightsubnet指定的參數。
把conn net-to-net複製到另一端的/etc/ipsec.conf。如果你沒對兩個ipsec.conf有做額外的修改,簡單地複製即可:
scp2 ipsec.conf root@ab.example.com:/etc/ipsec.conf
開始連接
在本地輸入
ipsec auto –up net-to-net
你應該看到這樣的信息:
104 "net-net" #223: STATE_MAIN_I1: initiate
106 "net-net" #223: STATE_MAIN_I2: sent MI2, expecting MR2
108 "net-net" #223: STATE_MAIN_I3: sent MI3, expecting MR3
004 "net-net" #223: STATE_MAIN_I4: ISAKMP SA established
112 "net-net" #224: STATE_QUICK_I1: initiate
004 "net-net" #224: STATE_QUICK_I2: sent QI2, IPsec SA established
重要的事是IPsec SA被確定,即:IPsec SA established。
不要對通過隧道的數據包偽裝或地址轉換
如果你任意一個網關上使用IP偽裝(IP masquerade)或網路地址轉換(NAT:Network Address Translation),你現在必須避免對想通過隧道傳輸的數據包進行這樣的處理。例如,你有這樣的規則:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE
應該改成這樣:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -d \! 192.0.2.128/29 -j MASQUERADE
每個網關上都必須這樣做。
測試連接
在本地子網的任意一個節點上(不能在網關上)ping另一個子網中的任意一個節點(同樣不能是網關)。
ping fileserver.toledo.example.com
繼續ping,到本地網關上嗅探輸出介面,例如:
tcpdump –i ppp0
你應該看到在兩個網關之間來來回回的ESP(Encapsulating Security Payload)數據包,頻率就像你ping的一樣。
19:16:32.046220 192.0.2.2 >; 192.0.2.9: ESP(spi=0x3be6c4dc,seq=0x3)
19:16:32.085630 192.0.2.9 >; 192.0.2.2: ESP(spi=0x5fdd1cf8,seq=0x6)
如果看到了,說明已經成功地建立了一個用來保護從一個子網到另一個子網任意IP數據的隧道,就像它通過了兩個網關。
註:這個隧道只能保護網路到網路(net-net)的通信,不是網關到網關(gateway-getway)或網關到網路(gateway-subnet),如果需要這樣配置(例如,如果在一個網路上的機器需要安全地訪問在IPsec網關上的文件伺服器),需要創建額外的連接。
完成後
連接正常工作后,把它命名為有意義的名字,例如:
conn winstonnet-toledonet
如果讓隧道一啟動就運行,把auto=add換成auto=start。
把這些變動複製到另外一端:
scp2 ipsec.conf root@ab.example.com:/etc/ipsec.conf
配置Road Warrior
需要收集的信息:
• 網關的靜態IP地址。
• 網關後面子網的IP範圍。
• 在IPsec商談過程中雙方可以識別自己的名字。它的格式是一個完全合格的域名(Fully Qualified Domain Name)加上一個@符號。比如@xy.example.com。
這不一定要求在你現有的域中,它可以是一個捏造(made-up)的名字。
獲得leftrsasigkey
在你的筆記本電腦列印你的IPsec公鑰。
ipsec showhostkey --left
輸出結果應該像這樣(為了便於閱讀,縮短了密鑰長度)。
# RSA 2048 bits   xy.example.com   Fri Apr 26 15:01:41 2002
leftrsasigkey=0sAQOnwiBPt...
沒有密鑰?使用ipsec newhostkey創建一個吧!
然後是rightrsasingkey
獲得遠程計算機的控制權:
ssh2 ab.example.com
查看網關的公鑰:
ipsec showhostkey --right
你將看到像下面這樣的輸出:
# RSA 2048 bits   xy.example.com   Fri Apr 26 15:01:41 2002
rightrsasigkey=0sAQOnwiBPt...
定製/etc/ipsec.conf
在你的筆記本電腦上,複製樣本到/etc/ipsec.conf。用你收集的信息替換樣本中的數據。
conn road
    left=%defaultroute             # Picks up our dynamic IP
    leftnexthop=%defaultroute      #
    leftid=@road.example.com       # Local information
    leftrsasigkey=0sAQPIPN9uI...   #
    right=192.0.2.10               # Remote information
    rightsubnet=10.0.0.0/24        #
    rightid=@xy.example.com        #
    rightrsasigkey=0sAQOnwiBPt...  #
    auto=add                       # authorizes but doesn't start this
                                   # connection at startup
這個模板與網關的不同。注意:它的「Left」和「Right」相反,與我們的習慣一致,Left代表本地(Left is Local),Right代表遠程(Right is Remote)。確認rsasigkey與它保持一致。
ssh2 xy.example.com
vi /etc/ipsec.conf
增加:
conn road
    left=192.0.2.2                 # Gateway's information
    leftid=@xy.example.com         #
    leftsubnet=192.0.2.128/29      #
    leftrsasigkey=0sAQOnwiBPt...   #
    rightnexthop=%defaultroute     # correct in many situations
    right=%any                     # Wildcard: we don't know the laptop's IP
    rightid=@road.example.com      #
    rightrsasigkey=0sAQPIPN9uI...  #
    auto=add                       # authorizes but doesn't start this
                                   # connection at startup
開始連接
你必須從Road Warrior這一端啟動連接,在筆記本電腦上輸入:
ipsec auto –start net-to-net
你應該看到這樣的信息:
104 "net-net" #223: STATE_MAIN_I1: initiate
106 "road" #301: STATE_MAIN_I2: sent MI2, expecting MR2
108 "road" #301: STATE_MAIN_I3: sent MI3, expecting MR3
004 "road" #301: STATE_MAIN_I4: ISAKMP SA established
112 "road" #302: STATE_QUICK_I1: initiate
004 "road" #302: STATE_QUICK_I2: sent QI2, IPsec SA established
重要的事是IPsec SA被確定,即:IPsec SA established。
不要對通過隧道的數據包偽裝或地址轉換
如果你任意一個網關上使用IP偽裝(IP masquerade)或網路地址轉換(NAT:Network Address Translation),你現在必須避免對想通過隧道傳輸的數據包進行這樣的處理。例如,你有這樣的規則:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE
應該改成這樣:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -d \! 192.0.2.128/29 -j MASQUERADE
測試連接
從筆記本電腦上ping位於網關后子網中的任意一個節點。不要選擇網關自己做這個測試。
ping ns.winston.example.com
嗅探筆記本電腦輸出的數據包,例如:
tcpdump –i wlan0
你看到了兩個方向的ESP(Encapsulating Security Payload)數據包:
19:16:32.046220 192.0.2.2 >; 192.0.2.9: ESP(spi=0x3be6c4dc,seq=0x3)
19:16:32.085630 192.0.2.9 >; 192.0.2.2: ESP(spi=0x5fdd1cf8,seq=0x6)
如果看到了,說明Road Warrior與位於網關後面網路的通信被保護。
註:這個新隧道只能保護地址到網路(addressed to the net)的通信,不是IPsec網關自身,如果需要後者,需要創建額外的隧道。
完成後
連接正常工作后,把它命名為有意義的名字,例如:
conn mike-to-office
如果讓隧道一啟動就運行,只要在筆記電腦上把auto=add換成auto=start。
多個Road Warrior
如果你使用RSA密鑰,就像上面的示例,只要你願意,你可以增加許多Road Warrior。left/rightid參數使Linux FreeS/WAN區別多個Road Warrior,每個都有自己的公鑰。
這種情況與預共享密鑰(PSK)不同,在一個PSK商談過程中,當Pluto試著決定哪個密鑰可用時,ID信息不可用,因此,你可以只定義一個Road Warrior連接,因此,所有的PSK Road Warrior必須共享一個密鑰。
還能做什麼?
用這裡的法則,你要以變化出不同的情況,如:
• 靜態IP地址的遠程工作者。
• 位於一個子網的Road Warrior。
《解決方案》

使用Linux L2TP/IPsec VPN 伺服器

希望朋友們繼續將其它相關文章翻譯出來。
《解決方案》

使用Linux L2TP/IPsec VPN 伺服器

初中生能這樣很不錯了! 哈哈
《解決方案》

使用Linux L2TP/IPsec VPN 伺服器

非常感謝,謝謝!




[火星人 via ] 使用Linux L2TP/IPsec VPN 伺服器已經有1296次圍觀

http://www.coctec.com/docs/service/show-post-15357.html