整个系列分为以下几个部分:

第一部分:需求及配置

主要描述本项目的需求和软硬件配置

第二部分:tinc的安装和配置

介绍tinc在debian、openwrt下的安装、配置和基本排错

第三部分:tinc的三种模式

详细介绍tinc的三种组网模式,并论述各自的优缺点

第四部分:HA

实现tinc的高可用性

本文是第一部分。

需求

最初的需求是:允许维护人员通过互联网访问位于客户2(User2)的网络,进行远程维护。

originial requirement topology

公司办公室(corp)位于互联网和公司广域网的交界处,互联网和公司广域网的防火墙均不在我的控制范围之内,corp节点的终端仅拥有outbound访问权限,无法对外提供网络服务。那么要实现这个需求唯一可行的办法就是:首先在互联网上找一个拥有固定公网IP地址的节点(lab),然后使用vpn技术,分别在lab节点与corp节点,corp节点与User2节点之间建立两条点对点隧道,最后开启corp节点的路由转发,从而实现移动用户→lab节点→corp节点→User2节点的访问连接需求。

随后便想到,维护人员:1、有时在家(home)需要连回公司(corp)处理业务;2、在公司(corp)需经常处理客户1(User1)的网络故障;索性把这几个节点全部连起来,于是需求变成了:

  1. 实现lab、User1、User2、corp和home五个节点(内网)之间的互联。

  2. User2节点可通过corp节点访问互联网;

下图是网络拓扑图(物理视图)

vpn topology physical view

选型

接下来需要选择一个合适的解决方案。毫无疑问,需要构建一个VPN network,才能实现五个节点的互联。第一个想到的是OpenVPN,它成熟、稳定、文档丰富、社区庞大,出问题都能很快找到解决的办法,然而它有一个缺点:组网不够灵活。OpenVPN的组网类型要么是点对点,要么是spoke-and-hub(星状),像本次组网,假如各节点均具备双向访问权限,那么将corp设为中心节点,其它四个节点设为分节点,就可以实现整网的互联互通。问题恰恰就在于corp和User2,其中corp只有outbound的权限,无法成为中心节点;User2只具有inbound权限,无法成为分节点。

当然,如果非要用OpenVPN来实现也不是不可能,但是组网结构比较别扭,可将lab设为server,User1、corp和home作为client。接着,在corp和User2之间再创建一条点对点隧道。这种组网结构的配置会比较繁琐,排错困难。而且一旦lab节点宕机,则互联网用户将无法访问User2,既然采用spoke-and-hub的组网方式那么困难,那有没有一种去中心化的VPN组网呢?

有,那就是mesh VPN,tinc、ZeroRouter、hamachi、cloudVPN和socialVPN是其中的代表。经过比较,本项目选择tinc。实际上tinc的诞生已逾10年,同OpenVPN一样基于OpenSSL,不过它提供了Automatic full mesh routing[1],这个是OpenVPN所不具备的。

vpn topology logical view

上图是网络拓扑逻辑视图,tinc启动后,会自动创建一个full mesh network,无需人工接入。譬如home和corp节点,在通常情况下是无法直接创建隧道的,原因是:

  1. 我缺乏corp互联网防火墙的控制权,不能开端口映射;

  2. home用的是移动宽带,无法对其它运营商用户提供公网服务;

然而借助lab这个公网节点,corp和home之间就可以直接创建加密隧道了,后续的业务流量也直接跑在该隧道中而不需要经过lab这个桥接节点。

安全策略

因为这是一个生产环境,所以还需要考虑各个节点之间的安全访问策略。5个节点的安全要求不尽相同,User1和User2的安全性要求最高,lab次之,corp和home最低,需要定义严格的访问策略。

防火墙的默认策略为拒绝
  1. corp节点

    • 允许节点内网终端访问互联网;

    • 允许User2节点访问本节点网关的DNS服务,并通过本节点访问互联网;

  2. home节点

    • 允许终端访问lab、corp、User1和User2节点内网;

  3. lab节点

    • 允许home、corp节点内网访问lab节点内网的SSH、web服务;

    • 终端可以自由的访问User1和User2的节点内网;

  4. User1节点

    • 允许lab、corp和home内网的特定主机访问User1节点内网的SSH、web服务;

  5. User2节点

    • 允许lab、corp和home节点内网的特定主机访问节点内网的SSH、web服务;

    • 允许节点内网访问corp节点的DNS服务;

    • 允许节点内网关通过corp节点访问互联网,用于软件升级;

  6. 所有节点

    • 允许节点之间互ping。

软硬件配置

  1. lab、User1和User2均有虚拟化环境,为了方便起见,选择虚拟机(debian)作为节点网关。

  2. 考虑到噪音和能耗,选择无线路由器(支持OpenWRT固件)担任corp和home节点网关;

  3. corp节点处于整张网的中心,vpn的加解密工作颇为频繁,对设备性能要求较高,因而选择了一台MikroTik的RB450G,这个设备拥有680Mhz CPU和512M运行内存。home仅作为末梢节点接入,因而Linksys WRT54G[2]足矣。

在构建VPN之前,需先普及一下tinc的安装和使用流程


1. You can link multiple ethernet segments together to work like a single segment, allowing you to run applications and games that normally only work on a LAN over the Internet.
2. 这台设备经过改造,运行内存和存储空间都做了扩容:64M ram,16M flash