Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78031
  • 博文数量: 66
  • 博客积分: 2546
  • 博客等级: 少校
  • 技术积分: 740
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-27 10:35
文章存档

2011年(1)

2010年(1)

2009年(64)

我的朋友

分类:

2009-10-27 10:52:34

Openswan组建Linux IPSec

1.
概述
2.
安装Openswan
3.
认证和配置
    3.1 RSAsig
认证方式的配置
    3.2 x.509
证书认证的配置
    3.3 RoadWarrior
模式的配置
5.Windows
客户端的配置
*****
1.
概述
    LInux
上的VPN支持主要有三种:
    
    1)IPSec 's VPN
其主要代表有 FreeS/WANKAME

    IPSec
Linux上支持主要有两个主要的分类,一为FreeS/WAN,现在已经停止开发,其分裂为两个项目,Openswan Strongswan。其可以用自身的IPsec内核堆栈(Kernel stack),称为KLIPS,也可以用2.6内核中的堆栈代码(下面我们称其为26sec),可以说是非常的灵活。还有就是来自BSD世界的KAME KAME只能用内核堆栈。

    IPSec
差不多是最老的VPN标准了,她的依然很安全,当然是在配置好以后。言下之意,她的配置比较麻烦。本文下面将做说明。

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

    SSL
只要跑在应用层,所以理所当然的配置简单,只要机子能跑TCPUDP就行,也可以穿过大多的防火墙。

    3)PPTP-Based VPN
(PoPTop)

    PoPTop
可以说是PPTPLinux下的实现。不过,IPSec上跑L2TP更安全。

2.
安装Openswan
    
    
因为FreeS/WAN已经在2004年三月停止开发,所以我们使用她的后继项目Openswan来做我们的IPSec实验。其相比FreeS/WAN有个好处,如果使用 26sec 的时候,Openswan不用打补丁,就可以用nat
    
因为IPSec工作在网络层,所以需要系统内核态的支持,上面说过,有两个选择,用自带(26sec)的或用Openswan(KLIPS)的,为了方便(如何打补丁和编译内核不是本文讨论的重点),本文使用2.6自带的实现代码。同时本文使用RHEL AS4.0作为实验系统,在RHEL AS4.0上安装。

下载软件包,然后按照包中的说明安装。由于我们使用26sec,所以只要make programs;make install就可以搞定。值得注意的是,现在的Openswan已经内建些个好用的补丁,比如x.509NAT Traversal的支持,使用起来非常的方便。

#tar –zxvf openswan-2.4.9.tar.gz
    #
make KERNELSRC=/lib/modules/`uname -r`/build module minstall

 # make programs install


    
你也可以用
    #ipsec verify
来检验你的安装

3.
认证和配置

一、 RSA SignatureRSA数字签名)认证的配制

    Openswan
支持许多不同的认证方式,包括RSA keyspre-shared keysx.509证书方式。RSA Signature比较简单,我先介绍下所要使用的命令

    
生成一个新的RSA密钥对
    #ipsec newhostkey  --output /etc/ipsec.secert
    
leftright格式生成RSA Sig
    #ipsec showhostkey --left
(或--right

    
知道了上面的命令,我们就可以配置一个net-to-net,就是网关对网关的通讯。所在的Linux主机为通讯的网关,作为其子网的出口,对于子网的用户来所是透明的,远程的子网在通讯后可以像自己的局域网一样的访问。
    
    
本文使用VMWare架设起一个四台虚拟Linux主机来进行试验。因为要在不同的机子上进行配置,所以请读者认清主机名。


       


    172.16.40.18
(子网客户机,计算机名RA
    <->
    192.168.32.30
right网关主机,计算机名VPN,同时eth1配置为172.16.40.254
    <->
    192.168.32.29
left网关主机,计算机名ora92,同时eth1配置为172.16.50.254
    <->
    172.16.50.18
(子网客户机,计算机名RB

    
两个网关主机当然要安装好Openswan

    
然后我们运行下面的命令

    //ora92----left    
    #ipsec newhostkey --output /etc/ipsec.secert
    #ipsec showhostkey --left >> /etc/ipsec.conf
    #vi /etc/ipsec.conf                          //
编辑ipsec.conf配置文件
    #scp /etc/ipsec.conf

 //ipsec.conf拷贝到right网关,目的是为了让right得到leftrsasig


    //vpn----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     # conforms to second version of ipsec.conf specification

# basic configuration

config setup

        nat_traversal=yes

        nhelpers=0

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

conn linux-to-linux    conn必须定行写

        left=192.168.32.29

        leftsubnet=172.16.50.0/24

        leftid=@ora92

        # RSA 2192 bits   ora92   Thu Jul 19 13:52:56 2007        leftrsasigkey=0sAQN8mHncm 6AV77BxYsCx/IuYbz6cpsAnXdJGEDkDohsUQs9U/uyZ7ru0DIq4PkjQ/D/kS9VXyc1ZHv9WmwNzTnO cVFMuC3Ld4epFpb4w 5HzEhpPG1U63o0H 8z4OqJg9a7yE9z93EJnLcciyyRuCpE4voNPUIuuQKpOjK641OfQu6zFZqJhCGnFr IL80WTykN/ZbKVFLe Dao5EGXpqafnTSiXq2xMgpo5uMxOogjsdjRu8 H0Qw2U2FGN2kgin4P/qbdQY9CQSgs8SMo3aHF3xrdPX9bDOmZYZJrl0c3uELtElNrTouGig4c3amNMpUSigXisitbqy5SNGQnOLZlJzlPCVkR8GofWOvaNEBSuAH

        right=192.168.32.30

        rightid=@vpn

        rightsubnet=172.16.40.0/24

        # RSA 2192 bits   vpn   Thu Jul 19 14:01:03 2007     rightrsasigkey=0sAQOyv/cshJnUxULJtaiG 3aDeUIuzbe6c0eVmcEp4l/GK/Qd8yRD/PWfqBsJCP Bg3PieoEM GwFXE2GE9h8pPzXwiMfxBTwTx3RHxYK/6mA9sxGJerCD9Ro1IgpRfQFzVio1UBukN5YX6rnrfvbBDNwzidL8JHyNtKXMbw56U7qsXxhkVsF0Xwk5gkH5ONj571xbPF ckO4ATxMFVQG1VeWyi5JMYt58vUY1ipVRTg2YMcwZR tPAIP/9Vr2XoUF5fzQ0WEQrU6XPXrGta/Ma0F5yfAjMbBXp87tmLQL88x2V5jC7GikSS8rReuRP9bv9OC879jVrvy98ExMEW YdsCSrIKOqqx6D rINCnXUjS0E5F

          auto=start

然后在任意一方网关主机运行
    ipsec auto --up net-to-net
,这个时候,两个客户机之间应该可以互相ping的通,就像在一个内网一样。
    
比如在RA上可以
    $ping 172.16.50.18
    
ping的过程中,在任意一个网关上用tcpdump嗅探
    #tcpdump -i eth0
    
可以看到这样的包
    IP 172.16.40.18 > 172.16.50.18:icmp 64:echo request seq 10
    IP 192.168.32.29 > 192.168.32.30: ESP(spi=0xeb73b78b,sed=0xa)
    IP 172.16.50.18 > 172.16.40.18: ESP(spi=0x1601e0bd,sed=0xb)
    
可以看到两个网关已经用ESP在通讯,说明成功。

另外,这一行
    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

二、 x.509证书认证的配置

    x.509
证书方式当然更灵活,要是VPN的客户比较多,总不能,每个都记住长长的rsasig吧。使用x.509证书认证,我们首先需要装上openssl(现在的Linux基本自带,没有的下一个装上)。

    1)
然后,找到openssl.cnf文件,这个文件保存着对openssl证书生成的默认值,她的位置一般为:
    Debian: /etc/ssl/openssl.cnf
    RedHat: /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: /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 ora92.pem
    ~ca$mv newreq.pem ora92.key //
别搞反了,小的那个文件是key:),另外如果要生成的主机证书,填入的信息相同可能出错
    
用同样的方法在right――vpn主机上生成vpn.pemvpn.key文件。这样我们就有了同样的根证书生成的两个证书文件。
    
把文件拷贝到相应的位置:
    5
)在Left主机主机上
    ora92:~/ca#cp ora92.key /etc/ipsec.d/private
    ora92:~/ca#cp ora92.pem /etc/ipsec.d/certs
    ora92:~/ca#cp demoCA/cacert.pem /etc/ipsec.d/cacerts
    ora92:~/ca#cp crl.pem /etc/ipsec.d/crls/crl.pem
    
用安全的渠道(scp或软盘,别用ftp)把ora92.pem文件拷贝到right
    ora92:~/ca#scp /etc/ipsec.d/certs/ora92.pem   


   6
)在right主机主机上
    
也拷贝到正确的地方
    vpn:~/ca#cp vpn.key /etc/ipsec.d/private
    vpn:~/ca#cp vpn.pem /etc/ipsec.d/certs
    vpn:~/ca#cp crl.pem /etc/ipsec.d/crls
    vpn:~/ca#cp cacert.pem /etc/ipsec.d/cacerts/cacert.pem
    
用安全的渠道(scp或软盘,别用ftp)把vpn.pem文件拷贝到left
    vpn:~/ca#scp /etc/ipsec.d/certs/vpn.pem root@192.168.32.29:/etc/ipsec.d/certs/vpn.pem

   7)
配置ipsec
  left
上:首先是/etc/ipsec.secrets加上
    : RSA /etc/ipsec.d/private/ora92.key "password"
    password
就是生成主机密钥的时候输入的密码

 

Right上:首先是/etc/ipsec.secrets加上
    : RSA /etc/ipsec.d/private/vpn.key "password"
    password
就是生成主机密钥的时候输入的密码

    
这里有几个密码要搞清楚,在生成根证书的时候输入密码是用来生成其他证书的,CA.sh -sign的时候要填入,ipsec.secrets填入的密码是CA.sh -newreq时候输入的密码。

    
然后当然就是/etc/ipsec.conf在本例子中的ipsec.conf分别为

#Left(ora92)
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.32.29

leftsubnet=172.16.50.0/24
    leftcert=ora92.pem
    right=192.168.32.30

rightcert=vpn.pem
    rightsubnet=172.16.40.0/24
    pfs=yes
    auto=add

#Right(vpn)
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.32.29
    leftsubnet=172.16.50.0/24
    leftcert=ora92.pem
    right=192.168.32.30
    rightsubnet=172.16.40.0/24
    rightcert=vpn.pem
    pfs=yes
    auto=add

    
然后分别重新启动IPSec服务
    #ipsec setup restart
    
right上启动连接
    #ipsec auto --up net-to-net  
    
如果一切正确,两个子网之间就可以互相通讯了。

三、RoadWarrior模式的配置
    
上面我们做的是网关对网关的配置,我们在应用中还有一种情况,员工带着比较本出差或在家,需要用IPSec连接到公司的网络。这个就是RoadWarrior模式。


    
我们回到1)RSA Keys配置的例子,在两台主机上添加这样的配置字段

#RoadWarrior,Road--Client
的机子,比如到处带着跑的笔记本,我们这里用right
conn road
    left=192.168.32.30 #
如果是动态ip地址,可以填上%defaultroute
    leftnexthop=%defaultroute
    leftid=@vpn
    leftrsasigkey=0sAQ... #
本机的RSA Key
    right=192.168.32.29
    rightsubnet=172.16.50.0/24
    rightid=@ora92
    rightrsasigkey=0sAQO... #
远程机子的RSA Key
    auto=add                      
############################
#Host--Server
主机,我们这里用ora92
conn road
    left=192.168.32.29
    leftid=@ora92
    leftsubnet=172.16.50.0/24
    leftrsasigkey=0sAQ...
    rightnexthop=%defaultroute
    right=%any #
不知道要传入的连接,所以用%any
    rightid=@vpn
    rightrsasigkey=0sAQ...
    auto=add

可以看出,RoadWarrior模式和Net-to-Net模式配置的区别,关键就是在于net-to-net模式LeftRight是相同的,通讯的主机处于固定的位置上,而RoadWarrior配置,Left就是自己(Local),Right就是远程主机(Remote)。所以看上去,两个的 LeftRight值是相反的。这个是配置的关键。

然后在RoadWarrior的主机上运行
    ipsec auto --up road
更改配置文件后记的要#ipsec setup restart重启Openswan Pluto


接着就可以在right--vpn主机上pingora92下的内网了
    right$ping 172.16.50.18
同样的可以在ora92
    ora92#tcpdump -i eth0
看到ESP包的交换

四、下面我们给出使用RoadWarrior和使用证书的配置
#RoadWarrior(right)
conn road

    left=192.168.32.30

    leftnexthop=%defaultroute

    leftcert=vpn.pem

    leftid=@vpn

    right=192.168.32.29

    rightcert=ora92.pem

    rightsubnet=172.16.50.0/24

    rightid=@ora92

    pfs=yes

    auto=start

#Host(ora92)
conn road

    left=192.168.32.29

    leftcert=ora92.pem

    leftsubnet=172.16.50.0/24

    leftid=@ora92

    rightnexthop=%defaultroute

    right=%any

    rightcert=vpn.pem

    rightid=@vpn

    pfs=yes

    auto=start
使用上面的配制后在right主机上
    vpn#ping 172.16.50.18
   

五、基于预共享密钥认证方式NettoNet配置

1、配置/etc/ipsec.conf(左右网关的ipsec.conf配置一样)

version 2.0

config setup

nat_traversal=yes

nhelpers=0

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

conn net

        auto=start

        right=192.168.32.30

        compress=no

        pfs=no

        left=192.168.32.29

        authby=secret

        ikelifetime=3600

        keylife=28800

        dpddelay=30

        dpdtimeout=120

        dpdaction=restart

        rekey=yes

        keyingtries=0

        rightsubnet=172.16.40.0/24

        leftsubnet=172.16.50/24

2、修改/etc/ipsec.secrets,左右网关上均加入如下行:

192.168.32.29 192.168.32.30 : PSK "123456"  

123456:为预共享密钥

 

六、Ipsecl2tp配合使用

1、修改/etc/ipsec.conf加入

   conn L2TP

        auto=start

        right=192.168.32.29

        rightnexthop=%defaultroute

        compress=no

        pfs=no

        left=%any

        authby=secret

        ikelifetime=3600

        keylife=28800

        dpddelay=30

        dpdtimeout=120

        dpdaction=restart

        rekey=yes

        keyingtries=0

        rightprotoport=UDP/0

        leftprotoport=UDP/1701

2、修改/etc/ipsec.secrets加入如下一行:

192.168.32.29 %any : PSK "abcd1234"

  abcd1234:预共享密钥

   3、新建文件/etc/ppp/options.l2tp,加入如下:

ipcp-accept-local

ipcp-accept-remote

#ms-dns 202.106.0.20

#ms-dns 202.106.196.115

auth

crtscts

idle 1800

mtu 1200

mru 1200

nodefaultroute

debug

lock

proxyarp

connect-delay 5000

nologfd

   4、修改/etc/ppp/chap-secrets加入:

# Secrets for authentication using CHAP

# client        server  secret                  IP addresses

netsword        *       xiaobai     *

   5、修改/etc/l2tp/l2tp.conf加入:

       [global]

auth file = /etc/ppp/chap-secrets

 

[lns default]

exclusive = yes

ip range = 172.16.51.100-172.16.51.110  #拨入后分配的网址

local ip = 192.168.32.29

length bit = yes

require chap = yes

refuse pap = yes

require authentication = yes

pppoptfile = /etc/ppp/options.l2tp

6、启动ipsecl2tp服务

#ipsec setup start

#/usr/local/bin/l2tp


.Windows客户端的配置
    
windows客户端可以连接上LinuxIPSec网关是很有用的,毕竟桌面还是Windows比较的多。
    1)
当然是让Openswan的主机运行正常运行起来,我们这里使用,上文最接近的那个roadroad-net配置。同时要注意WindowsIPSec服务已经运行。
    2)
生成证书
    
生成新的主机密钥对win.pemwin.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ülleripsec.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选择完全安装),在还有一片关于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客户端的注意事项可以查阅

 

阅读(802) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~