/**
 * Filename:    stdrc.cc
 * Description: 一只腊鸡的技术成长。
 * Author:      Richard Chien
 * Powered By:  PurePress & Light
 */

#include <stdrc.hh>

rc::blog

使用 Tinc 组建虚拟局域网

创建于
分类:Ops
标签:TincVPNSDN网络虚拟局域网

以前曾经用过 ZeroTier 给自己多个分布在不同地方的设备组建大内网,后来用不着了,就没再折腾,前段时间又想重新组一下网,于是尝试了一下另一个同类的开源软件 Tinc。本文记录一下使用 Tinc 搭建虚拟网的关键步骤。

安装

Ubuntu/Debian 上直接 apt-get install tinc 安装,其它系统可以网上搜索,基本默认包管理器都可以直接安装。

节点结构

首先想好网络中的节点要如何相连,以三个节点、其中一个有公网 IP 为例,如下图,node2node3 需要主动连接到 node1,从而交换相关元信息,并在 node1 的辅助下建立连接。

目录结构

在每个节点上创建如下目录结构:

/etc/tinc
└── mynet
    ├── hosts
    │   ├── .
    │   └── ..
    ├── .
    ├── ..

这里 mynet 是网络的名字,可以随意。mynet 目录里创建一个 hosts 子目录。

编写配置文件和启动脚本

在三个节点上分别编写配置文件和启动脚本。

node1

/etc/tinc/mynet/tinc.conf

Name = node1
Interface = tinc # ip link 或 ifconfig 中显示的接口名,下同
Mode = switch
Cipher = aes-256-cbc
Digest = sha512

/etc/tinc/mynet/tinc-up(需可执行,以使用 ifconfig 为例):

#!/bin/sh
ifconfig $INTERFACE 172.30.0.1 netmask 255.255.255.0 # IP 根据需要设置,下同

/etc/tinc/mynet/tinc-down(需可执行,以使用 ifconfig 为例):

#!/bin/sh
ifconfig $INTERFACE down

node2

/etc/tinc/mynet/tinc.conf

Name = node2
Interface = tinc
Mode = switch
ConnectTo = node1
Cipher = aes-256-cbc
Digest = sha512

/etc/tinc/mynet/tinc-up(需可执行,以使用 iproute 为例):

#!/bin/sh
ip link set $INTERFACE up
ip addr add 172.30.0.2/24 dev $INTERFACE
ip route replace 172.30.0.0/24 via 172.30.0.1 dev $INTERFACE

/etc/tinc/mynet/tinc-down(需可执行,以使用 iproute 为例):

#!/bin/sh
ip link set $INTERFACE down

node3

基本和 node2 相同,除了 Name = node3 以及 IP 不同。

生成 RSA 密钥对

在每个节点上执行下面命令来生成节点的公私钥:

tincd -n mynet -K 4096

私钥默认保存在 /etc/tinc/mynet/rsa_key.priv,公钥在 /etc/tinc/mynet/hosts/<node-name>,这里 <node-name> 在每个节点上分别是 node1node2node3(Tinc 能够从 tinc.conf 中知道当前节点名)。

交换密钥

node2node3/etc/tinc/mynet/hosts/node2/etc/tinc/mynet/hosts/node3 拷贝到 node1 上的 /etc/tinc/mynet/hosts 中,此时 node1 目录结构如下:

/etc/tinc
└── mynet
    ├── hosts
    │   ├── node1
    │   ├── node2
    │   └── node3
    ├── rsa_key.priv
    ├── tinc.conf
    ├── tinc-down
    └── tinc-up

node1/etc/tinc/mynet/hosts/node1 拷贝到 node2node3,并在该文件开头加上一行:

Address = 1.2.3.4 # node1 的公网 IP

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

此时 node2 的目录结构如下:

/etc/tinc
└── mynet
    ├── hosts
    │   ├── node1 # 包含 node1 的 Address
    │   ├── node2
    ├── rsa_key.priv
    ├── tinc.conf
    ├── tinc-down
    └── tinc-up

node3node2 类似。

启动 Tinc

在每个节点上分别使用下面命令测试运行:

tincd -D -n mynet

该命令会在前台运行 Tinc,之后即可使用配置文件中配置的 IP 互相访问。

测试成功后可以杀掉刚刚运行的 tincd 进程,改用 systemctl 运行并开机自启动:

systemctl start tinc@mynet
systemctl enable tinc@mynet

参考资料

评论