Tinc VPNで作る簡易的なVirtual Private Network 4/5 (構築編(3) 子ノードの構築 - Linux編)

# 概要
『Tinc VPNで作る簡易的なVirtual Private Network』の分割記事  
4/5 構築編(4) 子ノードの構築 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
⇒ [Tinc VPNで作る簡易的なVirtual Private Network 2/5 (構築編(1) ルートノードの構築 - Linux編)](https://qiita.com/libraplanet/items/98b392f52785af4c04fa)

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


## 構築(3) 子ノードの構築 - Linux ★本稿
基本はserverと一緒。Raspberry Pi(armv7hl)の例として、yumリポジトリでTincが見つからなかったケースでの、SRPMからのビルド手順で記載。
尚SRPMビルド環境の構築手順も記載しているが。全体的には数年前に行ったためメモをもとに記載しているため、
手順不足があるかもしれないので、うまく補完してほしい。

### 手順(0) ファイル構成
```
[etc]
  ├ [tinc]
  │   └ [myvpn]
  │       ├ [hosts]
  │       │   ├ server
  │       │   └ client2
  │       ├ rsa_key.priv
  │       ├ tinc.conf
  │       ├ tinc-down
  │       └ tinc-up
  │
  ├ [systemd]
  │   ├ [system]
  │   │   ├ tincd.seervice
```

### 手順(1) SRPMビルド環境の構築

※ 不足事項はうまく補完してください。

* 対話ユーザー：root

```shell:
# ユーザー追加
useradd mockbuild
passwd mockbuild

# パスワードを入力

gpasswd -a mockbuild wheel

# rpm-build
yum install rpm-build

# rpmdevtools
yum install rpmdevtools

# yum-utils
yum install yum-utils
```
* 対話ユーザー：mockbuild

```shell:
rpmdev-setuptree

# rpmmacrosの修正
echo "%debug_package %{nil}" >> ~/.rpmmacros
echo "%dist .el7" >> ~/.rpmmacros
echo "%_unpackaged_files_terminate_build 0" >> ~/.rpmmacros
echo "%__isa_name armv7hl" >> ~/.rpmmacros
```


### 手順(2) TincVPNのビルド・インストール
* 対話ユーザー：root

```shell
# install of libraries
yum install openssl-devel lzo-devel mock
```

* 対話ユーザー：mockbuild

```shell
# build
cd ~/rpmbuild/SRPMS
wget http://ftp.riken.jp/Linux/fedora/epel/7/SRPMS/Packages/t/tinc-1.0.35-1.el7.src.rpm
rpmbuild --rebuild tinc-1.0.35-1.el7.src.rpm
```
* 対話ユーザー：root

```shell
# install
rpm -ivh /home/rpmbuild/RPMS/armv7hl/tinc-1.0.35-1.el7.armv7hl.rpm
```


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

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

```shell
mkdir -p /etc/tinc/myvpn/hosts
touch /etc/tinc/myvpn/hosts/client2
vi /etc/tinc/myvpn/hosts/client2
```
```conf:/etc/tinc/myvpn/hosts/client2
Subnet = 192.168.15.3/32
Port = 0
```

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

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

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


### 手順(6) ホスト情報の交換
serverとclient2、それぞれのhostsに入っている自身の情報をお互いに交換する。

* `/etc/tinc/myvpn/hosts/server` => `client2`へ
  (client2にとって接続先情報)
* `/etc/tinc/myvpn/hosts/client2` => `server`へ
  (Serverにとっては接続元情報)

※サーバーの接続先情報を持っていても、サーバーに公開鍵が登録されていないと接続は拒否される。

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

```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.3 netmask 255.255.255.0
```


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

```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
```

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

### 手順(10) サービス作成・登録・実行
```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
```

## 構築(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/
* SRPMを使ったパッケージのインストール - 祈れ、そして働け ～ Ora et labora  
  http://tetsuyai.hatenablog.com/entry/20120106/1325839318
* いまさら聞けないrpmbuildことはじめ - hack in 3 minutes  
  https://blog.tnmt.info/2011/04/29/rpmbuild-for-beginner/
* warning: user mockbuild does not exist – using root というエラーが出た場合の対処方法 | ウェブル  
  http://weble.org/2012/05/25/warning-user-mockbuild-does-not-exist-using-root