Tinc VPNで作る簡易的なVirtual Private Network 1/5 (概要編)

# 概要
比較的簡単に導入出来るVPNクライアントのTincVPN。
ここ数年使っていて、ようやっとAndroidでも参加する設定が出来たので、備忘録も兼ねて構築方法をまとめてみる。
(また、利用者が増えて日本語の情報がもっと増えてほしい!)

なお、スマートフォンでのVPNの用途では、Proxy目的(セキュリティ？)のものが散見されるが。本稿はそう言った経路の話では無く、**仮想的なLANとしてのVPN** としての記載になる。
(お外からお家メディアにアクセスするためのVPN)

また、記事が長くなるため、実際の構築記事については、プラットフォーム毎に分割して記載する。

# 紹介
## 対応プラットフォーム
※macOSは持っていないのでわかりません。  

|App|Windows|Linux|Android|
|:--|:--|:--|:--|
|[TincVPN <br />(official)](https://www.tinc-vpn.org/) |XP/Vista<br />/7/8/10|Debian&nbsp;[(参&#8288;考)](https://packages.debian.org/search?keywords=tinc)<br />Ubuntu&nbsp;[(参&#8288;考)](https://packages.ubuntu.com/search?keywords=tinc)<br />CentOS&nbsp;[(参&#8288;考)](https://rpmfind.net/linux/rpm2html/search.php?query=tinc&system=EPEL)<br />Fedora&nbsp;[(参&#8288;考)](https://rpmfind.net/linux/rpm2html/search.php?query=tinc&system=Fedora)<br />...etc...|n/a|
|[TincApp](https://tincapp.pacien.org/)|n/a|n/a|root不要<br />[F-Droid](https://f-droid.org/packages/org.pacien.tincapp/)<br />[Google&nbsp;Play&nbsp;(donate)](https://play.google.com/store/apps/details?id=org.pacien.tincapp) <br />APK配布もあり|
|~~[Tinc&nbsp;GUI](http://tinc_gui.poirsouille.org/)~~|n/a|n/a|要ROOT？<br />2016年から更新が止まっている|

※Redhad系の場合EPELでSRPMが入手可能のため、
　パッケージ マネージャーでCPUアーキテクチャに合ったものが見つからなくても、
　自身でRPMをbuildしてインストールする方法もある。

## Tincの特徴・利点
1. サービス起動可能
    * Windows - サービスにインストール可能。  
      ※休止からの復帰に失敗することがあり。  
      (ただしタスクスケジューラーを活用して復帰可)。
    * Linux - Systemdで普通に。
    * Android - Android 7以降でOS設定から自動起動が可能  
      (参考) [Quickstart guides - Tinc App](https://tincapp.pacien.org/quickstart.html#automating-vpn-connections)
2. コンピューター名の解決 (NetBIOS名での名前解決) (Win、Linux)
    * Windows - VPNセグメントで名前解決が可能
    * Linux - 知識不足のため、LinuxでWindows同等の名前解決はそもそもうまく出来ていないが  
      sambaに登録した名前でWindowsからLinuxへはアクセス可能。
3. NAT traversal
    * UDPホールパンチングが実装されているらしい (未検証)
    * メッシュ ネットワークで、ノード間のP2P通信に期待ができる？ (未検証)
4. 認証ストレージ不要 (Android - TincApp)
   L2TPなどでは証明書のインストールが必要になるが、そのために認証ストレージを有効にする必要がある。 
   そして、認証ストレージを有効にするためには、画面ロックにスワイプ以外のロック設定を行っている必要がある。
   &#x20;
   VPNの為でも、『画面ロックを設定する』という判断が出来ない、私の様な人には、本項はさり気なくありがたい。
   (VPN Gateを見る限りでは、OpenVPNでも認証ストレージ不要で利用出来る？)

5. AndroidのRoot不要 (Android - TincApp)
ありがとう  

6. テザリングで接続したノードからも、VPNセグメントにアクセス可能 (Android - TincApp)
ありがとう！！！

7. DLNAも認識する
ただし、物理的な距離の壁で規定されてるレイテンシは満たせないと思うのであまり実用的では無いかも。あと、DLNAサーバーとDLNA クライアントがLANとVPN両方に参加している場合、VPNが後勝ちになって無駄な経路になってしまったりするので、使い道があるかと言われると難しい(苦笑)



# 構築
## 要点
* 全部routerモードで構築する。
  AndroidのTAPはroot不要だけどswitchモードは扱えない。また、Androidの場合は自身がrouterモードでもswitchモードのノードにはアクセス出来なかった。

* ツリー型で構成する。
  今回の例ではグローバルIPを持つノードを中心にツリー型で。

* Windowsはほぼ公式のインストール例どおり
  [Tinc VPN - Example - installing tinc on Windows 2000/XP/7/8](https://www.tinc-vpn.org/examples/windows-install/)
* セグメントを予め決める(普通)


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


# 注意
Tinc VPNはメッシュ ネットワークを構築するらしいので、恐らくはUPnPホールパンチングなどで可能な限りノード間で接続される可能性はある。しかし、その条件については未確認なため、本稿の例で設定を行った場合、ノード同士のトラフィックは、ほぼ常にルート ノードを経由する。ルート ノードのトラフィックについては十分に注意が必要。

# 感想
## 感想(1)
TincによるVPNの利用は5年ほどあり、数年前からAndroid版の検証もしていてずっと躓いていたのだけど。まさかswicthモードで構築されていたことが原因だったとは。。。とほほほ。swicthモードとrouterモードの細かい違いが分からず、既に構築済みの今の環境を変えるのに躊躇していたが。思い切って変えてみて成功出来たので良かった。これで屋内外の通信による活用方法の幅が広がった。特にスマートフォンでの屋外からのアクセスについては、SSHのPort Fordingや、Apache HTTPdのReverse Proxy、SquidのHTTP Foword Proxyなど色々作を講じて来たが、直接VPNで接続出来る様になるので、ほんと便利になりそう。  

もっとも、既に他のVPNクライアントで実現している人からすれば、  このUXはかなり遅れているのだろうけど。。。。  しかし、TincVPNの導入の容易さはとても有り難いので、コレからも発展していってほしい。

## 感想(2)
全体的にIPの情報が設定ファイルのNIC両方に同じものを  記載・設定するため、冗長感が否めない。もっと効率的な管理・運用方法があるのだろうか？:thinking:



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