Tinc VPNで作る簡易的なVirtual Private Network 2/5 (構築編(1) ルートノードの構築 - Linux編)

# 概要
『Tinc VPNで作る簡易的なVirtual Private Network』の分割記事  
1/5 構築編(1) ルートノードの構築 - Linux編

## 各記事
* [Tinc VPNで作る簡易的なVirtual Private Network 1/5 (概要編)](https://qiita.com/libraplanet/items/c94e91ae9360a4893e73)
* [Tinc VPNで作る簡易的なVirtual Private Network 2/5 (構築編(1) ルートノードの構築 - Linux編)](https://qiita.com/libraplanet/items/98b392f52785af4c04fa)
* [Tinc VPNで作る簡易的なVirtual Private Network 3/5 (構築編(2) 子ノードの構築 - Windows編)](https://qiita.com/libraplanet/items/1c0e1678844154c8de45)
* [Tinc VPNで作る簡易的なVirtual Private Network 4/5 (構築編(3) 子ノードの構築 - Linux編)](https://qiita.com/libraplanet/items/01149f3a3ab2315d0221)
* [Tinc VPNで作る簡易的なVirtual Private Network 5/5 (構築編(4) 子ノードの構築 - Android編)](https://qiita.com/libraplanet/items/173c54a9cfcabd7b53ee)

# 構築
## 構築(0)トポロジー (共通記載)
以下のトポロジーで記載を行う。

* ネットワーク名 - myvpn #設定ファイル群を置くフォルダ名になる
* VPNのIPセグメント - 192.168.15.0/24

|Node|Name|OS|Architecture|Mode|Global&nbsp;IP<br />port<br />Domain|VPN&nbsp;IP|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|root |server|CentOS&nbsp;7  |x68_64                          |router|available<br />10655<br/>mydomain.org|192.168.15.1|
|child|client1|Windows&nbsp;10|x64                            |router|                          |192.168.15.2|
|child|client2|CentOS&nbsp;7  |armv7<br />(Raspberry&nbsp;Pi3)|router|                          |192.168.15.3|
|child|client3|Android        |arm                            |router|                          |192.168.15.4|

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/b2803e83-fe73-73c3-72e1-ae26c0e54a86.png" max-width=100%>

## 構築(1) ルートノードの構築 - Linux ★本稿
### 手順(0) ファイル構成
```
[etc]
  ├ [tinc]
  │   └ [myvpn]
  │       ├ [hosts]
  │       │   ├ server
  │       │   ├ client1 ※(別紙) 子ノードとの鍵交換で今後増えます
  │       │   ├ client2 ※(別紙) 子ノードとの鍵交換で今後増えます
  │       │   └ client3 ※(別紙) 子ノードとの鍵交換で今後増えます
  │       ├ rsa_key.priv
  │       ├ tinc.conf
  │       ├ tinc-down
  │       └ tinc-up
  │
  ├ [systemd]
  │   ├ [system]
  │   │   ├ tincd.seervice
```

### 手順(1) TincVPNのインストール

```shell_session
yum install epel-release.noarch
vi /etc/yum.repos.d/epel.repo
```

```conf:/etc/yum.repos.d/epel.repo
# EPELはデフォルト無効にしておく
[epel]
-------------------------------------------
enabled=0 # enabled=1
-------------------------------------------
[epel-debuginfo]
-------------------------------------------
enabled=0 # enabled=1
-------------------------------------------
[epel-source]
-------------------------------------------
enabled=0 # enabled=1
-------------------------------------------
```
```shell
yum --enablerepo=epel install tinc
```

### 手順(2) tinc.conf作成
```shell
mkdir -p /etc/tinc/myvpn
touch /etc/tinc/myvpn/tinc.conf
```
```conf:tinc.conf
#tinc.conf
Name = server
AutoConnect = yes
Mode = router
```

### 手順(3) 自身のホストファイルを作成
hostsフォルダ内に、
tinc.confのNameで指定した名前と同じ名前でファイルを作成する。

```shell
mkdir -p /etc/tinc/myvpn/hosts
touch /etc/tinc/myvpn/hosts/server
vi /etc/tinc/myvpn/hosts/server
```
```conf:/etc/tinc/myvpn/hosts/server
Subnet = 192.168.15.1/32
# 外部からのアクセス用アドレス。
# グローバルIPでも可
Address = mydomain.org
# 一応任意のポートで運用してみる
Port = 10655
```


### 手順(4) キーの作成
```shell
tincd -n myvpn -K4096

# 秘密鍵が生成されているのを確認する。
less /etc/tinc/myvpn/rsa_key.priv

# 公開鍵が追記されているのを確認する。
less /etc/tinc/myvpn/hosts/server
```
※公開鍵が追記された自身のホスト ファイルは後で他のノードに配布する。


### 手順(5) 起動スクリプトの作成
実行権限も忘れずに。

```shell
touch /etc/tinc/myvpn/tinc-up
chmod +100 /etc/tinc/myvpn/tinc-up
vi /etc/tinc/myvpn/tinc-up
```
```bash:/etc/tinc/myvpn/tinc-up
#!/bin/sh


# VPN上でのIP
ifconfig $INTERFACE 192.168.15.1 netmask 255.255.255.0
```


### 手順(6) 終了スクリプトの作成
実行権限も忘れずに。

```shell
touch /etc/tinc/myvpn/tinc-down
chmod +100 /etc/tinc/myvpn/tinc-down
vi /etc/tinc/myvpn/tinc-down
```
```bash:/etc/tinc/myvpn/tinc-down
#!/bin/sh


ifconfig $INTERFACE down
```

### 手順(7) 起動テスト
```shell
tincd -n myvpn -d3 -D
```

### 手順(8) サービス作成・登録・実行
```shell
touch /etc/systemd/system/tincd.service
vi /etc/systemd/system/tincd.service
```
```conf:/etc/systemd/system/tincd.service
[Unit]
Description=tinc myvpn
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/tincd -n myvpn -d3 -D
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
```
```shell
systemctl enable tincd.service
systemctl start tincd.service

# 確認
systemctl status tincd.service

# ログをリアルタイムに確認
journalctl -f -u tincd.service
```

## 構築(2) 子ノードの構築 - Windows
⇒ [Tinc VPNで作る簡易的なVirtual Private Network 3/5 (構築編(2) 子ノードの構築 - Windows編)](https://qiita.com/libraplanet/items/1c0e1678844154c8de45)

## 構築(3) 子ノードの構築 - Linux]
⇒ [Tinc VPNで作る簡易的なVirtual Private Network 4/5 (構築編(3) 子ノードの構築 - Linux編)](https://qiita.com/libraplanet/items/01149f3a3ab2315d0221)

## 構築(4) 子ノードの構築 - Android
⇒ [Tinc VPNで作る簡易的なVirtual Private Network 5/5 (構築編(4) 子ノードの構築 - Android編)](https://qiita.com/libraplanet/items/173c54a9cfcabd7b53ee)

# 謝辞
* TincVPN (official)  
  https://www.tinc-vpn.org/
* Tinc 1.0 documentation  
  https://www.tinc-vpn.org/documentation/
* Tinc 1.0 documentation - tincd(8)  
  https://www.tinc-vpn.org/documentation/tincd.8
* Tinc 1.0 documentation - tinc.conf(5)  
  https://www.tinc-vpn.org/documentation/tinc.conf.5
* TincApp (android client)  
  https://tincapp.pacien.org/
* Tinc - ArchWiki  
  https://wiki.archlinux.org/index.php/Tinc
* How to automatically start tinc on Fedora 17 | John's 'blog'  
  https://leesjohn.wordpress.com/2013/03/13/how-to-automatically-start-tinc-on-fedora-17/