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 如果你想从源码安装,到下载软件包,然后按照包中的说明安装。由于我们使用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基本自带,没有的下一个装上)。
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)所需工具
下载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选择完全安装),在?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客户端的注意事项可以查阅。
(责任编辑:admin) |