一、GVPE介绍:

提供一个安全的通信信道涉及许多不同的问题,比如如何提供一个能够处理多个信息流的有效通信信道。通过有效地模拟整个网络堆栈并允许您在这个虚拟环境上构建 TCP、UDP 和其他网络技术,GNU Virtual Private Ethernet (GVPE) 提供常规单通道或多通道解决方案的一个替代方案。本文讨论如何使用 GVPE 和您的应用程序来提供通信,以及如何使用 GVPE 和您的网站通过专用和公共网络提供安全的连通性。
GNU Virtual Private Ethernet 的安全性通过 OpenSSL 库,借助公共/私有密匙机制进行处理。虚拟网络中的每个主机都被提供一个惟一的主机密匙,公共版本用于加密通信信道。同时,由于虚拟专用网基于支持的、以太网级网络环境的,为每个主机都提供一个惟一的 MAC 地址,和一个本地以太网上的情况一样。这意味着您可以通过发送者(和接收者,如果必要的话)的 MAC 地址来验证信息的来源,额外提供了一级安全性。但是,鉴于简洁性和速度因素,安全网络的身份验证和设置只通过公共/私有密匙处理,而不是通过一个典型的密码或挑战应答机制(challenge response mechanism)。这意味着您可以在启动过程中设置并启用一个 GVPE 安装,从而允许在出现故障或重新启动时重新创建虚拟网络,而不必手动设置连接。
这也就是相当与传统×××中的第一个阶段,即构建一个安全的通信通道,我的理解是:对peer进行认证。
 
注:下面的这个是在局域网中做的    
二、GVPE的安装:
在ubuntu server 10.04上安装可以使用apt-get来安装,如下:
apt-get install gvpe
当然也可以使用源码包来安装,但是必须先在系统中安装openssl和openssl-dev.
# ./configure --prefix=/usr/local/gvpe --enable-digest=sha1 --enable-cipher=aes-128
指定安装的路径为/usr/local/gvpe ,使用sha1摘要算法,aes-128的加密算法。
# make && make install
 
三、GVPE的配置:
要使用GVPE来配置一个虚拟网络,需要执行一下6步:
1、设置整个网络的配置,也就是要在/etc/gvpe/目录下创建一个gvpe.conf文件,内容如下:
enable-udp = yes
udp-port = 407
我的理解是:定义用来和其他服务器建立GVPE的协议和端口。
ifname = ***0
这个是要创建的虚拟设备的名称,和真实的eth0网络接口是一个类型的。当gvpe启动后,可以在/dev/目录下看到。
node = server01
hostname = 192.168.168.252
 
node = server02
hostname = 192.168.168.203
这是定义参加GVPE ×××的成员。node用来标识虚拟网络中的主机。hostname可以是域名或IP表示真实的通信主机。(如果有更多的节点,可以接着相这样添加)
 
2、创建用于node节点之间认证的公钥和私钥。
# gvpectrl -c /etc/gvep/ -g
-c --config:指定GVPE的配置目录。
-g --generate-keys:生成RSA密钥对。
命令执行完成以后会在/etc/gvpe/目录下面生成两个目录:hostkeys和pubkey。其中,hostkeys中存放的是每个节点的私钥,以节点名命名。同理,pubkey存放的是每个节点的公钥。
这个私钥只能存在具体的某个节点上,但是公钥必须存在于每个节点上。
3、在/etc/gvpe/目录下创建一个网络初始化的脚本。当GVPE启动的时候会执行该脚本,对前面的那个虚拟设备***0进行网络参数的设置。脚本内容如下:
#!/bin/bash
ip link set $IFNAME address $MAC mtu $MTU up
[ $NODENAME = server01 ] && ip addr add 10.0.1.1 dev $IFNAME
[ $NODENAME = server02 ] && ip addr add 10.0.2.1 dev $IFNAME
ip route add 10.0.0.0/16 dev $IFNAME
 
4、就是把/etc/gvpe/目录下的配置(除了hostkeys以外),都复制的其他节点的/etc/gvpe/目录去。可以使用SCP来做:
# scp /etc/gvpe/gvpe.conf root@192.168.168.252:/etc/gvpe/
# scp /etc/gvpe/pubkey root@192.168.168.252:/etc/gvpe/
# scp /etc/gvpe/if-up root@192.168.168.252:/etc/gvpe/
 
5、为每一个节点配置主机密钥,也就是上面创建的节点的私钥。要把/etc/gvpe/hostkeys/目录下的私钥复制到对应节点的/etc/gvpe/目录,并重命名为:hostkey   如下:
# cp /etc/gvpe/hostkeys/server01 /etc/gvpe/hostkey  --这是在本机做的。
# scp /etc/gvpe/hostkeys/server02 root@192.168.168.203:/etc/gvpe/hoskey
 
6、启动GVPE:
直接执行# gvpe后,GVPE会在后台运行。如果配置没有错误,就不会有任何消息输出。如果想输出详细的信息,可以加一些参数,如下:
# gvpe -D -l info server01
这样如果另一个节点也启动了的话,你就会看到
root@server01:/etc/gvpe# gvpe -D -l info server01
gvpe daemon 2.24 (Nov 27 2011 16:32:15) starting up.
server02(udp/192.168.168.203:407): connection established (direct), protocol version 0.1.  --这个是和节点server02连接成功的消息。
server02(udp/192.168.168.203:407): connection lost  --这个是断开的消息。
 
如果要想把某个节点断开,则在这个节点上执行如下命令:
# gvpectrl -k $NODENAME
 
 
四、测试:
在server02上测试的结果如下:
root@server02:~# ifconfig ***0
***0      Link encap:Ethernet  HWaddr fe:fd:80:00:00:02  
         inet addr:10.0.2.1  Bcast:0.0.0.0  Mask:255.255.255.255
         inet6 addr: fe80::fcfd:80ff:fe00:2/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1422  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:500 
         RX bytes:0 (0.0 B)  TX bytes:468 (468.0 B)
 
root@server02:~# ping 10.0.1.1
PING 10.0.1.1 (10.0.1.1) 56(84) bytes of data.
64 bytes from 10.0.1.1: icmp_req=1 ttl=64 time=1.14 ms
64 bytes from 10.0.1.1: icmp_req=2 ttl=64 time=0.793 ms
^C
--- 10.0.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.793/0.969/1.146/0.179 ms
root@server02:~# 
同样,在server01上也是可以ping通10.0.2.1的。
 
如果要想查看该节点的GVPE配置,可以执行如下命令:
root@server01:/etc/gvpe# gvpectrl -s
Configuration
# of nodes:         2
this node:          <unset>
MTU:                1500
rekeying interval:  -128
keepalive interval: -128
interface:          ***0
primary rsa key:    <default>
rsa key size:       1280
ID#  MAC               Com Conmode   Node        Host:Port
  1  fe:fd:80:00:00:01  Y  always    server01    192.168.168.252:407
  2  fe:fd:80:00:00:02  Y  always    server02    192.168.168.203:407
 
root@server01:/etc/gvpe# gvpectrl --help
Usage: gvpectrl [option]...
 -c, --config=DIR           Read configuration options from DIR.
 -k, --kill[=SIGNAL]        Attempt to kill a running gvpe and exit.
 -g, --generate-keys        Generate public/private RSA keypair.
 -s, --show-config          Display the configuration information.
 -q, --quiet                Be quite quiet.
     --help                 Display this help and exit.
     --version              Output version information and exit.
 
Report bugs to <gvpe@schmorp.de>.
root@server01:/etc/gvpe#