avatar
@bangbang93

用tinc搭建p2p vpn

3/17/2017, 9:22:11 PM

0x00 需求

计划恢复炉心工艺的fmc.moe域名正常使用,但是moe域名没法备案,数据库在国内服务器上,不太想搬,于是只好把域名解析到国外服务器上,然后再反代回国。

但是同域名反代还是会遇到备案被拦截问题,于是就需要走加密协议传输或者干脆起跨机房内网

但是我有很多台服务器,而且几乎都是跨机房的,从ucloud到阿里云,墙外有hostker和conoha,如果用普通的vpn解决方案,所有流量都得有一台服务器中转,延迟就会几乎*2,非常糟心,于是就需要一个靠谱的p2p vpn方案。

0x01 选型

openvpn

openvpn自带p2p模式,但是openvpn的p2p模式一个守护进程只能连接一对服务器和客户端,我有5台服务器,我要让他们之间互相连接,我就需要在每台机上维护4个实例,这事太难受了,抛弃

ZeroTier

要钱,免费版的功能看上去好像够用,但是我也暂时还没测试,等以后有空再试

tinc

免费开源,但是配置有点麻烦,使用tun设备,效率比ZeroTier要高

0x02 部署

第一个节点

epel中有tinc,直接yum install tinc就可以完成安装

安装完成后,配置目录/etc/tinc需要手工mkdir

然后在/etc/tinc中新建一个和网络同名的目录,符合文件名称的范围内可以随意起名,我这里以dock为例

创建并编辑文件/etc/tinc/dock/tinc.conf

Name=core
Interface=dock  
Mode=switch
Port=1190
PrivateKeyFile=/etc/tinc/dock/rsa_key.priv

第一行是当前节点的名称
第二行是网卡名

其余的可以自行查阅文档https://www.tinc-vpn.org/documentation/Main-configuration-variables.html#Main-configuration-variables

然后创建并编辑文件/etc/tinc/dock/hosts/core,文件名同上面的节点名

Compression=9  
Subnet=192.168.0.1/32  
Address=core.933.moe
Port=1190

/etc/tinc/dock/tinc-up,需要执行权限,可以直接755

#!/bin/sh
ifconfig $INTERFACE 192.168.0.1 netmask 255.255.255.0

/etc/tinc/dock/tinc-down,需要执行权限,可以直接755

#!/bin/sh 
ifconfig $INTERFACE down  

文件都就绪后,就可以执行tincd -n dock -K生成公钥和私钥了,私钥会被放置到/etc/tinc/dock/rsa_key.priv,公钥会被附加到刚才写的节点配置文件中

第二个节点

第二个节点大同小异,毕竟是p2p协议,节点之间都是同等级的,只需要在/etc/tinc/dock/tinc.conf中添加需要连接的服务器,写成

Name=sd
ConnectTo=core
ConnectTo=hostker
Interfce=dock  
Mode=switch  
Port=1190
PrivateKeyFile=/etc/tinc/dock/rsa_key.priv

多个ConnectTo就会连接多个服务器,没有直接建立连接的服务器会由其他服务器中转数据

第二个节点配置好后,需要把第二个节点的配置文件传给第一个节点,并且把第一个节点的配置文件发给第二个节点,此后每次增加节点都需要同步互相之间有连接的节点。

0x03 测试

tincd -n dock -D可以让tincd直接运行,而不fork进程,方便查看日志,确定两边能够正常连接后,可以继续添加更多节点了

0x04 运行

centos 7下可以用systemctl start tinc@dock运行,centos6下只能手工写init.d文件或者用tincd -n dock,停服务靠pkill tincd的方式了

0x05 引用

本文基于http://www.rendoumi.com/ling-wai-yi-chong-vpnfang-shi-tinc/