CentOS6.3下使用OpenSWAN做IPSecVPN的RoadWarrior模式

来源:互联网 发布:java在方法上定义泛型 编辑:程序博客网 时间:2024/06/05 09:56

OpenSWan有两种连接方式:

1) Network-To-Network方式

顾名思义,Network-To-Network方式是把两个网络连接成一个虚拟专用网络。当连接建立后,每个子网的主机都可透明地访问远程子网的主机。

要实现此种连接方式,要满足以下两个条件:

I. 每个子网各自拥有一台安装有OpenSWan的主机作为其子网的出口网关;

II.每个子网的IP段不能有叠加

2) Road Warrior方式

当使用Network-To-Network方式时,作为每个子网网关的主机不能像子网内部主机那样透明访问远程子网的主机,也就是说:

如果你是一个使用Laptop的移动用户,经常出差或是在不同的地点办公,你的Laptop将不能用Network-To-Network方式与公司网络进行连接。

Road Warrior方式正是为这种情况而设计的,连接建立后,你的Laptop就可以连接到远程的网络了。


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)


在本例中我实现了Road Warrior 模式,环境描述如下:

VPN client(192.168.136.93) <---> VPN server(双网卡:192.168.136.197 10.1.5.254) <---> 子网客户机(10.1.5.110)


Openswan支持许多不同的认证方式,包括RSA keys、pre-shared keys、XAUTH、x.509证书方式。

在本例中我实现了RSAsig认证和x.509证书认证。下面分别描述如何配置:


RSAsig认证方式配置

生成一个新的RSA密钥对

#ipsec newhostkey  --output /etc/ipsec.secert

按left或right格式生成RSA Sig

#ipsec showhostkey --left(或--right)

分别记录好left和right的RSA Sig

分别编辑 client和server的/etc/ipsec.conf文件。

VPN client 的ipsec.conf文件内容:

version2.0# conforms to second version of ipsec.conf specification# basic configurationconfig setupinterfaces=%defaultroutedumpdir=/var/run/pluto/virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:!10.1.5.0/24,%v6:fd00::/8,%v6:fe80::/10oe=offprotostack=netkeyplutostderrlog=/var/log/pluto.logconn %defaultauthby=rsasigcompress=yesinclude /etc/ipsec.d/examples/no_oe.confconn roadleft=192.168.136.93leftnexthop=%defaultrouteleftid=@leftleftrsasigkey=0sAQOvt。。。 right=192.168.136.197rightsubnet=10.1.5.0/24rightid=@rightrightrsasigkey=0sAQ。。。type=tunnelauto=add
VPN server 的ipsec.conf文件内容:

version2.0# conforms to second version of ipsec.conf specification# basic configurationconfig setupinterfaces=%defaultroutedumpdir=/var/run/pluto/nat_traversal=yesvirtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:!10.1.5.0/24,%v6:fd00::/8,%v6:fe80::/10oe=offprotostack=netkeyplutostderrlog=/var/log/pluto.logconn %defaultauthby=rsasigcompress=yesinclude /etc/ipsec.d/examples/no_oe.confconn roadleft=192.168.136.197leftid=@rightleftsubnet=10.1.5.0/24leftrsasigkey=0sAQOvt。。。rightnexthop=%defaultrouteright=%anyrightid=@leftrightrsasigkey=0sAQ。。。type=tunnelauto=add

配置完毕后需要将两台机器上的ipsec重启

#ipsec setup restart

在VPN client机器上启动建立隧道

#ipsec auto --up road

可通过命令查看是否启动成功

#ipsec setup status

IPsec running  - pluto pid: 11101
pluto pid 11101
1 tunnels up

在VPN client机器上可ping 10.1.5.110 应该是成功的。


x.509证书认证方式配置

使用openssl来创建证书

首先需要装上openssl(现在的Linux基本自带,没有的www.openssl.org下一个装上)。
#openssl version
OpenSSL 1.0.0-fips 29 Mar 2010

创建证书的命令

建立CA
#openssl req -x509 -newkey rsa:1024 -out cacert.pem -keyout cakey.pem -days 3650
#cd /etc/pki/CA
#touch index.txt
#echo "01" > serial
#echo "01" > crlnumber

生成吊销列表
#openssl ca -gencrl -out crl.pem -cert cacert.pem -keyfile cakey.pem

生成服务端私钥
#openssl genrsa -des3 -out serverKey.pem 1024
生成请求
#openssl req -new -key serverKey.pem -out serverKey.csr
签发
#openssl ca -in serverKey.csr -out serverKey.crt -cert cacert.pem -keyfile cakey.pem

生成客户端私钥
#openssl genrsa -des3 -out clientKey.pem 1024
生成请求
#openssl req -new -key clientKey.pem -out clientKey.csr
签发
#openssl ca -in clientKey.csr -out clientKey.crt -cert cacert.pem -keyfile cakey.pem

在VPN client 机器上需要做的:

1)拷贝cacert.pem到 /etc/ipsec.d/cacerts

      拷贝crl.pem 到 /etc/ipsec.d/crls

      拷贝clientKey.crt,serverKey.crt 到 /etc/ipsec.d/certs

      拷贝clientKey.pem 到 /etc/ipsec.d/private

2)配置ipsec.secrets文件,在文件尾加上

       : RSA /etc/ipsec.d/private/clientKey.pem "生成私钥时的密码"

3)配置ipsec.conf文件

version2.0# conforms to second version of ipsec.conf specification# basic configurationconfig setupinterfaces=%defaultroutedumpdir=/var/run/pluto/virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:!10.1.5.0/24,%v6:fd00::/8,%v6:fe80::/10oe=offprotostack=netkeyplutostderrlog=/var/log/pluto.logconn %defaultauthby=rsasigcompress=yesinclude /etc/ipsec.d/examples/no_oe.confconn roadwarriorleft=192.168.136.93leftnexthop=%defaultrouteleftcert=clientKey.crtright=192.168.136.197rightcert=serverKey.crtrightsubnet=10.1.5.0/24pfs=yestype=tunnelauto=addrekey=yes

在VPN server 机器上需要做的:

1)拷贝cacert.pem到 /etc/ipsec.d/cacerts

      拷贝crl.pem 到 /etc/ipsec.d/crls

      拷贝clientKey.crt,serverKey.crt 到 /etc/ipsec.d/certs

      拷贝serverKey.pem 到 /etc/ipsec.d/private

2)配置ipsec.secrets文件,在文件尾加上

       : RSA /etc/ipsec.d/private/serverKey.pem "生成私钥时的密码"

3)配置ipsec.conf文件

version2.0# conforms to second version of ipsec.conf specification# basic configurationconfig setupinterfaces=%defaultroutedumpdir=/var/run/pluto/nat_traversal=yesvirtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:!10.1.5.0/24,%v6:fd00::/8,%v6:fe80::/10oe=offprotostack=netkeyplutostderrlog=/var/log/pluto.logconn %defaultauthby=rsasigcompress=yesinclude /etc/ipsec.d/examples/no_oe.confconn roadwarriorleft=192.168.136.197leftsubnet=10.1.5.0/24leftcert=serverKey.crtright=192.168.136.93#right=%anyrightnexthop=%defaultrouterightcert=clientKey.crtpfs=yestype=tunnelauto=addrekey=no
配置完毕后需要将两台机器上的ipsec重启

#ipsec setup restart

在VPN client机器上启动建立隧道

#ipsec auto --up roadwarrior

可通过命令查看是否启动成功

#ipsec setup status

IPsec running  - pluto pid: 11101
pluto pid 11101
1 tunnels up

在VPN client机器上可ping 10.1.5.110 应该是成功的。


在这里引用了一个文件include /etc/ipsec.d/examples/no_oe.conf 意为关闭Opportunistic Encryption在你不知道它到底做了什么之前,还是关掉它为好。默认情况下此文件不存在,可手工创建。其文件内容如下:

conn block        auto=ignoreconn private        auto=ignoreconn private-or-clear        auto=ignoreconn clear-or-private        auto=ignoreconn clear        auto=ignoreconn packetdefault        auto=ignore

遗留的问题

在Road Warrior模式下由于服务端不知道是那个客户端来接入,所以需要right=%any。但在证书认证方式时如果这么配置会出错:no suitable connection for peer '192.168.136.93'。因此必须指定right的IP地址和证书。这样感觉好像不太对,但目前还没找到具体原因。