挖井

类库大魔王的挖井日记

挖一口属于自己的井


使用tinc构建虚拟专网

之前写过一篇文章讲如何在家里无缝访问公司网络,用的是frp的方案,但正如使用ngork一样,frp也会莫名其妙地突然不工作,而且几乎没有什么错误信息可供调查。后来知道了有zerotier这个东西,相对来说还是比较稳定的,速度也凑合,免费额度可以在一个网络中添加最多100个设备,但是流量通过别人的服务器总归有点不爽,直到最近知道了tinc这个东西,可用于创建点对点的虚拟专网。

经过近一天的折腾,终于把公司两台iMac,家里一台Linux HTPC,以及Linode东京1一台VPS用tinc连起来了。tinc的安装配置使用都非常简单,只不过网上的资料比较零散,有一些还是错的,其实只要看linode的一篇文章以及tinc的官方文档,基本能解决所有tinc相关问题。

tinc的工作方式依赖于tuntap,现在的Linux发行版基本上都已经带了tuntap驱动,所以直接从官方仓库使用相应的命令安装tinc就能工作。在macOS上则需要自己安装一个tuntaposx驱动,可以通过brew cask install tuntap进行安装,也可以自己从网上下载安装包手动安装,甚至可能直接安装一个tunnelblick都会自动装一个驱动。可以用命令行kextstat |grep -e tun -e tap 看一下是否已经安装成功,如果没有任何输出,则需要自己安装,如果用brew cask或手动安装失败报错,则看一下/Library/Extensions目录是否有tap.kexttun.kext两个目录,如果有,则通过以下命令装载:

sudo kextload /LibraryExtensions/tap.kext
sudo kextload /LibraryExtensions/tun.kext

这时再用kextstat |grep -e tun -e tap看,估计就有输出了,如果还是没有,则到System Preferences-Security & Privacy看看是否被禁止了,若是被禁止了,就强行同意即可。

安装好了tuntap和tinc,就可以开始配置,Linux和macOS下基本是一样的,创建一个目录:

sudo mkdir -p /etc/tinc/netname/hosts

其中netname是自己随意设定的网络名,一旦设定,所有节点都要使用相同名字,之后在tinc的命令行中也要用到。

/etc/tinc/netname目录下创建tinc.conftinc-up/tinc-down,可以参考linode的文章编写。其中所有节点中必须要至少有一个节点是有公网IP(所有其他节点都能访问到)的,其他节点就都连这个节点进行中转,照tinc的理念,其他节点一旦通过中转建立好连接后,会视情况进行点对点直连或仍然继续通过节点中转。可以有多个节点拥有公网IP并进行中转,其他节点也可以配置连接多个中转节点。

tinc-up/tinc-down在Linux下和macOS下的命令也许略有不同,比如我的tinc-up在Linux下是这样的:

#!/bin/sh
ip link set $INTERFACE up
ip addr add 192.168.88.3 dev $INTERFACE
ip route add 192.168.88.0/24 dev $INTERFACE

在macOS下则是这样的:

#!/bin/sh
ifconfig $INTERFACE 192.168.88.5 192.168.88.2 mtu 1500 netmask 255.255.255.0
route add -net 192.168.88.5 192.168.88.2 255.255.255.0

同样tinc-down也要使用平台相应的命令。

然后在/etc/tinc/netname/hosts目录下,创建一个与tinc.conf文件中Name项的值相同的名字的文件,比如Name = node1,则创建文件名为node1node1的内容主要大概是这样:

Address=my.xxx.com   # 公网地址,可以是域名或IP,如果不是中转节点,可以不要这一行
Subnet=192.168.88.2  # 内网地址,可以是一个网段或一个具体IP

再之后,通过命令生成密钥:

sudo tincd -n netname -K4096  

这个命令会生成一个RSA公钥和一个私钥,会询问密钥保存的文件路径,其中要公钥需要添加到hosts文件的末尾,可以直接指定hosts文件路径作为公钥文件路径。

最后,把所有节点上的hosts文件都互相交换,存放一个副本到所有其他节点的/etc/tinc/netname/hosts目录下,就可以运行tinc daemon命令了:

sudo tincd -n netname -D -d 3

第一次运行,可以先加-D参数,让进程放在前台运行,加-d 3打印详细的调试日志以供出问题时查看,要杀掉该进程,不推荐直接使用kill命令,而是提供了相应的方法:

sudo tincd -n netname -k

这时可以通过ifconfig命令查看是否多了一个名字为netname的网络连接,IP则是在tinc-up设置的。还可以互相ping一下对方IP,没什么问题的话,几个机器应该可以当成在同一个网络里互相访问了,可以把-D-d 3参数去掉:

sudo tincd -n netname

还是比较简单的,唯一比较麻烦的是新加一个节点的话,要在所有节点都同步添加一个hosts文件,如果修改了配置,要用命令更新:

sudo tincd -n netname -kHUP

用tinc替换了zerotier体验了一下,感觉不错,要是有个GUI的配置工具以及hosts目录同步功能,就完美了!

本文地址:

https://minidump.info/blog/2018/07/tinc-virtual-private-network/

上一篇

Clang on Windows for Qt

几年前也曾经试图折腾过Clang on Windows,那时候的完成度还不高,只能配合MinGW使用,而且头文件搜索路径还是源代码中硬编码的。现在完成度已经很高了,Chrome for Windows已经转而使用Clang编译。Clang官方支持2个target,分别配合MinGW和MSVC使...…

CPPOOPGPXP 全文阅读
下一篇

tinc后续

之前用tinc构建了虚拟专网,实现了在不同局域网内的机器通过tinc互相访问,但是遇到一个问题,我想从公司里访问到家里其他没有装tinc的机器,或者从家里其他没有装tinc的机器访问到公司里装了tinc的机器。经过一番简单的设置便可以达到想要的效果。家里一台HTPC装了tinc,新增IP为19...…

network 全文阅读