IPsec-VPNを使ってGCPとFortigateを繋いだあと、インスタンスにローカルIPでアクセスできるようにした手順。

こんにちわ！
関西でいそいそとネットワーク組んだりしているうぃっちゃんといいます。
本職は光の戦士、副業でエンジニアをやっています。

突然ですが、無性にどこかとIPsec-VPN張りたくなるときってありますよね。
今回は[GCP](https://console.cloud.google.com/)上にインスタンスを立ててIPsec-VPNを張り、自宅のPCからローカルIPでインスタンスにアクセスしたいと思います。

# 今回のゴール
GCPインスタンスに乗っているnginxをIPsec-VPNを経由してブラウザで見ることができる。
nginxの初期ページが見れたらOK！

# 作成したネットワーク全体像

![ネットワーク全体図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/51fdb9b0-177a-c64f-ffa8-a981d2107027.jpeg)

# 事前準備
これから始めるにおいて、以下のことをできている前提とします。

* GCPに適当なプロジェクトを1つ作成している。(中身は空っぽでOK)
* Fortigate配下のLANからWANにアクセスすることができる。

このページ見れてるってことは大丈夫ですね。

## 機器情報
|機器名称|外部IPアドレス|
|-----|-----|
| Fortigate 50E v6.2.0 | 動的IP|
|GCP VPN|静的IP|

# 注意
画像内に入力されている値と、その後で記載している表にかかれている値が異なる場合が多々あります。
**表を正として読んでいってください。**

# 作業開始！
時系列順で記載します。

## GCP設定編
### VPCネットワーク作成
ここで、GCP側のネットワークを作成していきます。
左側ハンバーガーメニューから「VPCネットワーク」→「VPCネットワーク」を選択します。
上部の「＋VPCネットワークの作成」をクリックします。
![screencapture-console-cloud-google-networking-networks-add-2020-08-17-21_20_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/1cc833e8-a66a-9758-7262-0d4f33ceb78a.png)
設定内容は以下の通りです。(デフォルト設定含む。)

|設定項目|入力値|
|-----|-----|
|名前|test-vpn-instance (任意の値)|
|Subnet creation mode| カスタム |
|Subnetの方の名前|test-vpn-network (任意の値)|
|リージョン|asia-northeast1 (任意のリージョン)|
|IP address range|192.168.200.0/24|
|Private Google access|オフ|
|Flow logs|オフ|
|Dynamic routing mode|リージョン|
### VPN作成
左側ハンバーガーメニューから「ハイブリッド接続」→「VPN」を選択します。
以下の画面で「Classic VPN」を選択します。
![screencapture-console-cloud-google-hybrid-vpn-select-2020-08-17-22_08_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/13b47365-040a-abb3-4b03-b8df9f83bc9e.png)

設定画面が長いので、VPNゲートウェイとトンネル部分に分けて解説します。
![screencapture-console-cloud-google-hybrid-vpn-add-2020-08-17-22_37_46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/f90db295-5e83-ae30-93e1-3d20d0c2c5c3.jpeg)
設定内容は以下の通りです。

|設定項目|設定内容|
|-----|-----|
|名前|vpn-gcp-fortigate ( 任意の値 )|
|ネットワーク|test-vpn-instance ( VPCネットワークで作成したやつ )|
|リージョン|asia-northeast1|
|IPアドレス|IPアドレスを作成( GCPのVPNゲートウェイの外側IPアドレスになる )|

続いて、VPNトンネルの設定を行います。
**IKEの事前共有キーは設定後に参照することができないのでしっかり控えておきましょう！**

![vpn-tunnel.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/246194f1-7c6b-28ff-4d8a-32b54b9fade3.jpeg)

**IKEの事前共有キーは設定後に参照することができないのでしっかり控えておきましょう！**
(大事なことなので2回言った。)

|設定項目|設定内容|
|-----|-----|
|名前|tunnel-gcp-fortigate ( 任意の値 )|
|リモートピアIPアドレス|( Fortigateの外部IPアドレス )|
|IKEバージョン|IKEv2|
|IKE事前共有キー|生成してコピー(Fortigateでも使うので控えておく)|
|ルーティング オプション|ポリシーベース|
|リモートネットワークIPの範囲| 192.168.11.0/24 ( Fortigateの内部ネットワーク )|
|ローカルサブネットワーク|test-vpn-network( VPCネットワークで作成したやつ )|
|ローカルIP範囲| 192.168.200.0/24 |

作成を押して、一旦終わり。
このままだとICMPを許可していないのでpingでの導通確認ができません。
ファイアウォールルールをいじりに行きます。

### ファイアウォールルール追加
左側ハンバーガーメニューから「VPCネットワーク」→「ファイアウォール」を選択します。
上部の「＋ファイアウォールルールを作成」をクリックします。

![screencapture-console-cloud-google-networking-firewalls-add-2020-08-18-00_02_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/28f8bea7-8172-7866-e5cc-5f3fcfbca042.png)

|設定項目|設定内容|
|-----|-----|
|名前|allow-icmp ( 任意の値 )|
|ログ|オフ|
|ネットワーク|test-vpn-instance|
|優先度|1000|
|トラフィックの方向|上り|
|一致したときのアクション|許可|
|ターゲット|ネットワーク上のすべてのインスタンス|
|ソースフィルタ|IP範囲|
|ソースIPの範囲|192.168.11.0/24|
|2番めのソースフィルタ|なし|
|プロトコルとポート|指定したプロトコルとポート|
|その他のプロトコル|icmp|

これでつながったあとにpingが通るようになるはずです。

続いてインスタンスを作成します。

### GCPインスタンス作成
ネットワークの試験用インスタンスなのでぱぱっと組んでしまいます。重要なのはネットワークの部分だけ！
![screencapture-console-cloud-google-compute-instancesAdd-2020-08-17-23_13_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/1649166f-101d-a670-9658-da5840d8a3f8.jpeg)
設定は以下のとおりです。

|設定項目|設定内容|
|-----|-----|
|名前|instance-1 ( 任意の値 )|
|リージョン|asia-northeast1|
|ゾーン|asia-northeast1-a ( b,cでも可 )|
|マシン構成|汎用 N1|
|ブートディスク|CentOS8 SSD-20GB(サクサク動くのが好き)|

ここから本番。ネットワークの設定を行っていきます。画像では第4オクテットが書かれていませんが「.2」です。

![instance-network-settings.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/d5908e93-b9a3-f20c-7d7d-112b01f740ee.jpeg)


|設定項目|設定内容|
|-----|-----|
|ファイアウォール|HTTPトラフィックを許可する|
|ネットワーク|test-vpn-instance|
|サブネットワーク|test-vpn-network|
|プライマリ内部IP|エフェメラル(カスタム)|
|カスタムのエフェメラルIPアドレス|192.168.200.2( GCPインスタンスのローカルIP )|
|外部IP|エフェメラル|
|ネットワークサービス階層|プレミアム( 標準でもできるかは未検証 )|
|IP転送|オフ|
作成したインスタンスにSSHで入って、```sudo yum -y install nginx```とかでインストールしてください。
外部IPをブラウザに入力してnginx初期ページを見れたら、SSHを抜けてインスタンスをいじるのは終わりです。

## Fortigate設定編
### 新規IPsec-VPN設定
Fortigateの管理画面にログインします。
メニューから「VPN」→「IPsecトンネル」を選択します。
「＋新規作成」から新しく作っていきます。
![fortigate.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/a1f2be2c-c318-13b0-a84d-9a7d408d2586.jpeg)

|設定項目|設定内容|
|-----|-----|
|名前|ipsec-gcp( 任意の値 )|
|テンプレートタイプ|カスタム|
次へを押して詳細な設定に入ります。
![screencapture-192-168-11-254-ng-vpn-ipsec-edit-2020-08-18-00_34_38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/c28397cd-307f-b322-d598-2464503677f8.jpeg)

|設定項目|設定内容|
|-----|-----|
|IPバージョン|IPv4|
|リモートゲートウェイ|固定IPアドレス|
|IPアドレス|GCPのVPN接続で設定したIPアドレス|
|インターフェース|wan1|
|NATトラバーサル|有効|
|認証方式|事前共有鍵|
|事前共有鍵|( GCPで作成してコピーした値 )|
|IKEバージョン|2|
続いてフェーズ1とフェーズ2の暗号化とか認証とかなんやらかんやらの設定を行っていきます。

![screencapture-192-168-11-254-ng-vpn-ipsec-edit-2020-08-18-00_34_38-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/05c9fee7-87b7-e55f-dd65-17f92c8050e9.jpeg)

|設定グループ|設定項目|設定内容|
|-----|-----|-----|
|フェーズ1プロポーザル|暗号化|AES128GCM|
||PRF|PRFSHA384|
||暗号化|AES256GCM|
||PRF|PRFSHA256|
||Diffie-Hellmanグループ|15, 14, 5|
||鍵の有効時間(秒)|36000|
||ローカルID|(空欄)|
|フェーズ2セレクタ|名前|connect-gcp ( 任意の値 )|
||ローカルアドレス|サブネット 192.168.11.0/24|
||リモートアドレス|サブネット 192.168.200.0/24|
|フェーズ2プロポーザル|暗号化|AES128GCM|
||暗号化|AES256GCM|
||Replay Detectionを有効化|Check|
||PFSを有効化|Check|
||Diffie-Hellmanグループ|15, 14, 5|
||鍵の有効時間|秒|
||秒|10800|

Fortigate側のVPN接続用設定はあと少しだけ続きます。

### スタティックルート登録
左側メニュー「ネットワーク」→「スタティックルート」を選択します。
「＋新規作成」を選択します。
![fortigate-static-loot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/d58f6581-11d7-7533-3af9-5e32ac651407.jpeg)

|設定項目|設定内容|
|-----|-----|
|宛先|サブネット|
||192.168.200.0/255.255.255.0|
|インターフェース|ipsec-gcp|
これでスタティックルートの設定は終わり。あとはルーティングだけ！！！

### IPv4ルーティング追加登録
追加するポリシーは全部で3つです。

* GCP側からFortigateの外部IPへのUDP 500,4500番ポートへの通信の許可。
* Fortigate側のローカルIPからGCP側のローカルIPへの通信の許可。
* GCP側のローカルIPからFortigate側のローカルIPへの通信の許可。

1つ目はこれ。これを登録した時点でIPsecが張れるようになります。
![v4_routing_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/7f09d413-7841-fb9b-98d6-c832776808f2.jpeg)

|設定項目|設定内容|
|-----|-----|
|名前|(任意の値)|
|着信インターフェース|ipsec-gcp|
|発信インターフェース|wan1|
|送信元|all|
|宛先|all|
|サービス|IKE|
|NAT|Uncheck|

2つ目はこれ。
![v4_routing_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/a5e0268c-506a-2497-b642-4ad1317a117e.jpeg)

|設定項目|設定内容|
|-----|-----|
|名前|(任意の値)|
|着信インターフェース|lan1|
|発信インターフェース|ipsec-gcp|
|送信元|all|
|宛先|all|
|サービス|ALL|
|NAT|Uncheck|

最後の3つ目がこれ。
![v4_routing_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/b723a053-1de4-c5d2-0667-353569e5aaab.jpeg)

|設定項目|設定内容|
|-----|-----|
|名前|(任意の値)|
|着信インターフェース|ipsec-gcp|
|発信インターフェース|lan1|
|送信元|all|
|宛先|all|
|サービス|ALL|
|NAT|Uncheck|

これで、GCP、Fortigate両方の設定が終わりました。
あとは導通確認とnginxの初期ページを見に行くだけです！！！！

## 導通確認
Fortigate側に存在するPCもしくはFortigateのCLIで、GCP上のインスタンスに永遠にpingを飛ばしながら作業を行います。
```ping -t 192.168.200.2```とか```execute ping 192.168.200.2```とか使って飛ばし続けます。
帰ってきたのが確認できた時点で終了です。
### GCP側で確認
「ハイブリッド接続」→「VPN」から確認します。
VPNトンネルのステータスが「確立済み」になっていればOK。
![v4_routing_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/f99f08e9-baa0-440c-7daf-4cac18451d12.jpeg)

### Fortigate側で確認
「VPN」→「IPsecトンネル」から確認します。
ステータスが「アップ」になっていたらOK。

![v4_routing_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/8c6630fa-fce4-4b84-009f-c58124be31cc.jpeg)

## ブラウザから確認
pingも通った。それぞれでリンクアップしてることが確認できたなら、最後にブラウザから確認して目的を達成しに行きます。
http://192.168.200.2 をアドレスバーに入力すると、nginxの初期ページが出てくるはずです。。。
![super_finish_final.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556965/b9c101a2-4b8c-0fdd-ef7f-1fc192cef8f5.jpeg)

私はインスタンスで遊んでSSLを有効化していたので、HTTPSで表示できちゃっています。
以上、お疲れさまでした。

# 参考にしたサイト
## GCP側の設定
* [GCPと自宅NW(RTX1200)のVPN接続をしよう - beyond  ](https://beyondjapan.com/blog/2019/11/vpn-connection-with-gcp-and-rtx1200/)
* [サポートされている IKE の暗号 - GoogleCloud](https://cloud.google.com/network-connectivity/docs/vpn/concepts/supported-ike-ciphers?hl=ja)

## Fortigate側の設定
* [FortigateとAWS VPCとVPN(IPsec)で接続する - いくらは神の食べ物](https://www.ikura-oisii.com/?p=191)