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

我が家はマンション専用プロバイダと契約していることもあり、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)

# L2TP over IPsec編

今回は、[環境構築編](http://qiita.com/nl0_blu/items/3094785d6234c47da911)、[OpenVPN編](http://qiita.com/nl0_blu/items/03257d48e5dbda57c1c0)に続き、さくらクラウドVyOSとリモートアクセスする端末であるMacOS,iPhone間をL2TP over IPsecで繋ぐ方法を書いていきます。本記事で、自宅ネットワークにリモートアクセスが可能となるため、その接続性の確認も行っていきます。

なお、L2TP over IPsecを外部からリモートアクセスするためのVPNとして選んだ理由は、**MacOSやiPhone側でパッケージやソフトウェアのインストールが不要**で、利用できるためです。本記事では、自宅へのリモートアクセスを目的としているが、L2TP over IPsecを身近なものにすることで、フリーWi-Fi利用時のセキュリティ担保にもつながるので、興味のある方はこの記事から色々と発展してもらえれば幸いです。

参考は[https://wiki.vyos.net/wiki/User_Guide#L2TP_over_IPsec](https://wiki.vyos.net/wiki/User_Guide#L2TP_over_IPsec)です。

# VyOS(server側)の構築

早速、さくらクラウドのVyOSにL2TP over IPsecのServer側としての設定をしていきます。L2TPでトンネリング機能を行い、IPsecは暗号化をしていきます。認証等が終わるとIPパケットをL2TPでカプセル化し、ESPのトランスポートモードで暗号化して通信を行います。

## IPsecの設定

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

# Ipsecを動作させるinterfaceの指定(今回はグローバルIPを持っているeth0)
set vpn ipsec ipsec-interfaces interface eth0

# NATトラバーサル(NAT/NAPTを使用しているネットワーク環境においてIPsec通信を問題なく実現する拡張技術)を設定
set vpn ipsec nat-traversal enable

# クライアントに割り当てるサブネットからのNAT/NAPTを許可
set vpn ipsec nat-networks allowed-network 0.0.0.0/0

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

## L2TP over IPsecの設定

L2TP over IPsecではPre-Shared Key(事前共有鍵)とlocalユーザによって、認証を行います。また、OpenVPNと同様に、トンネリングではクライアントに割り当てるIPアドレス範囲を決める必要があるので、これを設定していきます。

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

# VyOSに割り当てられているグローバルIPをトンネリングのIPとして指定
set vpn l2tp remote-access outside-address [VyOSのグローバルIP address]

# トンネリングする際のゲートウェイルータを指定(ここでは、さくらクラウドのルーター)
set vpn l2tp remote-access outside-nexthop [GWのIP address]

# クライアントに割り当てるIPアドレス範囲(始め)
set vpn l2tp remote-access client-ip-pool start 192.168.13.101

# クライアントに割り当てるIPアドレス範囲(終わり)
set vpn l2tp remote-access client-ip-pool stop 192.168.13.120

# L2TPクライアントが利用するDNSサーバを指定(今回はGoogle DNSサーバ)
set vpn l2tp remote-access dns-servers server-1 8.8.8.8
set vpn l2tp remote-access dns-servers server-2 8.8.4.4

# 認証方法としてPre-Shared Key(事前共有鍵)を指定
set vpn l2tp remote-access ipsec-settings authentication mode pre-shared-secret

# Pre-Shared Key(事前共有鍵)として使うフレーズ(任意)の指定
set vpn l2tp remote-access ipsec-settings authentication pre-shared-secret [鍵に使うフレーズ]

# リモートアクセスするユーザの認証にはlocalユーザを利用
set vpn l2tp remote-access authentication mode local

# localユーザの登録
set vpn l2tp remote-access authentication local-users username [ユーザネーム] password [パスワード]

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

現状では、リモートアクセス端末にはVPNの接続順でclient-ip-poolからIPアドレスが動的に割り当てられる。しかし、固定でIPアドレスが欲しい場合は以下の設定を行う。

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

# 固定IPアドレスを割り振りたいlocalユーザの登録
set vpn l2tp remote-access authentication local-users username [ユーザネーム] password [パスワード]

# 固定IPアドレスの指定(プライベートIP)
set vpn l2tp remote-access authentication local-users username [上と同じユーザネーム] static-ip [割り振りたい固定IPアドレス]

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

# リモートアクセス環境(Client側)の構築

MacOSやiPhoneでは初期でL2TP over IPsecのVPN接続を行うためのものが用意されている。それを利用して、さくらクラウドのVyOSとVPN接続を行う。

## MacOS

MacOSからVPN接続するためには
はじめに、`システム環境設定`から`ネットワーク`を選択し、ウインドウ左下の`＋`をクリック。インターフェイス:「VPN」、VPNタイプ:「L2TP over IPsec」、サービス名「(任意のVPN名)」で`作成`ボタンをクリック。

![vpn1.jpg](https://qiita-image-store.s3.amazonaws.com/0/161771/e37ab093-4bbb-9207-c6cb-a7c3403408d0.jpeg)

次に、前項で設定した内容に基づき
サーバアドレス:「VyOSのグローバルIPアドレス」、アカウント名:「localで指定したusername」を入力して、`認証設定`ボタンをクリック。

![vpn2.jpg](https://qiita-image-store.s3.amazonaws.com/0/161771/a4fb8465-6e49-9117-f2b9-380ae284bb4a.jpeg)

パスワード:「usernameに対応したパスワード」、共有シークレット「Pre-Shared Key(事前共有鍵)のフレーズ」を入力して、`OK`ボタンをクリック。

![vpn3.jpg](https://qiita-image-store.s3.amazonaws.com/0/161771/508a9c7e-ce47-cb52-1e4b-f25825a5a4fb.jpeg)

`接続`ボタンをクリック。

![vpn4.jpg](https://qiita-image-store.s3.amazonaws.com/0/161771/2465b507-b3b7-08b1-a954-44b11e4c0e05.jpeg)

状況:「接続済み」となり、正しくリンクアップすればVPN接続は完了。

![vpn5.jpg](https://qiita-image-store.s3.amazonaws.com/0/161771/1220cee8-1595-e86b-1bd1-6560c85efbc5.jpeg)


## iPhone

iPhoneからVPN接続するためには
はじめに、`設定アプリ`から`一般`を選択し、下部にある`VPN`を押す。

![vpn11.jpg](https://qiita-image-store.s3.amazonaws.com/0/161771/c3877d5d-a32b-0550-bd2f-bf2d8f4ebc21.jpeg)

続いて、`VPN構成を追加`を押す。

![vpn12.jpg](https://qiita-image-store.s3.amazonaws.com/0/161771/812d190a-7e68-e4f4-1fd7-127db0aec426.jpeg)

前項で設定した内容に基づき
説明:「(任意のVPN名)」、サーバ:「VyOSのグローバルIPアドレス」、アカウント:「localで指定したusername」、パスワード:「usernameに対応したパスワード」、シークレット「Pre-Shared Key(事前共有鍵)のフレーズ」を入力して、上部の`完了`ボタンを押す。

![vpn13.jpg](https://qiita-image-store.s3.amazonaws.com/0/161771/e46aa52b-75da-8a94-5cdf-9a60280b17b5.jpeg)

`状況`タブ右のボタンを押して、**接続中**となりステータスバーに**VPN**と表示されればVPN接続は完了。

![vpn14.jpg](https://qiita-image-store.s3.amazonaws.com/0/161771/3c83e236-5c77-ae2c-8da5-c5a09b6b1b7b.jpeg)

# 接続確認

※iPhoneの接続確認は省略します。(pingコマンドを実行できるアプリもあるようですが)

[OpenVPN編](http://qiita.com/nl0_blu/items/03257d48e5dbda57c1c0)にて、Static(又はOSPF)で経路の設定は入れているので、改めてMacOSをVPN接続した上で、さくらクラウドのVyOSと自宅のVyOSで`show ip route`を確認します。

次に、MacOSのターミナルを開き、MacOSのルーティングテーブルを更新します。

```
$ route add -net 192.168.10.0/24(←リモートアクセスしたい自宅のネットワークアドレス) 192.168.13.10(←VPN接続した際にMacOSに割り当てられたIPアドレス)
```

設定後、ルーティングテーブルを確認しましょう。

```
$ netstat -rn
```

これで長かった準備は整いました。
MacOSから自宅のサーバに`ping`コマンド、ポートを開けているのであれば`ssh`コマンドを実行してみましょう。Webサーバであるのであれば、Webブラウザを開いてアクセスしてみましょう。

```
$ ping 192.168.10.xxx
$ ssh 192.168.10.xxx
$ curl 192.168.10.xxx
```

確認できれば**今回の目標は達成です！！**
(もし出来ない場合は、各種設定の見直しやどこまでの接続性があるかを確認してデバックしていきましょう。私の記事に間違いはないとは言えないので・・)

# まとめ
VPNの選定理由など色々と甘い部分もありますが、プライベートIPアドレスの自宅に安価でリモートアクセスする1つの方法であると思います。何かの参考にしていただければ幸いです。
次は、自宅への外部からの接続性ができた分、セキュリティやネットワーク監視を考えたりしたいですね。それと自宅内のサーバ開発(Webサーバ、NASサーバ等)も。