嵌入式 轻量级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 -c "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通隧道的对端了。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮