You've successfully subscribed to ムえのBLOG
Great! Next, complete checkout for full access to ムえのBLOG
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.
Tinc 组网记录

Tinc 组网记录

. 6 min read

最近在给社团的几台服务器重新组网,原来用的是zerotier,不知道是什么问题,有可能是被QoS也有可能是moon的问题,经常性断连。所以我们决定换一种。

备选方案 Tinc&WireGuard&OpenVPN

基本上我有这三种备选方案。接下来讲讲我是怎么抉择的。

First Out OpenVPN

OpenVPN无论在易用性,速度,资源消耗方面都比 WireGuard 要差很多。然而对比起 Tinc 而言,虽然没有实际的测评,但是 Tinc 可以P2P的特性直接让我放弃了OpenVPN.

Why not WireGuard

WIreGuard 绝对有许多优点,它采用最先进的加密技术来提供安全的在线连接,速度特别快,内核层的连接协议,节省资源。但是在安装时让我头疼就是它在老版本系统上内核安装时层出不穷的问题。由于 WireGuard 依靠它的内核模块才能正常运行,然而作为生产环境的服务器,内核操作是比较麻烦的,非常害怕操作失误导致所有运行的服务出现问题。(我们的服务器经历了多次迁移x,在阿里云上跑着Azure内核的服务器x)所以在目前还是Ubuntu16.04 和 18.04的服务器我没有采用WireGuard(也可能我太菜了,不会配x),等什么时候UbuntuLinux 5.6+ Kernel 时我再换成 WireGuard,希望那个时候国内QoS可以少一点。

Tinc 的优点

Tinc 可以说也是内核级别的?

I really don’t quite remember what got us started, but it must have been Guus’ idea. He wrote a simple implementation (about 50 lines of C) that used the ethertap device that Linux knows of since somewhere about kernel 2.1.60. It didn’t work immediately and he improved it a bit. At this stage, the project was still simply called "vpnd".

采用的是kernel 2.1.60 中就有的ethertap  device,所以我在任何的Linux系统上几乎都可以直接用w。

它还有一个最大的优点,就是P2P自动全网状路由,无论您如何设置Tinc守护进程以相互连接,流量始终(如果可能)直接发送到目标,而不通过中间跃点。

NAT遍历,只要VPN中的一个节点允许公共IP地址上的传入连接(即使它是动态IP地址),Tinc就能够进行NAT遍历,允许对等体之间的直接通信。

对于国内来说还有一个特别的优势,它同时支持UDP,TCP。由于国内和跨境UDP容易被QoS,然而TCP做这种大流量传输容易出现问题(感谢ericdiao学长提出TCP-over-TCP问题),所以既支持TCP也支持UDP的协议就很有用了。

When this option is enabled tinc will try to establish UDP connectivity to nodes, using TCP while it determines if a node is reachable over UDP. If it is disabled, tinc always assumes a node is reachable over UDP. Note that tinc will never use UDP with nodes that have TCPOnly enabled.

Tinc 居然是先去尝试UDP连接,如果UDP不通后再尝试TCP,完美解决这个困难。

实操

我服务端使用的是Debian系,直接apt install tinc完成安装,其他系统的安装可以参考下载页面

简单上手

接下来就是在服务器上配置了。

/etc/tinc
├── net_name # 你设置的网络名称
│   ├── hosts # 存储hosts的配置
│   │   ├── host1
│   │   ├── host2
│   │   └── host3
│   ├── rsa_key.priv # 这台服务器的私钥
│   ├── subnet-down # 子网挂起脚本
│   ├── subnet-up # 子网启动脚本
│   ├── tinc-down # tinc挂起脚本
│   ├── tinc-up # tinc启动脚本
│   └── tinc.conf # tinc 配置
└── nets.boot

tinc.conf

Name = host1
LocalDiscovery = yes
Interface = tc0 # 接口名称
Port = 5000 #一个外部可访问的端口

有关其他的配置可以在Tinc Doc里找到。

tinc-up

#!/bin/sh
ip addr add 172.173.7.82/16 dev $INTERFACE
ip link set dev $INTERFACE up

tinc-down

#!/usr/bin/env bash
ip addr del 172.173.7.82/16 dev $INTERFACE
ip link set dev $INTERFACE down

写好配置文件后,需要产生密钥对

tincd -n net_name -K 4096

这一步操作完成后 hosts 目录下会产生与 tinc.conf 配置中 name 相同的文件,随后需要把这个文件复制到其他的服务器的hosts文件夹中。

启动 tinc:

systemctl start tinc@net_name

以此开启tinc的维护程序。

Advanced

Tinc定位为易于配置的服务,但是出了点问题-创建一个新节点,最低要求是:

  • 描述节点的一般配置(类型,名称)(tinc.conf);
  • 描述节点配置文件(服务的子网,公共地址)(hosts /);
  • 创建密钥;
  • 创建一个设置主机地址和相关参数的脚本(tinc-up);
  • 建议创建一个脚本,该脚本在停止(tinc-down)后清除创建的参数。

除上述内容外,在连接到现有网络时,必须获取现有主机密钥并提供自己的密钥。

即:对于第二个节点:

第二个节点

对于第三个节点:

第三节点

通过使用双向同步(例如unison),附加操作的数量增加到N,其中N是公共节点的数量。

对于Tinc的开发人员-要加入现有网络,您只需要与其中一个节点(bootnode)交换密钥。
启动服务并连接到参与者后,tinc将
获得网络拓扑,并将能够与所有成员一起使用。

但是,如果启动主机不可用,然后
重新启动了tinc ,则无法连接到虚拟网络。

所以为了维持整个子网的鲁棒性,我们需要将密钥分配给所有加入网络的节点。

原来想自己实现一个密钥分配的服务,不过我翻了一下GitHub还是找到了一个实现好的

https://github.com/reddec/tinc-boot

tinc-boot是一个自包含(除外tinc)的开源应用程序,它提供:

  • 简单创建新节点;
  • 自动连接到现有网络;
  • 默认情况下设置大多数参数;
  • 节点之间的密钥分配。

下面是它主要的工作原理。

概观

详细的可以去作者在dev.io上的博客了解。

先挖个坑,我用rust把他的这个复现一遍x

先写到这里



本站总访问量 正在加载今日诗词....