How to set up tinc vpn

  • 本文適用於 UbuntuMacOS
  • 範例使用版本為 1.1pre17,參考 Tinc

安裝必要元件

1
sudo apt-get install -y build-essential libncurses5-dev libreadline6-dev libzlcore-dev zlib1g-dev liblzo2-dev libssl-dev

安裝 Tinc

手動安裝

下載原始碼

1
wget -qO- https://www.tinc-vpn.org/packages/${tincVersion}.tar.gz | tar zxv

編譯

1
cd tinc-1.1pre17 && ./configure && make

安裝

1
sudo make install

透過 Brew 安裝

1
2
brew install tinc
brew cask install tuntap

Brew上沒有 tinc-pre 版本

檢查

1
sudo tinc version

設定 Tinc

事前準備

創建預設目錄

1
2
sudo mkdir -p /usr/local/var/run/
sudo mkdir -p /usr/local/etc/tinc/

初始化 Tinc 設定

Tinc 使用 RSA 的方式進行認證,所以要先建立公私鑰。
Tinc 可以建立多個連線,所以要先給定一個能夠辨識的連線名稱,並且給此台電腦一個名字和虛擬 IP 位置。

var description
netName 能夠辨識連線的名稱
hostname 此台電腦的名稱
vpnSubnet 此台電腦的虛擬 IP
address 此台電腦的公開 IP
1
2
3
4
5
6
7
8
9
netName=changeme
hostname=changeme
vpnSubnet=changeme
address=changeme

sudo tinc -n ${netName} init ${hostname}
sudo tinc -n ${netName} add Subnet ${vpnSubnet}/32
sudo tinc -n ${netName} add Address ${address}
sudo chmod +x tinc-*

todo

hosts 資料夾中會放有各個伺服器的公開資訊,如:SubnetPublic KeyAddressPort 等。
當建立好基本設定後,可以看到目錄結構如下。

1
2
3
4
5
6
7
8
9
$ tree /usr/local/etc/tinc/${netName}
/usr/local/etc/tinc/${netName}
├── ed25519_key.priv
├── hosts
│   └── ${hostname} # 此台電腦公開的資訊
├── rsa_key.priv # 此台電腦的私鑰
├── tinc.conf # tinc 所以用的配置
├── tinc-down # 停止 tinc 時會執行的腳本
└── tinc-up # 啟動 tinc 時會執行的腳本
1
2
3
4
5
6
7
8
9
10
Name = ${hostname}
AddressFamily = ipv4

# interface 可以不指定,如果 不指定會自動建立一個與 netName 相同名字的 interface
# Interface = tun0

# pre版才可以設定自動連線,如果開啟自動連線的話,ConnectTo 則會失效
# 如果不想自動連線,一樣可以使用 ConnectTo 指定 server
AutoConnect = yes
# ConnectTo = another-server
1
2
3
#!/bin/sh
# 記得改掉 vpnSubnet
ifconfig $INTERFACE ${vpnSubnet} netmask 255.255.255.0
1
2
3
#!/bin/sh
#just bring down the interface. leave it as it is
ifconfig $INTERFACE down

交換 hosts

serverclient 端必須擁有彼此的資訊,並且放在 hosts 資料夾底下。
善用 rsyncscp

此步驟相當重要

設定自動啟動

Linux

建立 tinc.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo cat <<EOF > /lib/systemd/system/tinc.service
[Unit]
Description=Tinc VPN
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecReload=/bin/true
WorkingDirectory=/usr/local/etc/tinc

[Install]
WantedBy=multi-user.target
EOF

建立 [email protected]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sudo cat <<EOF > /lib/systemd/system/[email protected]
[Unit]
Description=Tinc net %i
PartOf=tinc.service
ReloadPropagatedFrom=tinc.service

[Service]
Type=simple
WorkingDirectory=/usr/local/etc/tinc/%i
ExecStart=/usr/local/sbin/tincd -n %i -D
ExecReload=/usr/local/sbin/tincd -n %i -kHUP
KillMode=mixed
TimeoutStopSec=5
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target
EOF

啟動服務

1
sudo systemctl enable --now tinc@${netName}.service

Mac

複製貼上懶人包

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
tincVersion=tinc-1.1pre17
netName=changeme
hostname=changeme
vpnSubnet=changeme

sudo apt-get install -y build-essential libncurses5-dev libreadline6-dev libzlcore-dev zlib1g-dev liblzo2-dev libssl-dev

wget -qO- https://www.tinc-vpn.org/packages/${tincVersion}.tar.gz | tar zxv
cd ${tincVersion} && ./configure && make && sudo make install

sudo mkdir -p /usr/local/var/run/
sudo mkdir -p /usr/local/etc/tinc/

sudo tinc -n ${netName} init ${hostname}
sudo tinc -n ${netName} add Subnet ${vpnSubnet}/32
sudo chmod +x tinc-*
sudo sh -c "echo ifconfig $INTERFACE ${vpnSubnet} netmask 255.255.255.0 > /usr/local/etc/tinc/${netName}/tinc-up"

sudo sh -c "cat <<EOF > /lib/systemd/system/tinc.service
[Unit]
Description=Tinc VPN
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecReload=/bin/true
WorkingDirectory=/usr/local/etc/tinc

[Install]
WantedBy=multi-user.target
EOF"

sudo sh -c "cat <<EOF > /lib/systemd/system/[email protected]
[Unit]
Description=Tinc net %i
PartOf=tinc.service
ReloadPropagatedFrom=tinc.service

[Service]
Type=simple
WorkingDirectory=/usr/local/etc/tinc/%i
ExecStart=/usr/local/sbin/tincd -n %i -D
ExecReload=/usr/local/sbin/tincd -n %i -kHUP
KillMode=mixed
TimeoutStopSec=5
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target
EOF"

sudo systemctl enable --now tinc@${netName}.service

todo

使用 Tinc

TincTinc-pre 的指令略微不同,斟酌使用。

啟動

1
sudo tinc -n ${netName} start
1
sudo tincd -n ${netName} -D

停止

1
sudo tinc -n ${netName} stop
1
sudo tincd -n ${netName} -k

測試

啟動成功後,會看到相對應的interface

1
2
3
4
5
6
7
8
9
$ ifconfig ${netName}
${netName}: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.36.205.13 netmask 255.255.255.0 destination 10.36.205.13
inet6 fe80::5cf0:a5b4:3e5c:2e67 prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
RX packets 243089132 bytes 66121117371 (66.1 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 249144121 bytes 75720457202 (75.7 GB)
TX errors 0 dropped 2067 overruns 0 carrier 0 collisions 0