[轉]用L2TP與OpenSwan構建IPSec VPN(使用X.509證書認證)

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


[轉]用L2TP與OpenSwan構建IPSec VPN(使用X.509證書認證)

發現CU里還沒有一篇完整的l2tp的安裝配置教程,這是小弟在配置l2tp時碰到的一篇寫的還挺不錯的教程,看到論壇里有朋友詢問,特轉來與大家共享。
------------------------------------------------------------------------------------------------------------

從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"    *

含義是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):注意此文件註釋使用分號

listen-addr = 192.168.0.254
port=1701
auth file = /etc/ppp/chap-secrets


;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的證書由個人拖到「受信任的根證書頒發機構」里。

添加撥號連接:

網路連接->創建一個新連接->連接到我工作場所的網路->虛擬專用網路連接->隨意輸入一個名字->不撥初始連接->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」。確定。
然後再撥號試試。順利的話應該直接成功。



本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/purewinter/archive/2007/05/25/1626238.aspx

[ 本帖最後由 coffee777 於 2010-1-26 13:38 編輯 ]
《解決方案》

回復 #1 coffee777 的帖子

windows的配置方式預共享密鑰
《解決方案》

很不錯啊。

謝謝分享
《解決方案》

回復 #2 kns1024wh 的帖子

證書方式,預共享密鑰兩種方式都有的

[ 本帖最後由 coffee777 於 2010-1-27 18:12 編輯 ]
《解決方案》

頂。我正想學習IPsec。
《解決方案》

加精
《解決方案》

待解決:xl2tp在雙線伺服器上只能通過一張網卡連接,另外一張網卡連接不上
《解決方案》

繼續努力
《解決方案》

學習
《解決方案》

證書生成的沒搞明白:dizzy:



[火星人 via ] [轉]用L2TP與OpenSwan構建IPSec VPN(使用X.509證書認證)已經有194次圍觀

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