嵌入式 轻量级VPN解决方案--SigmaVPN

2019-07-12 16:58发布

 SigmaVPN是一个轻量级的VPN解决方案,旨在提供UNIX系统下的,配置简单的,安全的VPN隧道。其官网http://code.google.com/p/sigmavpn/ 本文是按上面的文档操作后做的些许整理。   1.         SigmaVPN是模块化的。很容易创建新的接口和加密/编码方案。 2.         SigmaVPN是很小巧的。只有几百行的纯C代码。 3.         SigmaVPN易于配置,允许在一个配置文件中添加多个隧道  

1.   引言

    SigmaVPN能够支持多路并发隧道并提供灵活的终端/协议设置方式。通常情况下配置项存储在一个名为sigmavpn.conf的文件里,配置文件是INI格式的。

1.1. Protocols

Protocols指定了分组收发之前的编/解码方式或加/解密方式。目前支持几种不同的protocols:
  • nacltai:基于curve25519xsalsa20poly1305的强健的加密方式,由NaCl 提供加密接口
  • nacl0: 基于curve25519xsalsa20poly1305的较弱加密方式,由NaCl 提供加密接口
  • raw: 不加密,原始数据包

1.2.        Interfaces

Interfaces 指定Sigma可执行文件的输入和输出接口。目前支持选项:
  • udp: UDP 协议
  • tuntap: TUN/TAP驱动接口,用于建立虚拟网卡

1.3.        本地和对端Interfaces

通常你需要两个interface:一个是本地的,一个是对端的。本地的interface是你的隧道入口,而一般对端interface就是隧道本身。因此,本地端通常是明文的,而对端是加密后的。 Sigma处理两个interface间的数据包传输和加密解密。 you <->local<-> protocol <-> remote <->......<-> remote <-> protocol <->local<-> peer  

1.4.        Protocol和Interfaces

通常,一个配置里有两个interface(一个本地的和一个对端的),还有一个protocol。让我们看看一个典型的加密VPN设置:
  • local tuntap interface
  • nacltai protocol
  • remote udp interface
这就配置了一个隧道,结果:
  • 源自本地TUN/TAP 设备的数据包将会用nacltai加密,然后通过UDP发送出去P
  • 通过UDP接收的数据包,将用nacltai解密,然后发送到你的 TUN/TAP设备

2. 编译安装

编译SigmaVPN,需要下载源码,然后执行源码包里提供的编译安装脚本 编译脚本用到了下面这些工具:
  • curl 或 wget
  • bzip2
  • gcc, binutils and friends
  • bash (编译脚本是bash语法写的,也可以自己改成其它shell)

2.1.        获取源码

稳定源码包一般经过测试后发布的,推荐使用。源码包发布在google code。 #wget http://sigmavpn.googlecode.com/files/sigmavpn-0.2.tar.gz 
#tar zxf sigmavpn
-0.2.tar.gz 
#cd sigmavpn
-0.2
    开发者可以从GIT仓库获取最新的源码 #git clone https://code.google.com/p/sigmavpn/ 
#cd sigmavpn
 

2.2.        编译

2.2.1.    加密方案

如果需要NACL加密接口,执行编译脚本时,带上--with-nacl参数即可。编译NACL将提供nacl0和nacltai加密方式,用于提高隧道的安全性。编译NACL比较耗时。NaCl库编译后,还提供了一个naclkeypair可执行文件,它可以生成随机密钥,以便建立加密隧道。 #sh build.sh --with-nacl

2.2.2.       明文方案

不带--with-nacl参数编译,那将不会编译NACL相关的库,也不能使用加密方案。 #sh build.sh  

2.3.        安装

执行下面命令,会编译将sigmavpn相关模块安装到系统目录中 #sudo sh install.sh

3. 配置项说明

Sigma配置文件是相当简单的INI格式。每一节表示一个会话,然后用一系列的键值对来描述相关的配置选项。

3.1.        常规选项

注意: SigmaVPN对配置文件(sigmavpn.conf)里的配置参数的顺序是敏感的。比如说:proto应该在其它proto_选项之前定义;local应该在其它local_选项之前定义;peer应该在其它peer_选项之前定义。 选项 可选值 描述 proto raw, nacl0, nacltai 设置加密/解密协议(Android 平台的SigmaVPN ,nacltai等价于TAI64) local tuntap, udp 设置本地使用的接口(通常是 tuntap). peer tuntap, udp 设置对端所用的接口(通常是 udp).

3.2.        nacl0/nacltai-特定选项

选项 可选值 描述 proto_privatekey 64-bit hex 您的私钥 (可以用 naclkeypair 工具生成;把私钥配置在这里,并把公钥发布给您的伙伴). proto_publickey 64-bit hex 公钥(您的同伴生成并发布的公钥,配置在这里).

3.3.        udp-特定选项

选项 可选值 描述 peer_remoteaddr IPv4/IPv6 地址 对端的通信IP地址 (对应对端的peer_localaddr 配置) peer_remoteport 1到65535 对端的UDP端口(对应对端的peer_localport配置项). peer_remotefloat 0 或1 接收正确加密的数据包时,自动更新远端的终端。这使得远端客户端在改变IP地址或端后,能够继续通过这个隧道通信。(如果您是在Android设备上用SigmaVPN 设置隧道,那么您可能需要用这个配置选项,而不是用peer_remoteaddr和peer_remoteport)。这个选项在0.2之后的版本可用,您可能需要获取最新的源码并重新编译才能启用这个配置项 peer_localaddr IPv4/IPv6 地址. 本地监听的IP地址 (对应对端配置的peer_remoteaddr ) peer_localport 1 到 65535 本地的UDP端口(对应对端配置的peer_remoteport ) peer_ipv6 0 或 1 指定UDP连接是否使用IPv6。关联的本地和远端的地址都必须是IPV6格式的。如果没有指定,那么假定使用IPV4 (请注意,这个选项设置的是隧道能否承载于IPV6之上,而不是说隧道内的交互能否使用IPV6)

3.4.        tuntap-特定选项

选项 可选值 描述 ocal_interface String 取决于OS,是一个合法的网卡设备名称 (比如Linux 2.6+的 mytunnel), 或者是指向TUN或TAP设备的全路径(比如Mac OS X的 /dev/tun0). local_tunmode 0 or 1 是否使用3层TUN适配器,而不使用2层的TAP适配器 (仅适用于Linux 2.6+)。TUN适配器携带IP分组,而不是以太网帧。如果对方是使用SigmaVPN的Android客户端,那么这是必须的。 local_protocolinfo 0 or 1 使用TUN模式时,是否包含协议信息头域 (仅适用于Linux 2.6+)。如果您想在3层TUN隧道上同时携带IPV4和IPV6数据,那么这个选项是可选的,甚至可能是不必要的。如果对方是使用SigmaVPN 的Android 客户端,那么不要使用这个选项,即便是IPV6隧道。

3.5.        配置文件实例

[peername] proto = nacl0 proto_publickey = 1e22c6af59f23cd3c40464c29e307cbd616e3f6a743f17a33dd6bd0ae4c79e71 proto_privatekey = cf1d8756fdde0f73f0c06f7c3f4cf456c3d74596b9e559570cf27d8b34059121 local = tuntap local_interface = tap0 peer = udp peer_remoteaddr = 192.168.122.130 peer_remoteport = 4567 peer_localaddr = 192.168.122.180 peer_localport = 7654 Linux内核版本 2.6以后,local_interface 的配置值简化为一个直接的设备名称,比如 "tunnel",也就是说不必配置完整路径

4.   配置安全隧道的步骤

4.1.        编译nacltai

检查您的模块文件里是否有proto_nacltai.o 文件和一个名为naclkeypair 的可执行文件。如果没有,那么带--with-nacl参数重新编译安装。

4.2.        建立配置文件

安装脚本会建立一个空的配置文件:/usr/local/etc/sigmavpn.conf 。打开这个文件,并输入以下模板的内容: [peername] 
proto 
= nacltai 
proto_publickey 
= 
proto_privatekey 
= 
local= tuntap 
local_interface 
=  
peer 
= udp 
peer_remoteaddr 
= 
peer_remoteport 
= 
peer_localaddr 
= 
peer_localport 
=

4.3.        生成并交换密钥

执行naclkeypair命令,就会生成两个密钥,一个私钥和一个公钥。把私钥写入配置文件里的proto_privatekey选项值,把公钥发布给您的伙伴。 同样,您的伙伴也需要生成一对密钥。您从伙伴那里获取他的公钥,并把它写入配置文件里的proto_publickey值。

4.4.        配置IP和端口

选择一个IP地址和端口,用于SigmaVPN 本地监听。配置项对应peer_localaddr 和 peer_localport,把地址和端口告知您的伙伴。 您的伙伴同样要告诉您,他的地址和端口,您需要把地址和商品配置为peer_remoteaddr 和 peer_remoteport的选项值。

4.5.        协商隧道类型

选定您的隧道类型。可以是 (2层/以太网) 或TUN (3层/IP):
  • Linux: 如果使用TUN模式。需要把local_tunmode 选项值设为1,否则可以不设。如果希望使用多协议,比方说IPV6,那还需要设local_protocolinfo值为 1。
  • Mac OS X:如果使用 TUN模式,那么 local_interface的值要配置为tnx设备的全路径,否则就配置为tapx设备的全路径。

4.6.        其他配置

  • 用您选定的名字替换配置模版首行中的peername。这个名字不会影响会话建立,它纯粹是用于报告目的的。
  • Linux: 需要一个虚拟网卡的名称,作为local_interface 选项的值。Sigmavpn会在系统中创建一张具有您所指定名字的虚拟网卡

4.7.        保存配置并运行SigmaVPN

把配置文件保存到一个指定的地方,比方说/usr/local/etc/sigmavpn.conf。 (/usr/local/etc/sigmavpn.conf 是sigmavpn缺省的配置文件,配置文件不是它,那么运行时需要-c 参数指定配置文件) 启动SigmaVPN: #sigmavpn -"path/to/sigmavpn.conf"

4.8.        检查网卡并分配IP

运行ifconfig 检查网卡
  • Linux: ifconfig interfacename
  • Mac OS X: ifconfig tap0 or ifconfig tun0, etc.
如果看到虚拟网卡的信息,就可以为虚拟网卡分配IP了: #ifconfig interfacename 10.8.0.1/24     激活网卡: #ifconfig interfacename up     两边都配置好之后,就可以通过虚拟IP地址PING通隧道的对端了。