Tinc VPNの設定

2つのVPS間を結ぶVPNでIKEv2が使えないとなると一般的にはOpenVPNになりますが、今回2点間を繋ぐだけなのでシンプルなTinc VPNを使ってみました。実はTincは自宅のメッシュネットワークに乗せて使っていて1年以上使っていますが、普通のLANケーブルと同じくらいスムーズな接続ができています。この実績から今回、TincでVPS間を結んでみようということになりました。

Tincはメッシュ型VPNでクライアント・サーバ型ではないのでルーティングの設定がすこし複雑になります。設定方法は検索でもヒットするしTincのホームページにもあるので、それを参照します。

Client(moon)側

まず/etc/tinc上に作りたいVPN名のディレクトリを作ります。

例)

mkdir /etc/tinc/mynet

つぎにディレクトリに移動してつぎの3つのファイルを作ります。

cd /etc/tinc/mynet

例)tinc.conf

Name = moon
AddressFamily = ipv4
Interface = tinc0
Mode = router
ConnectTo = sun

例)tinc-up

#!/bin/sh

VPN_HOST=10.0.0.2
ip link set $INTERFACE up
ip addr add ${VPN_HOST}/24 dev $INTERFACE

tinc-down

#!/bin/sh

VPN_HOST=10.0.0.2
ip addr del ${VPN_HOST}/24 dev $INTERFACE
ip link set $INTERFACE down

実行パーミッションをつけます。

chmod +x tinc-*

次にhostsディレクトリを作ります。

mkdir -p /etc/tinc/mynet/hosts

秘密鍵を作ります。

tincd -n mynet -K4096

そうするとhostsディレクトリにClient名の公開鍵ができます。そのファイルを編集します。AddressはパグリックIPを割り当てます。同様にサーバ側も同じようにします。そして相互にhostsの中に公開鍵のファイルを入れます。

例)hosts/moon

Compression = 9
Address = 1.2.3.4
Port = 655
Subnet = 10.0.0.2/32
-----BEGIN RSA PUBLIC KEY-----

-----END RSA PUBLIC KEY-----

firewallでインターネットにアクセスできようにしてテストしてみます。

tincd -c /etc/tinc/mynet -d3

syslogをみて不具合がないかチェックします。なければ先に進めます。

接続できたらルーティングを設定します。

例)tinc-up

#!/bin/sh

ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`
REMOTE_IP=6.7.8.9
VPN_GATEWAY=10.0.0.1
VPN_HOST=10.0.0.2

ip link set $INTERFACE up
ip addr add ${VPN_HOST}/24 dev $INTERFACE
ip route add $REMOTE_IP $ORIGINAL_GATEWAY
ip route add $VPN_GATEWAY dev $INTERFACE
ip route add 0.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
ip route add 128.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
ip route add 192.168.1.0/24 via 192.168.1.1 dev eth0  # 192.168.1.0/24はClient側のネットワークです
#ip route add 10.10.0.0/24 via 192.168.1.1 dev eth0

例)tinc-down

ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`
REMOTE_IP=6.7.8.9
VPN_GATEWAY=10.0.0.1
VPN_HOST=10.0.0.2

ip route del $REMOTE_IP $ORIGINAL_GATEWAY
ip route del $VPN_GATEWAY dev $INTERFACE
ip route del 0.0.0.0/1 dev $INTERFACE
ip route del 128.0.0.0/1 dev $INTERFACE
ip route del 192.168.1.0/24 via 192.168.1.1 dev eth0
ip addr del ${VPN_HOST}/24 dev $INTERFACE
ip link set $INTERFACE down

 

Server(moon)側

サーバ(sun)側の設定をします。Subnet = 0.0.0.0/0とします。

例)/etc/tinc/mynet/hosts/sun

#Compression = 9
Address = 6.7.8.9
Port = 655
#Subnet = 10.0.0.1/32
Subnet = 0.0.0.0/0

-----BEGIN RSA PUBLIC KEY-----

-----END RSA PUBLIC KEY-----

例)tinc.conf

Name = sun
#Device = /dev/net/tun
AddressFamily = ipv4
Interface = tinc0
Mode = router
ConnectTo = moon

例)tinc-up

#!/bin/sh

ip link set $INTERFACE up
ip addr add 10.0.0.1/24 dev $INTERFACE

例)tinc-down

#!/bin/sh

ip addr del 10.0.4.241/28 dev $INTERFACE
ip link set $INTERFACE down

SNATを使ってアドレス変換をします。そして相互に立ち上げなおしてテストしてみます。

tracepath bbc.com
 1?: [LOCALHOST]                      pmtu 1500
 1:  151.101.128.81                                        0.111ms pmtu 1394
 1:  10.0.4.241                                           74.201ms 
 2:  sgssdsemi2.a2hosting.com                             73.598ms asymm  1 
 3:  be2-60.br04.sin02.pccwbtn.net                        74.286ms 
 4:  hundredge0-6-0-2.br02.hkg12.pccwbtn.net             107.420ms asymm  5 
 5:  hundredge0-6-0-2.br02.hkg12.pccwbtn.net             106.839ms 
 6:  no reply
1:151.101.128.81(California (CA) (60% confidence), United States (US) (99% confidence)
1: 10.0.4.241(TINC VPN server)
2: sgssdsemi2.a2hosting.com :103.227.177.5 (Singapore)

IPを調べるとパケットがアメリカからシンガポールに飛んでるようです。ですが 0.111msなので大阪のデータセンタからそんな短時間では到達できないので恐らくフェイクでしょう。でシンガポールリージョンまで75ms以下だから大体あっているでしょう。ちなみに日本からワシントン・ポスト紙まで223.924msで1/3程度なのでレイテンシーがだいたい距離に比例していると推察できます。

ともかく、すべてが問題なければsystemdに登録します。

sudo systemctl enable tinc@mynet
sudo systemctl start tinc

以上で設定は終わりです。

追記:Client側のfirewallの設定(参考)

ufw default deny outgoing
ufw default deny incoming
ufw allow in on eth0 from any port 22 proto tcp
#ufw allow ssh
ufw allow out on eth0 to 192.168.1.5/32 port 3306 proto tcp
ufw allow 655
ufw allow out 655
ufw allow out on tinc0 from any to any
ufw allow in on tinc0 from any to any
ufw allow in from 6.7.8.9/32
ufw allow out from 6.7.8.9/32
ufw allow from 10.0.4.0/24
ufw allow out from 10.0.4.0/24
ufw allow from 192.168.1.0/24
ufw allow in from 192.168.200.128/27