使用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.kext
和tun.kext
两个目录,如果有,则通过以下命令装载:
1
2
sudo kextload /LibraryExtensions/tap.kext
sudo kextload /LibraryExtensions/tun.kext
这时再用kextstat |grep -e tun -e tap
看,估计就有输出了,如果还是没有,则到System Preferences
-Security & Privacy
看看是否被禁止了,若是被禁止了,就强行同意即可。
安装好了tuntap和tinc,就可以开始配置,Linux和macOS下基本是一样的,创建一个目录:
1
sudo mkdir -p /etc/tinc/netname/hosts
其中netname
是自己随意设定的网络名,一旦设定,所有节点都要使用相同名字,之后在tinc的命令行中也要用到。
在/etc/tinc/netname
目录下创建tinc.conf
和tinc-up
/tinc-down
,可以参考linode的文章编写。其中所有节点中必须要至少有一个节点是有公网IP(所有其他节点都能访问到)的,其他节点就都连这个节点进行中转,照tinc的理念,其他节点一旦通过中转建立好连接后,会视情况进行点对点直连或仍然继续通过节点中转。可以有多个节点拥有公网IP并进行中转,其他节点也可以配置连接多个中转节点。
tinc-up
/tinc-down
在Linux下和macOS下的命令也许略有不同,比如我的tinc-up
在Linux下是这样的:
1
2
3
4
#!/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下则是这样的:
1
2
3
#!/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
,则创建文件名为node1
。node1
的内容主要大概是这样:
1
2
Address=my.xxx.com # 公网地址,可以是域名或IP,如果不是中转节点,可以不要这一行
Subnet=192.168.88.2 # 内网地址,可以是一个网段或一个具体IP
再之后,通过命令生成密钥:
1
sudo tincd -n netname -K4096
这个命令会生成一个RSA公钥和一个私钥,会询问密钥保存的文件路径,其中要公钥需要添加到hosts文件的末尾,可以直接指定hosts文件路径作为公钥文件路径。
最后,把所有节点上的hosts文件都互相交换,存放一个副本到所有其他节点的/etc/tinc/netname/hosts
目录下,就可以运行tinc daemon命令了:
1
sudo tincd -n netname -D -d 3
第一次运行,可以先加-D
参数,让进程放在前台运行,加-d 3
打印详细的调试日志以供出问题时查看,要杀掉该进程,不推荐直接使用kill
命令,而是提供了相应的方法:
1
sudo tincd -n netname -k
这时可以通过ifconfig
命令查看是否多了一个名字为netname
的网络连接,IP则是在tinc-up
设置的。还可以互相ping一下对方IP,没什么问题的话,几个机器应该可以当成在同一个网络里互相访问了,可以把-D
和-d 3
参数去掉:
1
sudo tincd -n netname
还是比较简单的,唯一比较麻烦的是新加一个节点的话,要在所有节点都同步添加一个hosts文件,如果修改了配置,要用命令更新:
1
sudo tincd -n netname -kHUP
用tinc替换了zerotier体验了一下,感觉不错,要是有个GUI的配置工具以及hosts目录同步功能,就完美了!