Tinc建立vpn

本文最后更新于:2024年9月16日 下午

服务端安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
## 进入配置目录
cd /etc/tinc/
## 网络目录名可任意,但其他节点须与服务端节点相同
sudo mkdir cloud
cd cloud/
## 目录名固定,这里存放各个节点的配置文件
sudo mkdir hosts
## 开始配置cloud
sudo vim tinc.conf
## 极简配置如下,其他配置默认
Name = tencent
Interface = vpn
## 配置tencent节点,对应tinc.conf中的Name
sudo vim hosts/tencent
## 填写公网IP和vpn节点IP,这里我使用10.0.0.1
Address = 你的公网IP
Subnet = 10.0.0.1/32
## 生成密钥,-n 网络名
sudo tincd -n cloud -K
## 编写拨号脚本,注意与Subnet中的IP相同
sudo vim tinc-up
#!/bin/bash
ifconfig $INTERFACE 10.0.0.1 netmask 255.255.255.0
## 编写断线脚本
sudo vim tinc-down
#!/bin/bash
ifconfig $INTERFACE down
## 赋予脚本执行权限
sudo chmod +x tinc-*
  • 安装完毕以后,文件及文件夹的结构是这样的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /etc/tinc—— nets.boot
    —— cloud——tinc.conf
    ——rsa_key.priv
    ——rsa_key.pub
    ——tinc-down
    ——tinc-up
    ——hosts——gcp
    ——pc
    ——school

Windows客户端安装

  • 首先下载Windows版的tinc。在安装过程三项可选,直接全选。然后指定安装目录。之后进入安装目录

  • 新建网络目录,本例为cloud

  • 进入cloud目录后,创建hosts目录

  • 在cloud目录下新建文件tinc.conf,输入如下内容

    1
    2
    3
    Name = pc
    Interface = vpn
    ConnectTo = tencent
  • 在hosts目录下新建文件pc,输入如下内容,将节点IP配置为10.0.0.2

    1
    Subnet = 10.0.0.2/32
  • 在安装目录下以管理员身份启动cmd,输入tincd -n cloud -K,生成密钥

  • 待密钥生成完毕后,获取并保存服务端hosts文件夹下的tencent文件至pc文件处,将pc文件上传至服务端的hosts文件夹下。

  • 在安装目录tap-win64下以管理员身份运行addtap.exe,安装网络适配器

  • 接着去网络中心找到类似的TAP网络适配器,修改其名称为tinc.conf中的Interface值,本例为vpn,接着右键属性设置ipv4的地址,此地址应与hosts中pc的Subnet值相同,本例为10.0.0.2

Linux客户端安装

使用apt install tinc即可。其配置与服务端的配置步骤相同。同样是确保用户具备sudo权限或是直接使用root。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
## 进入配置目录
cd /etc/tinc/
## 网络须与服务端节点相同
sudo mkdir cloud
cd cloud/
## 目录名固定,这里存放orangePi节点和服务端节点的主机文件
sudo mkdir hosts
## 开始配置cloud
sudo vim tinc.conf
## 极简配置如下,其他配置默认
## ConnectTo = 服务端节点名,本例为tencent
Name = orangePi
Interface = vpn
ConnectTo = tencent
## 配置orangePi节点,对应tinc.conf中的Name
sudo vim hosts/orangePi
## 填写orangePi节点vpn的IP,需唯一
Subnet = 10.0.0.10/32
## 生成密钥,-n 网络名
sudo tincd -n cloud -K
## 编写拨号脚本,注意与Subnet的IP相同
sudo vim tinc-up
#!/bin/bash
ifconfig $INTERFACE 10.0.0.10 netmask 255.255.255.0
## 编写断线脚本
sudo vim tinc-down
#!/bin/bash
ifconfig $INTERFACE down
## 赋予脚本执行权限
sudo chmod +x tinc-*

Padavan安装tinc

首先要加载entware环境,然后opkg install tinc

1
2
3
4
cd /opt/etc
mkdir tinc
cd tinc
mkdir cloud

文件结构和linux下的相同,但是注意生成密匙的命令不同

1
tinc -n cloud generate-keys

启动服务

  • Linux下启动tinc 需要使用命令tincd -n 网络名,故本例的启动为

    1
    tincd -n cloud
  • 若是想首先开机启动则需要使用systemctl enable tinc@网络名

    1
    systemctl enable tinc@cloud
  • Windows下需要在安装目录下以管理员身份运行cmd输入

    1
    tincd -n cloud

    如果成功会生成一个tinc.cloud的服务,服务默认是开机自动启动的

  • padavan启动较为特殊,启动、停止、重启、重新加载配置文件的方法如下:

    1
    2
    3
    4
    tinc -n cloud start
    tinc -n cloud stop
    tinc -n cloud restart
    tinc -n cloud reload

    还要在路由器开机后执行的脚本中加入

    1
    /opt/sbin/tincd -n hello

配置工具:一个脚本

可以看到很多的配置都是重复的,为了简化配置我编写了一个shell脚本可以帮助快速配置。使用简单而且Windows和Linux皆可用。按如下代码编写shell文件至指定目录,Windows为安装目录,Linux为/etc/tinc,然后执行脚本按照提示输入对应的信息即可,注意Windows需要管理员权限,Linux需要支持sudo或以root身份。以本文为例做个简单的示范:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/bash
net_name=""
node_name=""
is_client=""
mk_dir(){
while [ -z ${net_name} ]
do
read -p "Enter the network name:" net_name
net_name=$net_namesed 's/ //g'
done
mkdir $net_name
cd $net_name
mkdir 'hosts'
}
tinc_conf(){
read -p "Enter Interface Name:" interface
read -p "Enter local node name:" node_name
conf_str="Interface = ${interface} \nName = ${node_name}"
read -p "Is client node?(y/n):" is_client
if [ "$is_client" == "y" ]
then
read -p "Enter server node name:" server_name
conf_str=$conf_str"\nConnectTo = ${server_name}"
fi
echo -e $conf_str > 'tinc.conf'
}
net_conf(){
if [ "$is_client" == "y" ]
then
read -p "Enter public IP address(can be empty):" pub_ip
else
while [ -z ${pub_ip} ]
do
read -p "Enter public IP address:" pub_ip
pub_ip=$pub_ipsed 's/ //g'
done
fi
read -p "Enter local node ip:" local_ip
net_str="Subnet = ${local_ip}/32"
pub_ip=$pub_ipsed 's/ //g'
if [ -n "$pub_ip" ]
then
net_str=$net_str"\nAddress = $pub_ip"
fi
cd hosts
echo -e $net_str > $node_name
cd ..
os=`uname`
if [ `uname` = "Linux" ]
then
echo -e "#!/bin/bash\n"'ifconfig $INTERFACE '"${local_ip} netmask 255.255.255.0" > 'tinc-up'
echo -e "#!/bin/bash\n"'ifconfig $INTERFACE down' > 'tinc-down'
chmod +x tinc-*
tincd -n $net_name -K
else
./tincd -n $net_name -K
fi
}
mk_dir
tinc_conf
net_conf

脚本执行效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 输入网络名
Enter the network name:cloud
## 输入网口名
Enter Interface Name:vpn
## 输入本地节点名
Enter local node name:pc
## 是否为客户端节点
Is client node?(y/n):y
## 输入服务端节点名(上步填n则无此项)
Enter server node name:tencent
## 输入公网IP(为y时此项必填,n可以直接回车)
Enter public IP address(can be empty):
## 输入本节点的IP
Enter local node ip:10.0.0.2

之后就会完成配置,注意这个脚本仅用于自动完成配置,不会启动服务,所以还需与服务端交换host文件和步骤5,Windows下仍要配置ip(部分条件下需要手动生成密钥)

使用感受

1.中途遇到好多的坑,比如文件配置修改以后,需要重启tinc服务

2.晚高峰期间的速度基本可以接受

3.将两个vps同时作为服务端的文件配置,目前还没有搞定

致敬原文作者

https://wuzk.tk/2018/09/13/2018/20180913/ https://chanix.github.io/TincCookbook/ http://www.lucktu.com/archives/763-3.html


Tinc建立vpn
https://andyppang.github.io/2020/10/21/Tinc建立Vpn/
作者
PL
发布于
2020年10月21日
许可协议