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

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

## 各記事
* [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]
⇒ [Tinc VPNで作る簡易的なVirtual Private Network 4/5 (構築編(3) 子ノードの構築 - Linux編)](https://qiita.com/libraplanet/items/01149f3a3ab2315d0221)

## 構築(4) 子ノードの構築 - Android ★本稿

### 手順(0) ファイル構成
基本的には他のプラットフォームと一緒。ネットワーク設定はスクリプトではなく、 `network.conf` に記載する。  
鍵の生成などもあるため、PCでファイル群を作ってそのまま端末にコピーする。  

```
[/本体/Android/data/org.pacien.tincapp]
  ├ [cache]
  │   ├ tinc.myvpn.log      #アプリを実行すると生成されるログ
  │   └ tincapp.log         #アプリを実行すると生成されるログ
  ├ [files]
  │   └ [myvpn]
  │       ├ [hosts]
  │       │   ├ server
  │       │   └ client3
  │       ├ network.conf
  │       ├ rsa_key.priv
  │       └ tinc.conf
```


### 手順(1) tinc.conf作成 (※PCで作業。Linux例)
Andsoidで作成は出来ないので、PCで作業。  
ネットワーク名は作業にダミーのフォルダを作って行う。  

```shell
mkdir -p /etc/tinc/dummy_vpn
touch /etc/tinc/dummy_vpn/tinc.conf
```
```conf:/etc/tinc/dummy_vpn/tinc.conf
#tinc.conf
Name = client3
AutoConnect = yes
Mode = router
ConnectTo = server
```

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

```shell
mkdir -p /etc/tinc/dummy_vpn/hosts
touch /etc/tinc/dummy_vpn/hosts/client3
vi /etc/tinc/dummy_vpn/hosts/client3
```
```conf:/etc/tinc/dummy_vpn/hosts/client3
Subnet = 192.168.15.4/32
Port = 0
```

### 手順(3) キーの作成 (※PCで作業。Linux例)
```shell
tincd -n myvpn_tmp -K4096

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

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


### 手順(4) ホスト情報の交換 (※PCで作業。Linux例)
serverとclient3、それぞれのhostsに入っている自身の情報をお互いに交換する。

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

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

### 手順(5) ネットワーク設定ファイルの作成 (※PCで作業。Linux例)
```shell
touch /etc/tinc/dummy_vpn/network.conf
vi /etc/tinc/dummy_vpn/tinc-up
```
```conf:/etc/tinc/dummy_vpn/network.conf
# VPN上でのIPを記載
Address = 192.168.15.4/32
Route = 192.168.15.0/24
AllowBypass = on
```

### 手順(6) Android端末にTincAppのインストール
入手先
* [TincApp](https://tincapp.pacien.org/) APK配布あり
* [F-Droid](https://f-droid.org/packages/org.pacien.tincapp/)
* [Google Play (donate)](https://play.google.com/store/apps/details?id=org.pacien.tincapp)



### 手順(7) Android端末に設定ファイルをコピー
PCで作業したファイル・フォルダ構成をAndroid端末にコピーする。

* `/etc/tinc/dummy_vpn/*` => `Android端末` の `/本体/Android/data/org.pacien.tincapp/files/myvpn/*` へ  
※フォルダが無ければ作成する。

### 手順(8) 起動
Tinc Appアプリを起動すると、コピーしたフォルダ名が一覧にあるので、タップすると接続される。接続後にNODESタブで他のノードも認識され、IPでアクセス可能になる。  
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/c2f62b4b-b850-1189-76b9-7c41a37b4fc3.png)

# 補足
VPNが有効になっているとGoogle Playがダウンロードの待機から先に進まなくなるっぽい
なのでandroidでの常時VPN有効化は割と課題がありそうです。
(OS視点では『盗聴されている可能性がある』扱いですし、なんぞー)

# 謝辞
* 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/