図解！UbuntuでOpenVPNを使う：1. 準備

# はじめに
`Ubuntu`で`OpenVPN`を使いたくなったので，設定手順をメモしておこうと思います．

私が素人だからという理由でしかないのですが，自分で`OpenVPN`に関して調べてみても，大群が押し寄せてくるばかりで，もう頭がパンクしてしまいました(×o×)

構成が複雑だったり，説明が難しかったりで，ド素人の私は設定に相当ハマりまして...^^;

情報が分散していたり，ある手順が抜けていたりするので，複数の文献やサイトを見ながら自分で必要な項目だけを抽出していく作業に相当な時間を要してしまいました^^;

私のオツムが足りないだけなのですが…

そんな経験をした私自身が，世の中の同じような悩みをもつ方にとって少しでも参考になればと，ステップバイステップの記事を書くことにしました．

各作業の位置づけを把握できるように，随時関連イラストを挿入するようにしました．

私同じような初心者の境遇の方にとって，少しでも参考になればと思います^^

![openvpntech_logo.png](https://qiita-image-store.s3.amazonaws.com/0/110138/fd9bca2d-a8e7-a627-e496-5dc62025b06d.png)

# 図解！UbuntuでOpenVPNを使う：目次
1. ***準備　←　イマココ***
  2. VPNの接続方式
  1. `OpenVPN` のインストール
  2. ファイアウォール設定
  2. VPNサーバ側のルータのグローバルIP確認
  3. ルータからVPNサーバへのポートフォワード設定
2. [証明書と認証鍵の作成](http://qiita.com/MoriKen/items/50d226e8c6395487c0a6)
  1. 簡易認証局(`easy-rsa`)関連
  2. VPNサーバ関連
  3. VPNクライアント関連
3. [設定](http://qiita.com/MoriKen/items/75587fd862b3ce93e4eb)
  2. `OpenVPN` サーバ設定  
  3. `OpenVPN` クライアント設定
4. [接続確認](http://qiita.com/MoriKen/items/682d31496fd0d2476af7)
  5. `OpenVPN`の起動
  6. 仮想`tun`デバイスの確認
  6. `ping` 確認
  7. `netcat` 確認

# 環境
- OS: VPNサーバ/クライアント共に Ubuntu 14.04
- VPNアプリケーション：OpenVPN 2.3.2 

# システム構成
以下のようなシステム構成でVPN接続することを目指します．

![01_システム構成.png](https://qiita-image-store.s3.amazonaws.com/0/110138/9ebfb457-309c-e657-1fa2-4d278c77e11a.png)

それぞれ必要となったときに説明するので，まずはこんなもんかという感じで先に進みます．

# 1. VPN接続方法
VPN を構成する方式は大きく分けて2つあります．ルーティング方式と，ブリッジ方式です．今回は1対1を目指すので，ルーティング方式で行きます．

## ルーティング方式

- 構成図

> ![routing_explanation.jpg](https://qiita-image-store.s3.amazonaws.com/0/110138/cd21271d-1c50-5fa5-868b-1e35065c05de.jpeg)

>   - 出典：[ケイズプロダクション，OpenVPNで構築する超簡単VPN入門，ラトルズ，2006.](http://www.amazon.co.jp/OpenVPN%E3%81%A7%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E8%B6%85%E7%B0%A1%E5%8D%98VPN%E5%85%A5%E9%96%80%E2%80%95Windows-Mac-OS-X-Linux%E5%AF%BE%E5%BF%9C/dp/4899771673)

- 特長
  - 1(クライアント)対1(サーバ)でよければ設定は簡単．
  - 1対多(サーバ+同一ネットワーク内端末)だと，ちょっと大変．上図だと，ホストAとホストBは直接接続できない．サーバでルーティング設定が必要．
  - クライアントには，サーバ側ネットワークのローカルIP(例:192.168.11.x)と別ドメインのIP(10.0.8.x)が振られる．
  - ネットワーク層トンネリングをするので，TCP/IPしか使えない．

## ブリッジ方式
- 構成図

> ![bridge_explanation.jpg](https://qiita-image-store.s3.amazonaws.com/0/110138/ac2578a1-d688-b516-64a0-8cd6aec3b681.jpeg)

> - 出典：[ケイズプロダクション，OpenVPNで構築する超簡単VPN入門，ラトルズ，2006.](http://www.amazon.co.jp/OpenVPN%E3%81%A7%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E8%B6%85%E7%B0%A1%E5%8D%98VPN%E5%85%A5%E9%96%80%E2%80%95Windows-Mac-OS-X-Linux%E5%AF%BE%E5%BF%9C/dp/4899771673)


- 特長
  - 1対多に対応している．ホストAとホストBが直接接続できる．
  - サーバ側でブリッジ接続の設定が必須．こいつがょっと面倒．
  - クライアントには，サーバ側ネットワークのローカルIP(例:192.168.11.x)と同一ドメインのIPが振られる．
  - データリンク層でトンネリングするので，NetBEUIも使えるらしい．

## 参考リンク
  - [Gentoo Linuxな生活​/OpenVPNで悩む](http://femt.ddo.jp/modules/xpwiki/?Gentoo%20Linux%E3%81%AA%E7%94%9F%E6%B4%BB%2FOpenVPN%E3%81%A7%E6%82%A9%E3%82%80)
  - [Setup OpenVPN server TAP behind an ASA](http://www.supinfo.com/articles/single/183-setup-openvpn-server-tap-behind-an-asa) :`tap`と`br0`関係が簡潔に書かれている．
  - [OpenVPN 2.0 Ethernet Bridging 日本語訳](http://freescitech.net/2/ovpn2_ether_ja.html):冒頭の説明が分かりやすい．
  - [OpenVPNで拠点間L2接続](http://qiita.com/ma2shita/items/3ccb5336470676b8558e):`tap`，`br0`，`eth`と、LAN、WANの関係が明確で非常に分かりやすい．
 ![openvpn_bridge_good_chart.png](https://qiita-image-store.s3.amazonaws.com/0/110138/2f34b3f7-fd6b-319a-e393-903cc37b93f0.png)


# 2. `OpenVPN` のインストール
関連するソフトを`apt`で取得して終了です．

```bash:command
$ sudo apt-get update
$ sudo apt-get install openvpn libssl-dev openssl easy-rsa
```

# 3. ファイアウォール設定
※デフォルトだとファイアウォールは無いので，やらなくても大丈夫と思います．明示的に解放したい場合にやればOKです．

![02_ファイアウォール.png](https://qiita-image-store.s3.amazonaws.com/0/110138/634080f3-32eb-c639-2771-2b504d0f6be4.png)

- 今回の例では、以下の設定でポート開放します。
  - プロトコル: UDP
  - ポート番号: 1194
- サーバとクライアント両方でこの設定を行います。
- `gufw` というツールが便利です。

```bash
$  sudo apt-get install gufw
```

下図のような画面になるよう設定すればOKです．

![gufw_check.png](https://qiita-image-store.s3.amazonaws.com/0/110138/5d862545-07b0-beab-368a-ae6385159175.png)

# 4. VPNサーバ側のルータのグローバルIP確認

VPNサーバ側に接続されたルータのグローバルIPを確認しておきます．後でVPNクライアントから接続する際に必要となります．控えを取って置いてください.

![03_globalip_check.png](https://qiita-image-store.s3.amazonaws.com/0/110138/52c2723a-6471-0232-a993-3af635cd072b.png)

これはVPNサーバが接続しているルータの設定画面から確認するものです．

当方では`Aterm MR03LN`を使っておりまして，ブラウザからルータ（ゲートウェイ）のアドレスを入力すると下図のような管理画面からグローバルIPを確認しました．今回の例では、`192.168.179.1`です．

![04_aterm_global_ip.png](https://qiita-image-store.s3.amazonaws.com/0/110138/4eaa6b92-f13d-5434-f520-55b045876087.png)

このアドレス(仮に適当なアドレス`101.102.103.xxx`とでもしておきましょう)に向かって`ping`を打ち込んでやり，このグローバルIPが有効であることを確認します．

```bash:(command)
$ ping 101.102.103.xxx
```

ただし，ルータによっては，攻撃回避のためにデフォルトでpingが無効の場合があります^^;
※最初の最初はこれが分からなくハマりましたw

`Aterm MR03LN`のグローバルIPからping応答がないとき，管理ページから有効にできました．

![05_aterm_ping_available.png](https://qiita-image-store.s3.amazonaws.com/0/110138/337bcc69-ea76-6221-dc20-153b660d705a.png)

# 5. ルータからVPNサーバへのポートフォワード設定
VPNサーバから接続されているルータの設定画面でポートフォワードを行います．

![06_port_forward.png](https://qiita-image-store.s3.amazonaws.com/0/110138/ee3d796b-4f51-6f87-73a9-3044b489900a.png)

ルータを使用してインターネットに接続する場合，デフォルトだと全ポートが接続不可となっているので，ルータ側の設定で明示的に開放する必要があります．更に，ポートフォワードの設定がないと，ドメイン内のどれがVPNサーバかルータは判断ができません． 

> ![port_forward_explanation.jpg](https://qiita-image-store.s3.amazonaws.com/0/110138/0e186f2a-c446-732a-df9f-2e2fd4ffe76c.jpeg)

> - 出典：[ケイズプロダクション，OpenVPNで構築する超簡単VPN入門，ラトルズ，2006.](http://www.amazon.co.jp/OpenVPN%E3%81%A7%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E8%B6%85%E7%B0%A1%E5%8D%98VPN%E5%85%A5%E9%96%80%E2%80%95Windows-Mac-OS-X-Linux%E5%AF%BE%E5%BF%9C/dp/4899771673)

- ポートフォワード，ルーティング設定，などがキーワードです．ご自身のルータに合わせて設定方法を検索してみて下さい．
- 今回の例では，以下の設定でポート開放します．
  - フォワード先IP: 192.168.179.7
  - プロトコル: UDP
  - WAN側ポート番号: 1194
  - LAN側ポート番号: 1194

フォワード先のIPはサーバのローカルIPにします．当方のPCでは，下記のような表示がされたので，`192.168.179.7`としました．

```bash:(command)
$ ifconfig
```

```bash:(output)
wlan0     Link encap:イーサネット  ハードウェアアドレス hogehoge  
          inetアドレス:192.168.179.7  ブロードキャスト:192.168.179.255  マスク:255.255.255.0

```

当方は`Aterm MR03LN`を使用していたので，下記のサイトを参考に設定を行いました．
> - 参考: [Aterm MR03LN ポート開放](http://www.akakagemaru.info/port/mr03ln-portfw.html)

![07_aterm_ip_forward.png](https://qiita-image-store.s3.amazonaws.com/0/110138/ccd49699-75e3-6bbf-783d-77baf76032f7.png)

# おわりに
本題に入る前に結構準備が必要となりました．ですが，どこかが抜けていると，いざ接続！というときにうんともすんとも言ってくれず，ハマることになります^^;

その割にはあまり情報が無かったりして，結構辛かったので，ここで残しておくことにしました^^

次回の[図解！UbuntuでOpenVPNを使う：2. 証明書と認証鍵の作成](http://qiita.com/MoriKen/items/50d226e8c6395487c0a6)では，VPNの要である認証局と認証鍵の作成です．

# 参考文献
- [ケイズプロダクション，OpenVPNで構築する超簡単VPN入門，ラトルズ，2006.](http://www.amazon.co.jp/OpenVPN%E3%81%A7%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E8%B6%85%E7%B0%A1%E5%8D%98VPN%E5%85%A5%E9%96%80%E2%80%95Windows-Mac-OS-X-Linux%E5%AF%BE%E5%BF%9C/dp/4899771673)
-  [Gentoo Linuxな生活​/OpenVPNで悩む](http://femt.ddo.jp/modules/xpwiki/?Gentoo%20Linux%E3%81%AA%E7%94%9F%E6%B4%BB%2FOpenVPN%E3%81%A7%E6%82%A9%E3%82%80)
- [Setup OpenVPN server TAP behind an ASA](http://www.supinfo.com/articles/single/183-setup-openvpn-server-tap-behind-an-asa) 
- [OpenVPN 2.0 Ethernet Bridging 日本語訳](http://freescitech.net/2/ovpn2_ether_ja.html)
- [OpenVPNで拠点間L2接続](http://qiita.com/ma2shita/items/3ccb5336470676b8558e)
- [Aterm MR03LN ポート開放](http://www.akakagemaru.info/port/mr03ln-portfw.html)