歡迎您光臨本站 註冊首頁

用Openswan組建Linux IPSec

←手機掃碼閱讀     火星人 @ 2014-03-29 , reply:0

1.概述
2.安裝Openswan
3.認證和配置
3.1 RSAsig認證方式的配置
3.2 x.509證書認證的配置
3.3 RoadWarrior模式的配置
5.Windows客戶端的配置
*****
1.概述
LInux上的VPN支持主要有三種:

1)IPSec 's VPN 其主要代表有 FreeS/WAN、KAME

IPSec在Linux上支持主要有兩個主要的分類,一為FreeS/WAN,現在已經停止開發,其分裂為兩個項目,Openswan與 Strongswan。其可以用自身的IPsec內核堆棧(Kernel stack),稱為KLIPS,也可以用2.6內核中的堆棧代碼(下面我們稱其為26sec),可以說是非常的靈活。還有就是來自BSD世界的KAME。 KAME只能用內核堆棧。

IPSec差不多是最老的VPN標準了,她的依然很安全,當然是在配置好以後。言下之意,她的配置比較麻煩。本文下面將做說明。

2)SSL-Based VPN 其主要代表有 OpenVPN

SSL只要跑在應用層,所以理所當然的配置簡單,只要機子能跑TCP或UDP就行,也可以穿過大多的防火牆。

3)PPTP-Based VPN 有(PoPTop)

PoPTop可以說是PPTP在Linux下的實現。不過,IPSec上跑L2TP更安全。

2.安裝Openswan

因為FreeS/WAN已經在2004年三月停止開發,所以我們使用她的後繼項目Openswan來做我們的IPSec實驗。其相比FreeS/WAN有個好處,如果使用 26sec 的時候,Openswan不用打補丁,就可以用nat。
因為IPSec工作在網路層,所以需要系統內核態的支持,上面說過,有兩個選擇,用自帶(26sec)的或用Openswan(KLIPS)的,為了方便(如何打補丁和編譯內核不是本文討論的重點),本文使用2.6自帶的實現代碼。同時本文使用Debian Sarge作為實驗系統,在Debian上安裝。
#apt-get install openswan
如果你想從源碼安裝,到http://www.openswan.org/code下載軟體包,然後按照包中的說明安裝。由於我們使用26sec,所以只要make programs;make install就可以搞定。值得注意的是,現在的Openswan已經內建些個好用的補丁,比如x.509和NAT Traversal的支持,使用起來非常的方便。
你也可以用
#ipsec verify來檢驗你的安裝

3.認證和配置

3.1 RSA Signature(RSA數字簽名)認證的配製

Openswan支持許多不同的認證方式,包括RSA keys、pre-shared keys或x.509證書方式。RSA Signature比較簡單,我先介紹下所要使用的命令

生成一個新的RSA密鑰對
#ipsec newhostkey --output /etc/ipsec.secert
按left或right格式生成RSA Sig
#ipsec showhostkey --left(或--right)

知道了上面的命令,我們就可以配置一個net-to-net,就是網關對網關的通訊。所在的Linux主機為通訊的網關,作為其子網的出口,對於子網的用戶來所是透明的,遠程的子網在通訊后可以像自己的區域網一樣的訪問。

本文使用VMWare架設起一個四台虛擬Linux主機來進行試驗。因為要在不同的機子上進行配置,所以請讀者認清主機名。

192.168.183.44(子網客戶機,計算機名RA)
<->
192.168.49.2(Left網關主機,計算機名melin,同時eth1配置為192.168.183.1)
<->
192.168.49.3(Right網關主機,計算機名right,同時eth1配置為192.168.233.1)
<->
192.168.233.44(子網客戶機,計算機名RB)

兩個網關主機當然要安裝好Openswan。同時用iptabels配置好NAT偽裝。

然後我們運行下面的命令

//melin
#ipsec newhostkey --output /etc/ipsec.secert
#ipsec showhostkey --right >> /etc/ipsec.conf
#vi /etc/ipsec.conf //編輯ipsec.conf配置文件
#scp /etc/ipsec.conf root@right_GW_ipaddress:/etc/ipsec.conf //把ipsec.conf拷貝到right網關,目的是為了讓right的到left的rsasig。
//right
#ipsec newhostkey --output /etc/ipsec.secert
#ipsec showhostkey --right >> /etc/ipsec.conf
#vi /etc/ipsec.conf
#scp /etc/ipsec.conf root@left_GW_ipadress:/etc/ipsec.conf
然後分別從前啟動ipsec服務
#ipsec setup restart //這個因為你的系統不同點不同

這裡的編輯ipsec.conf應該為(配置文件中的#為註釋,和shell中不同)

version 2.0

config setup
interfaces=%defaultroute
nat_traversal=yes

conn %default
authby=rsasig
compress=yes

#關掉 Opportunistic Encryption
include /etc/ipsec.d/examples/no_oe.conf

conn net-to-net
left=192.168.49.2
leftsubnet=192.168.183.0/24
leftid=@melin
leftnexthop=%defaultroute
right=192.168.49.3
rightsubnet=192.168.233.0/24
rightid=@right
rightnexthop=%defaultroute
# RSA 2192 bits melin Mon May 29 03:42:49 2006
leftrsasigkey=0sAQ...(leftrsasigkey值,省略)
# RSA 2192 bits right Wed May 31 22:11:59 2006
rightrsasigkey=0sAQ...
auto=add

然後在任意一方網關主機運行
ipsec auto --up net-to-net,這個時候,兩個客戶機之間應該可以互相ping的通,就像在一個內網一樣。

比如在RA上可以

$ping 192.168.233.44

在ping的過程中,在任意一個網關上用tcpdump嗅探

#tcpdump -i eth0

可以看到這樣的包

IP 192.168.233.44 > 192.168.183.44:icmp 64:echo request seq 10
IP 192.168.49.2 > 192.168.49.3: ESP(spi=0xeb73b78b,sed=0xa)
IP 192.168.49.3 > 192.168.49.2: ESP(spi=0x1601e0bd,sed=0xb)
可以看到兩個網關已經用ESP在通訊,說明成功。

值得注意的是,如果網關主機開了iptables來做IP偽裝(MASQUERADE)或NAT,需要競爭兩個子網地址的轉發,比如在我們例子中的Left主機上原來有
#echo 1 > /proc/sys/net/ipv4/ip_forward
#iptables -t nat -A POSTROUTING -o eth0 -s 192.168.183.0/24 -j MASQERADE
把改為
#iptables -t nat -A POSTROUTING -o eth0 -s 192.168.183.0/24 -d ! 192.168.233.0/24 -j MASQERADE
即不轉發目標地址為Right主機下的子網。

另外,這一行
include /etc/ipsec.d/examples/no_oe.conf意為關閉Opportunistic Encryption在你不知道她到底做了什麼之前,還是關掉她為好,打開no_oe.conf文件,發現其內容如下,我們將在本文的第五部分討論這個話題。

conn block
auto=ignore

conn private
auto=ignore

conn private-or-clear
auto=ignore

conn clear-or-private
auto=ignore

conn clear
auto=ignore

conn packetdefault
auto=ignore

3.2 x.509證書認證的配置

x.509證書方式當然更靈活,要是VPN的客戶比較多,總不能,每個都記住長長的rsasig吧。使用x.509證書認證,我們首先需要裝上openssl(現在的Linux基本自帶,沒有的www.openssl.org下一個裝上)。

1)然後,找到openssl.cnf文件,這個文件保存著對openssl證書生成的默認值,她的位置一般為:
Debian: /etc/ssl/openssl.cnf
RedHat 7.x+: /usr/share/ssl/openssl.cnf
用編輯器打開,變數名目繁多,比較有用的有
"default_days",證書失效的天數,默認一般為365天,改為3650,這樣十年才過期:)。
"default_bits",密鑰長度,默認為1024,你可以改為2048,更安全,當然速度也更慢……
"req_distinguished_name",默認的信息設置,如果你和我一樣閑每次去生成密鑰的時候去填的麻煩,就改之。

2)建一個目錄來放你的CA,我們這裡用/root/ca,記的把他的許可權設置為700,你不希望其他用戶可以看到你的私鑰吧。

3)找到"CA.sh"腳本的位置,在不同系統上稍有不同
Debian: /usr/lib/ssl/misc/CA.sh
RedHat 7.x+: /usr/share/ssl/misc/CA
編輯她,把DAYS="-days 365"的365改成你希望的數值,注意要比openssl.cnf中的"default_days"要大,當時也不要太大,一般為15年到20年就好了。

4)生成證書
~/ca$/usr/lib/ssl/misc/CA.sh -newca ;生成一個待簽名的根證書,用她來給其他證書進行簽名認證。默認生成在demoCA目錄下的cacert.pem文件(在openssl.cnf中的 CA_default子段設置)下。輸入的密碼為用來生成其他證書的密碼。-sign的時候用。
~/ca$openssl ca -gencrl -out crl.pem 生成一個與根證書相對應的crl文件
然後開始生成給主機用的證書
~/ca$/usr/lib/ssl/misc/CA.sh -newreq 生成待簽名認證的證書,默認名字為newreq.pem,輸入的密碼用在填些/etc/ipsec.secrets中。
~/ca$/usr/lib/ssl/misc/CA.sh -sign 對證書進行簽名認證,默認名字為newcert.pem
~/ca$/usr/lib/ssl/misc/CA.sh -verify 認證一下
然後重命名文件
~ca$mv newcert.pem melin.pem
~ca$mv newreq.pem melin.key //別搞反了,小的那個文件是key:),另外如果要生成的主機證書,填入的信息相同可能出錯
用同樣的方法生成right.pem和right.key文件。這樣我們就有了同樣的根證書生成的兩個證書文件。
把文件拷貝到相應的位置:

在Left主機主機上
melin:~/ca#cp melin.key /etc/ipsec.d/private
melin:~/ca#cp melin.pem /etc/ipsec.d/certs
melin:~/ca#cp demoCA/cacert.pem /etc/ipsec.d/cacerts
melin:~/ca#cp crl.pem /etc/ipsec.d/crls/crl.pem
用安全的渠道(scp或軟盤,別用ftp)把一下文件拷貝到right上
melin.pem
right.key
right.pem
demoCA/cacert.pem
crl.pem
也拷貝到正確的地方
melin#cp right.key /etc/ipsec.d/private
melin#cp right.pem /etc/ipsec.d/certs
melin#cp melin.pem /etc/ipsec.d/certs
melin#cp crl.pem /etc/ipsec.d/crls
melin#cp cacert.pem /etc/ipsec.d/cacerts/cacert.pem

5) 配置ipsec
首先是/etc/ipsec.secrets加上
: RSA /etc/ipsec.d/private/right.key "password"
password就是生成主機密鑰的時候輸入的密碼

這裡有幾個密碼要搞清楚,在生成根證書的時候輸入密碼是用來生成其他證書的,CA.sh -sign的時候要填入,ipsec.secrets填入的密碼是CA.sh -newreq時候輸入的密碼。

然後當然就是/etc/ipsec.conf在本例子中的ipsec.conf分別為

#Left(melin)
version 2.0

config setup
interfaces=%defaultroute
nat_traversal=yes
conn %default
authby=rsasig
compress=yes
leftrsasigkey=%cert
rightrsasigkey=%cert
keyingtries=1
disablearrivalcheck=no

include /etc/ipsec.d/examples/no_oe.conf

conn net-to-net
left=%defaultroute
leftsubnet=192.168.183.0/24
leftcert=melin.pem
right=%any
rightsubnet=192.168.233.0/24
pfs=yes
auto=add

#Right(right)
version 2.0

config setup
interfaces=%defaultroute
nat_traversal=yes
conn %default
authby=rsasig
compress=yes
leftrsasigkey=%cert
rightrsasigkey=%cert
keyingtries=1
disablearrivalcheck=no

include /etc/ipsec.d/examples/no_oe.conf

conn net-to-net
left=192.168.49.2
leftsubnet=192.168.183.0/24
leftcert=melin.pem
right=%defaultroute
rightsubnet=192.168.233.0/24
rightcert=right.pem
pfs=yes
auto=add

然後分別重新啟動IPSec服務
#ipsec setup restart
在right上啟動連接
#ipsec auto --up net-to-net

如果一切正確,兩個子網之間就可以互相通訊了。

3)RoadWarrior模式的配置
上面我們做的是網關對網關的配置,我們在應用中還有一種情況,員工帶著比較本出差或在家,需要用IPSec連接到公司的網路。這個就是RoadWarrior模式。

我們回到1)中RSA Keys配置的例子,在兩台主機上添加這樣的配置欄位

#RoadWarrior,Road的機子,比如到處帶著跑的筆記本,我們這裡用right
conn road
left=192.168.49.3 #如果是動態ip地址,可以填上%defaultroute
leftnexthop=%defaultroute
leftid=@melin
leftrsasigkey=0sAQ... #本機的RSA Key
right=192.168.49.2
rightsubnet=192.168.183.0/24
rightid=@right
rightrsasigkey=0sAQO... #遠程機子的RSA Key
auto=add
############################
#Host 主機,我們這裡用melin
conn road
left=192.168.49.2
leftid=@melin
leftsubnet=192.168.183.0/24
leftrsasigkey=0sAQ...
rightnexthop=%defaultroute
right=%any #不知道要傳入的連接,所以用%any
rightid=@right
rightrsasigkey=0sAQ...
auto=add

可以看出,RoadWarrior模式和Net-to-Net模式配置的區別,關鍵就是在於net-to-net模式Left和Right是相同的,通訊的主機處於固定的位置上,而RoadWarrior配置,Left就是自己(Local),Right就是遠程主機(Remote)。所以看上去,兩個的 Left和Right值是相反的。這個是配置的關鍵。

然後在RoadWarrior的主機上運行
ipsec auto --up road
更改配置文件後記的要#ipsec setup restart重啟Openswan Pluto。

接著就可以在right主機上ping到melin下的內網了
right$ping 192.168.183.44
同樣的可以在melin上
melin#tcpdump -i eth0
看到ESP包的交換

下面我們回到使用證書的net-to-net例子

細心的讀者可以發現,在證書的例子配置中,melin主機的right欄位是用的是%any,整個配置類似於RoadWarrior的配置,可是又不同,實際上,這個仍然是net-to-net的配置。也可以把配置寫成這樣。

#Left(melin)
conn net-to-net
left=192.168.49.2
leftsubnet=192.168.183.0/24
leftcert=melin.pem
right=192.168.49.3
rightsubnet=192.168.233.0/24
pfs=yes
auto=add

#Right(right)
conn net-to-net
left=192.168.49.2
leftsubnet=192.168.183.0/24
letcert=melin.pem
right=192.168.49.3
rightcert=right.pem
pfs=yes
auto=add

不過,如果是這樣的net-to-net的配置,就需要把right.pem也拷貝到melin主機的/etc/ipsec.d/certs目錄下。可以看出來,ipsec.conf的配置是非常靈活的。

下面我們給出使用RoadWarrior和使用證書的配置

#RoadWarrior(right)
conn road
left=192.168.49.3(如果為動態ip,用%defaultroute)
leftcert=right.pem
right=192.168.49.2
rightsubnet=192.168.183.0/24
rightcert=melin.pem
pfs=yes
auto=add

#Host(melin)
conn road
left=192.168.49.2
leftsubnet=192.168.183.0/24
leftcert=melin.pem
right=%any
pfs=yes
auto=add
使用上面的配製後會發現一個問題,在right主機上
right#ping 192.168.183.44
right#ping 192.168.183.1
是加密通訊
可是
right#ping 192.168.49.2(如果是在Internet,這個為主機在Internet上的ip)
卻是明文通訊,實際上,我們上面的RoadWarrior配置是讓RoadWarrior主機和網關做在的局外通訊,如果要加密和網關的通訊,可以這麼寫

#RoadWarrior(right)
conn road-net
rightsubnet=192.168.183.0/24
also=road
conn road
left=192.168.49.3(如果為動態ip,用%defaultroute)
leftcert=right.pem
right=192.168.49.2
rightcert=melin.pem
pfs=yes
auto=add

#Host(melin)
conn road-net
leftsubnet=192.168.183.0/24
also=road
conn road
left=192.168.49.2
leftcert=melin.pem
right=%any
pfs=yes
auto=add

在right上分別啟動

right#ipsec auto --up road
right#ipsec auto --up road-net

另外可以用ipsec auto status查看連接的狀態。如果想讓連接在開機就啟動,可以把auto欄位改為start。

5.Windows客戶端的配置

讓windows客戶端可以連接上Linux的IPSec網關是很有用的,畢竟桌面還是Windows比較的多。


1)當然是讓Openswan的主機運行正常運行起來,我們這裡使用,上文最接近的那個road和road-net配置。同時要注意Windows的IPSec服務已經運行。

2)生成證書

生成新的主機密鑰對win.pem和win.key,然後,我們需要把她轉化成Windows可以識別的p12格式:

~/ca$ openssl pkcs12 -export -in win.pem -inkey win.key -certfile demoCA/cacert.pem -out win.p12

獲得根證書的信息,記下來,下面要用到

subject= /C=CN/ST=Fujian/L=Xiamen/O=Jimei University/OU=Chengyi College/CN=jianqiu/emailAddress=jianqiu414@stu.jmu.edu.cn

3)所需工具

http://vpn.ebootis.de/package.zip下載Marcus Müller的ipsec.exe工具,解壓到一個目錄中,本例使用d:\ipsec

~/ca$ openssl x509 -in demoCA/cacert.pem -noout -subject
得到如下的信息

4)創建需要的控制台

運行mmc->添加刪除管理單元->添加->IP安全策略管理->選擇本地計算機->完成;
添加刪除管理單元->添加->證書->計算機賬戶->本地計算機->完成。

5)添加證書

在剛才我們新建的工作台的證書上,選擇個人->所以任務->導入,然後把win.p12導入即可。

6)安裝IPSec工具

首先需要安裝ipsecpol.exe(Windows 2000)或ipseccmd.exe(Windows XP,在Windows安裝光碟的UPPORT\TOOLS目錄下,setup選擇完全安裝),在http://support.microsoft.com/default.aspx?scid=kb;en-us;838079還有一片關於XP SP2的這些個附加工具的說明。

隨後編輯d:\ipsec\ipsec.conf文件,把我們上面得到的證書的信息填入rightca,也可以用mmc的證書頁面查看,編輯好的ipsec.conf看起來是這個樣子的。

conn roadwarrior
left=%any
right=192.168.49.2
rightca="C=CN,S=Fujian,L=Xiamen,O=Jimei University,OU=Chengyi College,CN=jianqiu,E=jianqiu414@stu.jmu.edu.cn"
network=auto
auto=start
pfs=yes

conn roadwarrior-net
left=%any
right=192.168.49.2
rightsubnet=192.168.183.0/44
rightca="C=CN,S=Fujian,L=Xiamen,O=Jimei University,OU=Chengyi College,CN=jianqiu,E=jianqiu414@stu.jmu.edu.cn"
network=auto
auto=start
pfs=yes
如果,你想要加密所有和192.168.49.2的連接

conn roadwarrior-all
left=%any
right=192.168.49.2
rightsubnet=*
rightca="C=CN,S=Fujian,L=Xiamen,O=Jimei University,OU=Chengyi College,CN=jianqiu,E=jianqiu414@stu.jmu.edu.cn"
network=auto
auto=start
pfs=yes

注意rightca不要寫錯,可以通過我們剛才的控制台,依次打開,「IP安全策略,在本地計算機」->FreeSwan-> 「roadwarrior-Host filter list」->「身份驗證方法」->「使用由此證書頒發機構(CA)頒發的證書」里的欄位。

然後到d:\tools目錄下,運行ipsec

IPSec Version 2.2.0 (c) 2001-2003 Marcus Mueller
Getting running Config ...
Microsoft's Windows XP identified
Usage: Ipsec [-off] [-delete] [-debug] [-nosleep]


D:\Tools\ipsec>ipsec
IPSec Version 2.2.0 (c) 2001-2003 Marcus Mueller
Getting running Config ...
Microsoft's Windows XP identified
Setting up IPSec ...

Deactivating old policy...
Removing old policy...

Connection roadwarrior:
MyTunnel : 192.168.49.1
MyNet : 192.168.49.1/255.255.255.255
PartnerTunnel: 192.168.49.2
PartnerNet : 192.168.49.2/255.255.255.255
CA (ID) : C=CN,S=Fujian,L=Xiamen,O=Jimei University,OU=Cheng...
PFS : y
Auto : start
Auth.Mode : MD5
Rekeying : 3600S/50000K
Activating policy...

Connection roadwarrior-net:
MyTunnel : 192.168.49.1
MyNet : 192.168.49.1/255.255.255.255
PartnerTunnel: 192.168.49.2
PartnerNet : 192.168.183.0/255.255.255.0
CA (ID) : C=CN,S=Fujian,L=Xiamen,O=Jimei University,OU=Cheng...
PFS : y
Auto : start
Auth.Mode : MD5
Rekeying : 3600S/50000K
Activating policy...

d:\ipsec>ping 192.168.49.2
看到
Negotiating IP Security.
後有回復,說明連接成功。

如果ipsec工具在你的系統上運行有問題,請確認你的rightca有沒有填錯。也可以嘗試到sourceforge.net下載Linsys IPSec Tool項目的lsipsectool.exe。另外,如果系統是Windows XP SP2,還要注意NAT-T的問題。具體Windows運行IPsec客戶端的注意事項可以查閱http://wiki.openswan.org/index.php/Win2K。

[火星人 ] 用Openswan組建Linux IPSec已經有1143次圍觀

http://coctec.com/docs/linux/show-post-203606.html