SoftLayerとVyOSでネットワークの基礎を勉強３-(OpenVPNリモートアクセス編)

# 1. はじめに
  VyOSを使ってVPNリモートアクセスを構築するには、L2TP、PPTP構成などがありますが、今回はOpenVPNを使用して構築します。
　SoftLayer上のVyOSにOpenVPNリモートアクセスの設定を行い、リモートのクライアントPCから接続します。
　VyOSのL2TP構成では、同時接続が1ユーザーのみとなっていましたがOpenVPNではこの問題がありません。
L2TPでの構築については、
SoftLayerとVyOSでネットワークの基礎を勉強２-(L2TP/IPsecリモートアクセス編)をご覧ください。
http://qiita.com/Mitsu-Murakita/items/990f0f4151a5b0485731

# 2. OpenVPNについて
オープンソース、GPLで提供されています。
WindowsやLinux、MacOSなど、いろいろなOSで利用可能。また、クライアントはiOSやAndroidでも利用できます。

OpenVPNのサイト　 https://openvpn.net/
       
# 3. 構成について
　SoftLayerTokyoロケーションにOpenVPN(VyOS)サーバを設定し、インターネット経由でクライアントPCを接続します。
 VPN接続後Cent6サーバーにSSH接続を行い、使用できることを確認します。![01.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/01.png)
![02.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/02.png)
  クライアントIPプール用にPrivate Portable IPを構成しています。
  IPプール： 10.132.42.52～10.132.42.62
 
# ４.全体の流れ
![03.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/03.png)
①鍵の作成と署名
②VyOS設定
③クライアントPCの設定
④接続確認
で作業完了です。

# ５.サーバー側、クライアント側秘密鍵・公開鍵の作成
eth0、eth1、gateway-address、ssh等の設定は省略します。
「SoftLayer仮想サーバにVyOSをインストールしました」の「9. ⑦ VyOSネットワークの設定」を参考に設定してください。
http://qiita.com/Mitsu-Murakita/items/d793250566a8e9f3562b

以降はSSH接続(TeraTerm等）できている前提で、話を進めます。

## ５-1. rootアカウントの有効化
認証局、鍵を作成するにはOSのコマンドプロンプトから実行します。
このコマンドプロンプトに入るために、VyOSの構成でrootアカウントを有効にします。
VyOSには、
・一般モード(プロンプトが＄)
・設定モード(プロンプトが＃)
がありますが、最初は一般モードになっていますので、「configure」⏎で設定モードにしてから入力します。
また、

```Command:rootアカウントの有効化
# set system login user root authentication plaintext-password rootのパスワード ⏎
# commit ⏎
# save ⏎
``` 
rootのパスワードは、このインスタンス用にSoftLayerでアサインされたrootのパスワードです。
![04.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/\04.png)
## ５-２. 認証局の構築
初回の時だけ実行し、運用中は実行しないでください。
![05.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/05.png)
① rootユーザーでログイン「su -　⏎」
② rootユーザーでログイン　パスワード入力。
③今回使用するVyOSに付属のOpenVPNプログラム類は、/usr/share/doc/openvpn/examples/easy-rsa/2.0/ディレクトリーにあります。
④varsの呼び出し、環境変数の設定
「.  ./vars ⏎」
⑤古い鍵ファイル類の消去、認証局の初期化
「./clean-all 」
⑥認証局の作成
「./build-ca ⏎」
⑦国名コード
⑧都道府県名
⑨都市名
⑩組織名。社名や団体名
⑪省略
⑫共通名
⑬省略
⑭認証局の管理者のメールアドレス

/usr/share/doc/openvpn/examples/easy-rsa/2.0/keysに以下のファイルが作成されます。
CA証明書---ca.crt
CA秘密鍵---ca.key




## ５-３. サーバー側の秘密鍵・公開鍵の作成と署名
初回の時だけ実行し、運用中は実行しないでください。
![06.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/06.png)
ここではサーバー側の鍵名称を「server」とします。
①サーバー側鍵作成
「./build-key-server server ⏎」
②国名コード
③都道府県名
④都市名
⑤組織名。社名や団体名
⑥「⏎」
⑦「⏎」
⑧メールアドレス
⑨今回チャレンジパスワードの設定は行わない。
「⏎」
⑩「⏎」
⑪「y ⏎」
⑫「y ⏎」
/usr/share/doc/openvpn/examples/easy-rsa/2.0/keysに以下のファイルが作成されます。
サーバー証明書---server.crt
サーバー秘密鍵---server.key


## ５-４. クライアント側の秘密鍵・公開鍵の作成と署名
ここではクライアント側の鍵名称を「client」とします。
必要なクライアント数分、名称を変えて繰り返します。
![07.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/07.png)
①クライアント側鍵作成
「./build-key client ⏎」
②国名コード
③都道府県名
④都市名
⑤組織名。社名や団体名
⑥「⏎」
⑦「⏎」
⑧「⏎」
⑨メールアドレス
⑩今回チャレンジパスワードの設定は行わない。
「⏎」
⑪「⏎」
⑫「y ⏎」
⑬「y ⏎」
/usr/share/doc/openvpn/examples/easy-rsa/2.0/keysに以下のファイルが作成されます。
クライアント証明書---client.crt
クライアント秘密鍵---client.key

## ５-５. DHパラメータの作成
鍵の交換に使用するDHパラメータを生成します。
![08.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/08.png)
①「./build-dh ⏎」
/usr/share/doc/openvpn/examples/easy-rsa/2.0/keysに以下のファイルが作成
dh1024.pem
## ５-６. 鍵を所定ディレクトリーへコピー
/usr/share/doc/openvpn/examples/easy-rsa/2.0/keysに以下のファイルが作成されていますので、サーバー用とクライアント用別にそれぞれコピーします。
クライアント環境は以降でセットアップしますので、その時使用します。
<サーバー用>
・ca.crt
・dh1024.pem
・server.crt
・server.key
<クライアント用>
・ca.crt
・client.crt
・client.key

ここではサーバー用のファイルを、/root配下にコピーしました。
(ちなみに、/config/auth/に保存すると、VyOSのバージョンアップ時に消されずにバージョンアップできるようです。)

# ６.VyOSの設定
 VyOSの基本設定は「５.サーバー側、クライアント側秘密鍵・公開鍵の作成」で完了しているものとして話を進めます。
 
構成で設定するのは、「OpenVPN」「NAT」です。

 ```Command:OpenVPNの設定
(01) # set interfaces openvpn vtun0 ⏎
(02) # set interfaces openvpn vtun0 mode server⏎
(03) # set interfaces openvpn vtun0 openvpn-option "--push route 10.0.0.0 255.0.0.0  --push dhcp-option DNS 10.0.80.11" ⏎
(04) # set interfaces openvpn vtun0 server client client ip 10.132.42.50 ⏎
(05) # set interfaces openvpn vtun0 server subnet 10.132.42.48/28 ⏎
(06) # set interfaces openvpn vtun0 tls ca-cert-file /root/ca.crt ⏎
(07) # set interfaces openvpn vtun0 tls cert-file /root/server.crt ⏎
(08) # set interfaces openvpn vtun0 tls dh-file /root/dh1024.pem ⏎
(09) # set interfaces openvpn vtun0 tls key-file /root/server.key ⏎
(10) # commit ⏎
(11) # save ⏎
```
※実際に入力する際は、行番号を入れないように。
(03) SoftLayer側のルート(10.0.0.0 255.0.0.0)とDNS(10.0.80.11)をpushしています。
"redirect-gateway def1"オプションを入れてもいいです。
(04)クライアントの名前は「client」で、client.crt/client.keyを使用します。
また、プライベートポータブルIPからIPを切りだして、10.132.42.50をアサインしています。
(05)サブネットはプライベートポータブルのネットワーク(10.132.42.48/28)です。
(06)CA証明書の保存場所
(07)サーバー証明書の保存場所
(08)DHファイルの保存場所
(09)サーバー秘密鍵の保存場所


ここまでの設定では、OpenVPN接続しクライアント用のIPが取得できますが、SoftLayerのDNSや、プライベートネットワーク上の他のサーバーと通信するために、NATの設定を行います。

 ```Command:NATの設定
(01) # set nat source rule 1 ⏎
(02) # set nat source rule 1 outbound-interface eth0 ⏎
(03) # set nat source rule 1 source address 10.132.42.48/28 ⏎
(04) # set nat source rule 1 translation address masquerade ⏎
(05) # commit ⏎
(06) # save ⏎
```
※実際に入力する際は、行番号を入れないように。
SourceNATを設定しています。
(02) プライベートのインターフェースはeth0
(03)source アドレスは、プライベートポータブルです
(04)マスカレードの設定にしました

これで、クライアントPCからプライベートネットワーク上の他のサーバーへPINGが通ります。

```Command:全体構成例
interfaces {
     ethernet eth0 {
         address 10.132.52.229/26
         duplex auto
         hw-id 06:64:e1:be:f5:79
         smp_affinity auto
         speed auto
     }
     ethernet eth1 {
         address 161.202.104.109/29
         duplex auto
         hw-id 06:f3:4d:9a:db:f3
         smp_affinity auto
         speed auto
     }
     loopback lo {
     }
     openvpn vtun0 {
         mode server
         openvpn-option "--push route 10.0.0.0 255.0.0.0  --push dhcp-option DNS  10.0.80.11"
         server {
             client client {
                 ip 10.132.42.50
             }
             subnet 10.132.42.48/28
         }
         tls {
             ca-cert-file /root/ca.crt
             cert-file /root/server.crt
             dh-file /root/dh1024.pem
             key-file /root/server.key
         }
     }
 }
 nat {
     source {
         rule 1 {
             outbound-interface eth0
             source {
                 address 10.132.42.48/28
             }
             translation {
                 address masquerade
             }
         }
     }
 }
 protocols {
     static {
         route 10.0.0.0/8 {
             next-hop 10.132.52.193 {
             }
         }
     }
 }
 service {
     ssh {
         port 22
     }
 }
 system {
     config-management {
         commit-revisions 20
     }
     console {
         device hvc0 {
             speed 9600
         }
         device ttyS0 {
             speed 9600
         }
     }
     gateway-address 161.202.104.105
     host-name vyos
     login {
         user root {
             authentication {
                 encrypted-password $6$Q0pf7AroZmY$MK7zWwUJdBbY4wsZ94/ZCDkSk9068 /LeYM6G.B7a.hOdHhjnAZtRNqVPkvr1obJFxFFzygEE1vINpK74vR92s.
                 plaintext-password ""
             }
             level admin
         }
         user vyos {
             authentication {
                 encrypted-password $1$4c8nA5Q/$Jdf4lZMTVMebY9d64llpE1
                 plaintext-password ""
             }
             level admin
         }
     }
     name-server 10.0.80.11
     ntp {
         server 0.pool.ntp.org {
         }
         server 1.pool.ntp.org {
         }
         server 2.pool.ntp.org {
         }
     }
     package {
         auto-sync 1
         repository community {
             components main
             distribution helium
             password ""
             url http://packages.vyos.net/vyos
             username ""
         }
     }
     syslog {
         global {
             facility all {
                 level notice
             }
             facility protocols {
                 level debug
             }
         }
     }
     time-zone UTC
 }
``` 

# 7.クライアントPCの設定
## 7-1.OpenVPNクライアントプログラムのダウンロード
OpenVPNクライアントプログラムは下記サイトより、ダウンロードしてください。
https://www.openvpn.jp/download/
![10.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/10.png)
クライアントPCがWindows10(32bit)ですので「openvpn-install-2.3.11-I601-i686.exe」を使用しました。
![09.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/09.png)

## 7-2.OpenVPNクライアントプログラムのインストール
「openvpn-install-2.3.11-I601-i686.exe」を実行。

![11.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/11.png)
「Next」

![12.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/12.png)
「I Agree」

![13.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/13.png)
「Next」

![14.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/14.png)
「Next」 
ここでは導入フォルダーを"ProgramFiles\OpenVPN"にしました。

![15.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/15.png)

![16.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/16.png)
「Next」 

![17.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/17.png)
「Finish」

## 7-3.CA証明書、クライアント証明書、クライアント秘密鍵のコピー
サーバー側で作成したca.crt、client.crt、client.keyを
”c:\Program Files\OpenVPN\config"フォルダーへコピーします。
![18.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/18.png)

## 7-2.OpenVPNクライアント設定の編集
![19.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/19.png)
「OpenVPN」起動

![21.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/21.png)
「インジケータ」のOpenVPNアイコン上で、マウス右ボタンを押し、メニューを表示

![22.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/22.png)
「設定の編集」

![23.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/23.png)
remoto "OpenVPNサーバーのパブリックIP"
ca  "CA証明書"
cert "クライアント証明書"
key "クライアント秘密鍵"
を編集し、保存。

# 8.接続確認
## 8-1.OpenVPNの接続

![24.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/24.png)
「インジケータ」のOpenVPNアイコン上で、マウス右ボタンを押し、メニューを表示⇒「接続」

![25.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/25.png)
接続中です。


![26.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/26.png)
「10.132.42.50」に接続されました。

## 8-2.PINGとSSHで確認
クライアントPCのコマンドプロンプトより、
・VyOSサーバー(10.132.52.229)
・Cent6サーバー(10.132.52.225)
に対してPINGが通る事を確認。
![27.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/27.png)

![28.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/28.png)
VyOSサーバーとの接続確認完了
![29.png](http://www.seahorse-inc.com/QIITA/OpenVPNRemortAccess/29.png)
Cent6サーバーとの接続確認完了



# 9. おわりに
実運用の際は、ファイアーウォールの設定を必ず行ってください。
また、VyOS冗長化するにはVRRPを使用しますが、OpenVPN接続が標準ではUDP接続のため、TCPにする必要があります。今後書く予定です。