VyOSでプライベートIPの自宅ネットワークにリモートアクセスしたい！(OpenVPN編)

**(2017/8/18)最後の`(おまけ2)OpenVPN上でOSPFの経路交換を動作させる`は動作が安定しなかったので、Staticによる経路交換を行うようにしてください**

我が家はマンション専用プロバイダと契約していることもあり、DHCPでプライベートIPアドレス(10.XXX.YYY.ZZZ/22)がマンション側で管理している機器から振ってくる。そのため、外部から自宅にリモートアクセスするには別のグローバルIPがもらえるプロバイダとの契約しかないと思っていた。
しかし、その打開策を考えたので今回はそのネットワーク環境を構築していく。

#ネットワーク図
![自宅VPN_ネットワーク図.jpg](https://qiita-image-store.s3.amazonaws.com/0/161771/83cebe87-11c4-2f17-25b6-1a84113d3332.jpeg)
簡単な説明としては、さくらクラウドにVyOS(グローバルIP付き)を一台立てて、それと自宅のVyOSをVPN(OpenVPN)で接続する。また、外部から接続する場合は、さくらクラウドのVyOSにVPN(L2TP over IPsec)で接続する。これによって、リモートでのSSHアクセス等が可能になる。
その構築を「環境構築編」,「OpenVPN編」,「L2TP over IPsec編」と3つの記事で説明する。

* [環境構築編](http://qiita.com/nl0_blu/items/3094785d6234c47da911)
* [OpenVPN編](http://qiita.com/nl0_blu/items/03257d48e5dbda57c1c0)
* [L2TP over IPsec編](http://qiita.com/nl0_blu/items/90188adbadc8600d08a5)

# OpenVPN編
今回は、前回の[環境構築編](http://qiita.com/nl0_blu/items/3094785d6234c47da911)に続き、自宅VyOSとさくらクラウドVyOS間をOpenVPNで繋ぐ方法を書いていきます。
[https://wiki.vyos.net/wiki/OpenVPN](https://wiki.vyos.net/wiki/OpenVPN)を参考にしていて、本記事はこれを見れば必要ないというくらいです。汗

ちなみにVPNにOpenVPNを選定した理由としては、L2TP over IPsecより高速であること(噂)、VyOSのConfig的にOpenVPN上でOSPFを簡単に張ったりできそうだったためである。

VyOSの各VPN(L2TP over IPsec,OpenVPN,PPTP?)には、site to siteという拠点間接続用のConfigができるが、今回は自宅VyOSがプライベートIPしかないというデス環境なので、これは行わない。

# 認証局,鍵,DHパラメータの作成等

## さくらクラウドのVyOS(Server側)

さくらクラウドのVyOSはOpenVPNの`server`として動作させる。


vyosにログイン後、sudo環境での作業を楽にするためにrootアカウントの有効化をします。

```
# 設定モードに入る
configure

# rootパスワード設定
set system login user root authentication plaintext-password rootのパスワード 

# 変更のコミットおよび設定保存
commit 
save 
```

rootユーザでログインする

```
$ su -
[設定したrootパスワードの入力]
```

* OpenVPN環境変数の設定

```
$ cp -rv /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /config/easy-rsa2-my
$ cd /config/easy-rsa2-my
$ vi vars
(以下の部分を各自の環境に編集)
export KEY_COUNTRY="US" ←サーバーの所在国を指定(日本なら"JP")
export KEY_PROVINCE="CA" ←サーバーの所在地(都道府県)を設定(東京なら"Tokyo")
export KEY_CITY="SanFrancisco" ←サーバーの所在地(市区町村)を設定(秋葉原なら"Akihabara")
export KEY_ORG="Fort-Funston" ←サーバーの所有団体の設定(例.hogehoge.com)
export KEY_EMAIL="me@myhost.mydomain" ←サーバーの所有者のE-mailアドレス(例.root@hogehoge.com)
~
```

編集後、OpenVPN環境変数の設定ファイルの反映を行う。

```
$ source vars
```

* 認証局,鍵,DHパラメータファイルの初期化(初回のみ)

```
$ ./clean-all
```

~以降のShellはEnterゲーです~
shell実行後は、入力を求められたらEnterです。
[y/n]を求められたらyです。
[openvpn.jpのHow to](https://www.openvpn.jp/document/how-to/#CertificateAuthority)を読むと設定の詳細が理解できるかと思います。

* 認証局の証明書・鍵作成

```
$ ./build-ca
```

* サーバー側の証明書・鍵作成

```
$ ./build-key-server server
```

* クライアント側の証明書・鍵作成

```
$ ./build-key client
```

* DHパラメータの作成

```
$ ./build-dh
```


* 作成されたサーバー関係のファイル(ca.crt,dh1024.pem,server.key,server.crt)を**さくらクラウドのVyOS**のディレクトリにコピーする

```
$ mkdir /config/auth/ovpn
$ cp keys/ca.crt /config/auth/ovpn/
$ cp keys/dh1024.pem /config/auth/ovpn/
$ cp keys/server.key /config/auth/ovpn/
$ cp keys/server.crt /config/auth/ovpn/
```

## 自宅のVyOS(Client側)

自宅のVyOSはOpenVPNの`client`として動作させる。

* さくらクラウドのVyOSで作成されたクライアント関係のファイル(ca.crt, client.key and client.crt)を**自宅のVyOS**のディレクトリにコピーする(Cyberduck等を利用してSFTPでコピーするのが早い)

```
$ mkdir /config/auth/ovpn

[SFTP等でさくらクラウドのVyOSのca.crt, client.key and client.crtを自宅VyOSの`/config/auth/ovpn/`にコピーする]
```

# interface openvpnの設定

ここまでで設定した、認証局,鍵,DHパラメータファイルを参照して、interface openvpnを作成していく。

## さくらクラウドのVyOS(Server側)

```
# 設定モードに入る
configure

# serverモードでvtun0を作成
set interfaces openvpn vtun0 mode server

# openvpnセッションのsubnetを設定(任意)
# serverが192.168.20.1/24となる
# clientには接続順で192.168.20.2 ~ 192.168.20.254で振られる
set interfaces openvpn vtun0 server subnet 192.168.20.0/24

# OpenVPN(Server)に必要な各ファイルを参照させる
set interfaces openvpn vtun0 tls ca-cert-file '/config/auth/ovpn/ca.crt'
set interfaces openvpn vtun0 tls cert-file '/config/auth/ovpn/server.crt'
set interfaces openvpn vtun0 tls dh-file '/config/auth/ovpn/dh1024.pem'
set interfaces openvpn vtun0 tls key-file '/config/auth/ovpn/server.key'

# 変更のコミットおよび設定保存
commit 
save 
```

## 自宅のVyOS(Client側)

```
# 設定モードに入る
configure

# clientモードでvtun0を作成
set interfaces openvpn vtun0 mode client

# OpenVPN Serverの指定
set interfaces openvpn vtun0 remote-host [さくらクラウドのVyOSのグローバルIP]

# OpenVPN(client)に必要な各ファイルを参照させる
set interfaces openvpn vtun0 tls ca-cert-file '/config/auth/ovpn/ca.crt'
 set interfaces openvpn vtun0 tls cert-file '/config/auth/ovpn/client.crt'
 set interfaces openvpn vtun0 tls key-file '/config/auth/ovpn/client.key'

# 変更のコミットおよび設定保存
commit 
save 
```

##OpenVPN確認

正しくOpenVPN接続ができているか確認する。

* さくらクラウドのVyOSから確認

```
$ show openvpn server status
```

* 自宅のVyOSから確認

```
$ show openvpn client status
```

* pingで確認

さくらクラウドのVyOSから

```
$ ping 192.168.20.2
```

自宅VyOSで

```
$ sudo tcpdump -i vtun0
```

tcpdumpでicmpパケットが192.168.20.1から届いていることが確認できればOK!!

# (おまけ1)OpenVPN上をStaticに経路交換を動作させる

後に、L2TP over IPsecで接続するリモート端末への経路と外部からアクセスしたい自宅サーバへの経路を各VyOSで経路交換する必要があるので、以下のConfigにより経路交換を行う。
Tunnel IPの部分は`$ show interface`を行うと確認できます。

## さくらクラウドのVyOS

```
# 設定モードに入る
configure

# ポイントツーポイント(2つのルータで構成されるネットワーク)を指定
set interfaces openvpn vtun0 server topology point-to-point

# server側とclient側を対応付ける
set interfaces openvpn vtun0 server client (client名) ip 192.168.20.2(clientに割り振られたTunnel IP)

# client側のローカルネットワークがOpenVPNを経由することを設定
set interfaces openvpn vtun0 server client (client名) subnet 192.168.10.0/24(リモートアクセスしたい自宅のネットワークアドレス)

# 自宅のローカルネットワークにアクセスするための経路を自宅VyOSに広告する
set protocols static route 192.168.10.0/24 next-hop 192.168.20.2

# 変更のコミットおよび設定保存
commit 
save 
```

## 自宅のVyOS

```
# 設定モードに入る
configure

# 自宅のローカルネットワークへのアクセスを広告することを明示的に設定(おそらく必要ない)
set interfaces openvpn vtun0 openvpn-option "--push route 192.168.1.0 255.255.255.0"

# L2TP over IPsec(リモート)から自宅のローカルネットワークへの経路をさくらクラウドのVyOSに広告する
set protocols static route [L2TP over IPsecで外部の端末と接続する際のネットワークアドレス/32] next-hop 192.168.20.1(serverに割り振られたTunnel IP)

# 変更のコミットおよび設定保存
commit 
save 
```

## Static経路確認コマンド

ルーティングテーブルから正しく経路が見れるか確認

```
$ show ip route
```

これで、リモート端末への経路と外部からアクセスしたい自宅サーバへの経路が各ルーターから確認できれば完了

# (おまけ2)OpenVPN上でOSPFの経路交換を動作させる
**(2017/8/17)OSPFの経路交換の不足を更新**
**(おまけ1)で経路交換を行うようにしてください**

後に、L2TP over IPsecで接続するリモート端末への経路と外部からアクセスしたい自宅サーバへの経路を各VyOSで経路交換する必要があるので、以下のConfigによりOSPFを動作させる。

## さくらクラウドのVyOS

```
# 設定モードに入る
configure

# OSPFの各パラメータを設定(defaultと同じ設定だが明示的に設定)
set interfaces openvpn vtun0 ip ospf dead-interval 40
set interfaces openvpn vtun0 ip ospf hello-interval 10
set interfaces openvpn vtun0 ip ospf retransmit-interval 5
set interfaces openvpn vtun0 ip ospf transmit-delay 1

# 経路交換するネットワークを設定
set protocols ospf area 0 network 192.168.20.0/24
set protocols ospf area 0 network 192.168.20.xxx/32(server側に割り当てられたTunnel IP)
set protocols ospf area 0 network [L2TP over IPsecで外部の端末と接続する際のネットワーク]

# vtun0以外にはHelloパケットを流さないよう設定
set protocols ospf passive-interface default
set protocols ospf passive-interface-exclude vtun0

# 変更のコミットおよび設定保存
commit 
save 
```

## 自宅のVyOS

```
# 設定モードに入る
configure

# OSPFの各パラメータを設定(defaultと同じ設定だが明示的に設定)
set interfaces openvpn vtun0 ip ospf dead-interval 40
set interfaces openvpn vtun0 ip ospf hello-interval 10
set interfaces openvpn vtun0 ip ospf retransmit-interval 5
set interfaces openvpn vtun0 ip ospf transmit-delay 1

# 経路交換するネットワークを設定
set protocols ospf area 0 network 192.168.20.0/24
set protocols ospf area 0 network 192.168.20.yyy/32(client側に割り当てられたTunnel IP)
set protocols ospf area 0 network 192.168.10.0/24(外部からアクセスしたい自宅サーバの属するネットワーク)

# vtun0以外にはHelloパケットを流さないよう設定
set protocols ospf passive-interface default
set protocols ospf passive-interface-exclude vtun0

# 変更のコミットおよび設定保存
commit 
save 
```

## OSPF確認コマンド

ルーティングテーブルから正しく経路交換がされているか確認

```
$ show ip route
```

これで、リモート端末への経路と外部からアクセスしたい自宅サーバへの経路が各ルーターから確認できれば完了