首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>网络安全>文章内容
用OpenSWAN做Linux下的IPSec VPN的详细配置指南
来源:http://www.xfocus.net 作者:toorq 发布时间:2006-11-09  

用Openswan组建Linux IPSec

by toorq


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。


 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·一句话木马
·samcrypt.lib简介
·教你轻松查看QQ空间加密后的好友
·web sniffer 在线嗅探/online ht
·SPIKE与Peach Fuzzer相关知识
·asp,php,aspx一句话集合
·Cisco PIX525 配置备忘
·用Iptables+Fedora做ADSL 路由器
·检查 Web 应用安全的几款开源免
·Md5(base64)加密与解密实战
·NT下动态切换进程分析笔记
·风险评估中的渗透测试
  相关文章
·简析Linux与FreeBSD的syscall与s
·防火墙防止DDOS分布式拒绝服务攻
·一个评价入侵检测系统漏洞攻击检
·国际标准ISO/IEC17799(一)
·Setuid() - nproc limit 类型漏
·国际标准ISO/IEC17799(二)
·也谈跨站脚本攻击与防御
·国际标准ISO/IEC17799(三)
·NAT在NDIS中间层驱动中的实现
·国际标准ISO/IEC17799(四)
·木桶新理论与信息安全
·NAT在NDIS中间层驱动中的实现
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved