從OpenSwan自身構建VPN,到最後用L2TP與X.509認證構成較為普遍的IPSec VPN,中間遇到了很多挫折,一起寫在這裡。
在整個過程中,主要參考下面幾篇文章:
九尾銀狐的“開源Linux VPN解決方案 - OpenSWan安裝配置指南”一文。地址:http://www.entage.net/1/viewspace_8112.html
以及“Use L2TP and OpenSwan To build IPSec VPN”。這是我起的名字,因為似乎作者nate.carlson沒給它起名字。我轉貼了一下,地址:http://blog.csdn.net/purewinter/archive/2007/05/23/1623336.aspx。原文地址也在轉貼裡寫明了。
然後是師兄寫的說明文檔(沒有貼到網上)。師兄後來又寫了一個,可謂短小精悍,呵呵。^_^
本文所用軟體:
Red Hat Enterprise Linux AS 4 (kernel 2.6.9-42EL)
Openssl 0.97a
OpenSwan 4.4.7
L2TPD 0.69(12jdl.i386.rpm) / XL2TPD 1.1.09
其中Openssl其實只是用來做CA功能的,可以用其它CA工具如OpenCA代替。
而xl2tpd則是代替l2tpd的。個人推薦使用。當然,如果你使用l2tpd沒有問題,也無妨。這兩個軟體的設定幾乎一模一樣,畢竟都是L2TP的daemon嘛。
Openssl只是起到CA的作用,簡要說一下安裝過程:
解壓後進入目錄,輸入命令:
./config --prefix=/usr/local/openssl 設定安裝資料夾。
然後就make,再make install即可。
實驗的網路設定和拓撲結構:
由於條件所限,使用的是VMware虛擬機器。
簡要說明一下在VM中的網路設定。在VMware提供的Manage Network Tools中的Host Virtual Network Mapping把VMNet2設為Not bridged,點擊右邊的“>”按鈕-subnet,IP地址填入192.168.2.0。確定。
VPNGateway虛擬機器需要在虛擬機器設定中添加一個網卡。然後在每個虛擬機器中Linux下照下表設定各個網卡,並在
虛擬機器設定中選擇網卡對應的網路。其中VPNGateway的網卡0屬於VMNet0,網卡1屬於VMNet2。網卡1的預設網卡設為192.168.2.1。另外,XP本機自動位於VMNet0,不需要進行設定。
| 機器名 |
網卡0(eth0) |
網卡1 |
預設閘道 |
所屬網路 |
角色說明 |
| PureWinter |
192.168.0.2 |
|
192.168.0.2 |
VMNet0 |
XP Client |
| VPNGateway |
192.168.0.254 |
192.168.2.1 |
192.168.0.254 |
VMNet0,VMNet2 |
VPNGateway |
| Jim |
192.168.2.2 |
|
192.168.2.1 |
VMNet2 |
網關後伺服器 |
其中,192.168.0.0/24網段類比外網,XP本機類比外網撥號的VPN客戶機。192.168.2.0/24網段類比內網,Jim為內網中一台機器。可以當作提供某個服務的應用伺服器。
0.使用Openssl為各個機器頒發認證
建立CA工作目錄:(推薦為/root/ca/demoCA)由於demoCA為openssl的預設CA工作目錄,存放CA的一些資訊,所以還需要一個目錄為我們存放各個機器的認證,所以要建立兩層目錄(ca和ca/demoCA)。當然也可以這樣:CA在/root/demoCA,認證在/root/certs。
建立CA:(以下CA.sh指openssl安裝目錄/ssl/misc/CA.sh)使用命令
CA.sh -newca或命令
openssl req –x509 –days 3650 –newkey rsa:1024 –keyout cakey.pem –out cacert.pem
使用openssl命令建立以後,還要進入demoCA目錄執行以下命令:
mkdir newcerts
touch index.txt
echo “01” > serial
請確認在demoCA/private目錄下有cakey.pem檔案。若沒有請複製過來。
CA產生以後,在demoCA上級目錄輸入openssl ca -gencrl -out crl.pem產生憑證撤銷清單檔案。
為VPNGateway產生認證(以下命令請在demoCA的上一級目錄下執行,如/root/ca下):
使用命令CA.sh -newreq
或Openssl req –newkey rsa:1024 –keyout vpngateway.key –out vpngatewayreq.pem
這樣得到了VPNGateway的私密金鑰。然後使用命令
CA.sh -sign
或Openssl ca –in vpngatewayreq.pem –days 365 –out vpngateway.cert –notext
為其簽名並產生認證。
使用CA.sh的方式,需要把產生的newreq.pem改名成vpngateway.key,把newcert.pem改名成vpngateway.cert。
由上文可以看出,CA操作即可以使用CA.sh,也可以使用openssl命令。區別是CA.sh簡單易用,但是功能簡單,而openssl命令功能強大,但是比較複雜。需要定製比較多的時候使用openssl命令更加方便。
為其它機器產生認證與為VPNGateway產生認證類似。
1.安裝OpenSwan
安裝之前,需要修改配置。在/etc/sysctl.conf檔案中,找到
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
改為:
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
然後執行sysctl -p使之生效。
下載OpenSwan,解壓:tar zxvf openswan-2.4.7.tar.gz
進入openswan-2.4.7目錄,編譯,產生,安裝:
make programs
make install
安裝本身沒有太多好說的。但是linux核心版本在2.6.9以下的(如Red Hat Linux 9),需要打Nat補丁。而2.6.9及其以上版本(如我使用的AS 4)不需要打補丁。
安裝完成後驗證安裝:ipsec --version
以及IPSec狀態驗證:ipsec verify。
OpenSWan主要設定檔
/etc/ipsec.secrets 用來儲存private RSA keys 和 preshared secrets (PSKs) /etc/ipsec.conf 設定檔(settings, options, defaults, connections) |
OpenSWan主要配置目錄
/etc/ipsec.d/cacerts 存放X.509認證認證(根憑證-"root certificates") /etc/ipsec.d/certs 存放X.509用戶端認證(X.509 client Certificates) /etc/ipsec.d/private 存放X.509認證私密金鑰(X.509 Certificate private keys) /etc/ipsec.d/crls 存放X.509認證撤消列表(X.509 Certificate Revocation Lists) /etc/ipsec.d/ocspcerts 存放X.500 OCSP認證(Online Certificate Status Protocol certificates) /etc/ipsec.d/passwd XAUTH密碼檔案(XAUTH password file) /etc/ipsec.d/policies 存放Opportunistic Encryption策略組(The Opportunistic Encryption policy groups) |
2.使用OpenSwan測試構建IPSec通道(可跳過)
此步只是測試使用。驗證不使用L2TP之前,OpenSwan能正常構建IPSec通道。
Openswan提供兩種模式:net-to-net模式和roadwarrior模式。簡單的說,net-to-net是兩個VPN網關互聯,為雙方後面的內網互連提供安全通道的模式,而roadwarrior是一個用戶端和一個VPN網關相連,為用戶端與VPN網關後的內網提供安全通道的模式。關於這兩種模式的具體說明和net-to-net模式的設定,見九尾銀狐的文章或其它網上說明。下面簡單說明一下roadwarrior下的設定。
用戶端(Laptop):JIm。VPN伺服器:VPNGateway. 伺服器後的內網: 無或位於VMNet1的任意機器,如PureWinter
Jim和VPNGateway機器需要安裝OpenSwan。其它機器不需要。
複製認證(在機器之間複製認證請確保安全性):
cp cacert.pem /etc/ipsec.d/cacerts
cp vpngateway.cert /etc/ipsec.d/certs
cp vpngateway.key /etc/ipsec.d/private
在Jim機器上,除了上面三個檔案,還需要把jim.cert複製到/etc/ipsec.d/certs,把jim.key複製到/etc/ipsec.d/private
編輯/etc/ipsec.secerts:
在此檔案最後加上一行(以VPNGateway為例)
: RSA /etc/ipsec.d/private/vpngateway.key "讀取此key的密碼"
jim機器類似。注意RSA前面有一個冒號。引號內用你產生key時輸入的密碼替換。
編輯VPNGateway的/etc/ipsec.conf檔案:如下:
version 2.0 config setup interfaces=%defaultroute nat_traversal=yes virtual_private=%v4:192.168.0.0/16,%v4:10.0.0.0/8,%v4:172.16.0.0/12,%v4:!192.168.0.0/24 conn %default compress=yes authby=rsasig leftrsasigkey=%cert rightrsasigkey=%cert conn roadwarrior left=192.168.2.1 leftcert=vpngateway.cert leftsubnet=192.168.0.0/24 right=%any auto=add include /etc/ipsec.d/examples/no_oe.conf |
編輯jim的/etc/ipsec.conf檔案:除了roadwarrior一段,其它與VPNGateway的設定檔相同。
conn roadwarrior left=192.168.2.2 leftcert=jim.cert right=192.168.2.1 rightcert=vpngateway.cert rightsubnet=192.168.0.0/24 auto=add |
在JIm上輸入命令ipsec auto --up roadwarrior ,啟動Ipsec。
在VPNGateway上輸入命令tcpdump -i eth1,可以監聽資料包,應已被加密。不過,其實這種方式只有Jim想訪問VPNGateway後的內網機器,資料包才會被加密,Jim與VPNGateway互相訪問的資料包並不會被加密。可以在Jim上使用命令ping 192.168.0.254
然後再ping 192.168.0.2,
查看VPNGateway的tcpdump監聽到的資料包對比得知。如果到VPN網關也要加密,則雙方的設定檔中的subnet一行要提出來,放到新的conn roadwarrior-net一段中去,並再加上一行:also=roadwarrior。然後在jim機器上執行ipsec auto --up roadwarrior,
再執行ipsec auto --up roadwarrior-net。 (注意:若已啟動Ipsec,則修改配置以後要重啟IPSec服務。)
關於roadwarrior以及使用RSA認證的方法,net-to-net模式,還可參見toorq的“用Openswan組建Linux IPSec”一文。地址:http://www.xfocus.net/articles/200610/891.html
3.安裝L2TPD
如果只使用L2TP的IPSec,L2TPD和OpenSwan都只需要在VPNGateway上安裝。L2TPD是整個過程折磨我最多的東西了。這裡我把通常情況和我遇到的問題分開進行說明。
安裝的是l2tpd-0.69-12jdl.i386.rpm:雙擊這個rpm包,或輸入命令:rpm -i l2tpd-0.69-12jdl.i386.rpm;
安裝的是l2tpd-0.69.tar.gz或l2tpd-0.70pre.tar.gz:強烈建議不要安裝0.69源包。解壓後進入目錄,輸入命令make即可。產生l2tpd檔案以後,可以複製到/usr/local/sbin下。
安裝的是xl2tpd-1.1.09.tar.gz:解壓後進入目錄,輸入make,斷行符號,再輸入make install斷行符號。
問題說明:其實在目前的Linux平台上,l2tpd的原版,包括0.70pre,直接編譯是通不過的。都會在某個檔案(似乎是avp.c)的某一行"__FUNCTION__"之前出錯。仔細一看,是一個叫log的函數調用,而"__FUNCTION__"之前少了一個分隔參數的逗號!我真的要暈倒了。。。0.70pre只有這一處有問題,而0.69版本還在其它地方多處出現字串之中出現不應該出現的斷行符號符而導致的gcc報錯。據說這是gcc變嚴格了,以前可以通過。不過即使編譯成功,0.69原版還是有相當多的bug需要打補丁。特別是其中有個pty(tty)的bug,雖然不一定在每個機器上都出問題,但偏偏在我這裡出了問題,而且無論是rpm版,還是0.70pre,還是換pty補丁都無濟於事。最後還是使用的xl2tp才解決問題。
設定檔路徑說明:
rpm版的設定檔在/etc/l2tpd/l2tpd.conf
普通版的設定檔在/etc/l2tp/l2tpd.conf
xl2tpd的設定檔或者使用普通版的路徑和名稱,或者在/etc/xl2tpd/xl2tpd.conf
4.VPNGateway的設定
首先說明使用認證作為IPSec認證方式時的配置方法。
與l2tp相關的設定:
/etc/ppp/chap-secrets檔案:在最後加入一行
含義是test使用者的密碼是test123456。最後那個*號可以換成IP地址或網段,表示這個使用者只能在這個地址或網段撥號,否則無效。這個使用者名稱地址就是在撥號前要填的使用者名稱密碼,就像撥寬頻連線時的使用者名稱密碼一樣。
/etc/ppp/options.l2tp檔案:全部替換成如下內容
ipcp-accept-local ipcp-accept-remote #ms-dns 202.96.209.6 #需要設定dns,就把上一行的#號去掉 ms-wins 192.168.0.2 #noccp auth crtscts idle 1800 mtu 1200 mru 1200 #mtu需要小於1500。也可以設成其它值,如1300 nodefaultroute debug lock connect-delay 5000 logfile /var/log/l2tpd.log proxyarp |
/etc/l2tpd/l2tpd.conf檔案(或/etc/xl2tpd.conf或/etc/l2tp/l2tpd.conf):注意此檔案注釋使用分號
[global] listen-addr = 192.168.0.254 port=1701 auth file = /etc/ppp/chap-secrets [lns default] ;exclusive = no ip range = 192.168.2.128-192.168.2.254 ;ip range即l2tp撥號成功後分配給用戶端的ip位址範圍。 local ip = 192.168.0.254 ;lac = 0.0.0.0-255.255.255.255 require chap = yes refuse pap = yes require authentication = yes name = VPNGateway ppp debug = yes pppoptfile = /etc/ppp/options.l2tp length bit = yes |
註:原版l2tpd0.69沒有listen-addr設定項。其餘版本(rpm版,0.70pre,xl2tpd)均有此設定。
與OpenSwan相關的設定:
/etc/ipsec.secerts檔案:與2.使用OpenSwan測試構建IPSec通道中相同。
/etc/ipsec.conf檔案:(可參照2中的檔案進行修改。需要把conn roadwarrior整段都注釋掉)
version 2.0 config setup interfaces=%defaultroute nat_traversal=yes virtual_private=%v4:192.168.0.0/16,%v4:10.0.0.0/8,%v4:172.16.0.0/12,%v4:!192.168.0.0/24 conn %default compress=yes authby=rsasig disablearrivalcheck=no leftrsasigkey=%cert rightrsasigkey=%cert keyingtries=1 conn l2tpx509 pfs=no auto=add left=192.168.0.254 leftcert=vpngateway.cert leftprotoport=17/1701 right=%any rightca=%same rightprotoport=17/%any include /etc/ipsec.d/examples/no_oe.conf |
輸入命令service ipsec restart重啟ipsec服務。
輸入命令l2tpd -D以前台模式啟動L2TPD服務。使用XL2TPD則輸入xl2tpd -D。如果不加-D的參數,將以後台服務的方式運行l2tpd,不即時顯示串連資訊。
輸入命令tcpdump -i eth0監視資料包。可能需要加參數host 192.168.0.254以縮小監視的資訊範圍。
5.Windows端的設定
匯出CA和Win端的認證:
在VPNGateway的demoCA的上一級目錄下,用以下命令匯出CA認證為p12檔案:
openssl pkcs12 -export -in democA/cacert.pem -inkey demoCA/private/cakey.pem -out demoCA.p12
輸入讀取CA密鑰的密碼,然後再指定匯出p12檔案中的認證需要的密碼,再確認此密碼即可。
然後匯出win端的認證:
openssl pkcs12 -export -in purewinter.cert -inkey purewinter.key -out purewinter.p12
把這兩個檔案通過安全方式複製到Windows用戶端。
匯入認證:
運行mmc,添加刪除嵌入式管理單元->添加->認證->電腦賬戶->本機電腦->完成。
在認證:本機電腦裡,選擇個人->所有任務->匯入,匯入兩個p12認證。把CA的認證由個人拖到“可信任的根憑證授權單位”裡。
添加撥號連線:
網路連接->建立一個新串連->串連到我工作場所的網路->Virtual Private Cloud串連->隨意輸入一個名字->不撥初始串連->192.168.0.254->完成。
右鍵點此串連,選屬性-網路-VPN類型選擇為L2TP IPSec VPN,選定TCP/IP協議,屬性-進階,去掉“在遠程網路上使用預設閘道”的勾。確定。(此步是防止IPSec VPN的撥號連線建立以後,奪去原來寬頻撥號的路由,導致寬頻撥號假斷線。如果寬頻接入方式不是撥號則可跳過此步。)
雙擊此串連,輸入使用者名稱test,密碼test123456。撥號。如果順利,就撥號成功了。在VPNGateway的tcpdump可以看到加密資訊在傳輸,L2TPD的輸出中可以看到Call established with 192.168.0.2...等字樣。
在Jim上輸入service httpd start啟動Apache服務,然後在Win用戶端的瀏覽器中輸入http://192.168.2.2,就可以看到Jim上架設的網站了。如果沒有架設,可能看到Apache的預設頁面,或者看到403禁止訪問,Apache 2.x.x的資訊。至此L2TP的IPSec VPN架設成功。
6.使用預先共用金鑰的IPSec設定
VPNGateway端:
/etc/ipsec.secerts檔案:最後加入一行:其中123456即為預共用的密鑰。
| 192.168.0.254 %any : PSK "123456" |
/etc/ipsec.conf檔案:注釋掉conn l2tpx509段的所有行。加入以下行:
conn l2tp authby=secret pfs=no auto=add type=transport left=192.168.0.254 leftprotoport=17/1701 right=%any rightprotoport=17/%any |
輸入service ipsec restart重啟ipsec。
Win端:
右鍵點擊VPN撥號連線,屬性-安全-IPSec設定-輸入預先共用金鑰“123456”。確定。
然後再撥號試試。順利的話應該直接成功。