GCPでRTX1200とCloud VPN構成(BGP)

#GCPでSite to Site VPN

GCPで自宅のネットワークとVPNを接続してみたので、その内容を記載します。
AWSとのSite to Site VPNは以前からやってた(記事にはしてません)ので、GCPだとどんな感じかなぁというのがきっかけです。

ちなみにネットワークエンジニアではないので、間違ってる解釈とかあるかもです。

#1. 構成図
結果として環境はこんな感じになりました。

![GCP_VPN_BGP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/d1c610cf-a7fb-28dd-cd25-6dd9b2baf400.png)

##1.1. GCP VPC
AWSと近い考え方ではありますが、VPCは少し違います。
VPCはただの定義(箱)みたいなもので、サブネットでリージョンとネットワークCIDRを設定します。
新規にVPCを構成し、リージョンは今回大阪を選びました。zoneは3つ存在します。
通信確認用に1台GCEを1台用意しときます。
(私の名前が加藤なので、ネーミングの頭にkato-ってつけてます。)

【サブネット】

| 名前 | 領域 | IPアドレス範囲 | ゲートウェイ |
|:-----------------|:------------------|:-------------------|:-----------------|
| kato-subnet-osaka | asia-northeast2 | 172.28.0.0/20 | 172.28.0.0 |

##1.2. 家 ネットワーク
家のネットワークは単純です。
回線1つ契約してて、業者からレンタルしてるルータがフロントにいますが、スルーさせて個人でもってるrtx1200でグローバルIPを持つ構成にしてます。

【rtx1200】

| pp | lan | IPアドレス | IPアドレス範囲 |
|:-----------------|:------------------|:-------------------|:-----------------|
| pp1 | lan3 | グローバルIP : xxx.xxx.xxx.xxx (pppoe) | - |
| - | lan1 | プラベートIP : 192.168.123.254 | 192.168.123.0/24 |

```
ip route default gateway pp 1
ip lan1 address 192.168.123.254/24
ip lan1 proxyarp on
ip lan1 secure filter in 100000 100001 100002 100003 100004 100005 100006 10000
7 100099
pp select 1
 description pp PRV/PPPoE/0:eo
 pp keepalive interval 30 retry-interval=30 count=12
 pp always-on on
 pppoe use lan3
 pppoe auto disconnect off
 pp auth accept pap chap
 pp auth myname [プロバイダ接続ID] [プロバイダ接続パスワード]
 ppp lcp mru on 1454
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ppp ccp type none
 ip pp secure filter in 200003 200020 200021 200022 200023 200024 200025 200030
 200032
 ip pp secure filter out 200013 200020 200021 200022 200023 200024 200025 20002
6 200027 200099 dynamic 200080 200081 200082 200083 200084 200085 200098 200099
 pp enable 1
```
`secure filter`は環境によって違うと思います。

#2. Cloud VPN構成
ネットワークの「ハイブリッド接続」画面より
最初何も作成したことがない場合、こんな感じの画面です。(2019/10現在です。今後ガラッと画面遷移は変わるかもしれません。)

<img width="1211" alt="01_ハイブリッド接続1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/a88904b6-7f38-bd4f-7fd0-2da47179f229.png">

##2.1. クラウドルーター
そのままVPNのウィザードで進めてもいいですが、流れ的にはまず「クラウドルーター」を作成します。

<img width="839" alt="02_クラウドルーター1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/f95ec10a-b44a-e32a-7938-fbc89e19154d.png">

【クラウドルーター】
クラウドルーター側のASNを設定します。BGP使うので必要です。
今回の環境ではアドバタイズさせる必要のあるネットワークが1つのサブネットしか存在しないため、上図ではカスタムですが、デフォルトでもいいです。

| 名前 | ネットワーク | リージョン | Google ASN | アドバタイズされたルート |
|:-----------------|:------------------|:-------------------|:-----------------|:-----------------|
| kato-cloud-router | kato-vpc | asia-northeast2 (大阪) | 64512 | Cloud Routerに表示されるすべてのサブネットにアドバタイズ(デフォルト) |

##2.2. VPNの作成(IPsecまで)
###2.2.1. VPNオプション
ウィザード最初の画面
今回は「高可用性(HA)VPN」を選択します。
<img width="819" alt="03_vpnオプション.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/593649e3-afac-99e1-d107-af5b4a87a191.png">

###2.2.2. Cloud HA VPNゲートウェイの作成
<img width="1099" alt="04_vpn作成画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/ec30de7b-724f-9a5b-ec20-38675684c874.png">

| VPNゲートウェイの名前 | VPCネットワーク | リージョン |
|:-----------------|:------------------|:-------------------|
| kato-vpn-gateway | kato-vpc | asia-northeast2 (大阪) |

###2.2.3. VPNトンネルの追加
①
ここでは選択されたVPNゲートウェイの情報が正しいことを確認します。
VPNゲートウェイにインターフェースが2つ、パブリックIPアドレスが自動で付与されているはずです。

| インターフェース番号 | パブリックIPアドレス |
|:-----------------|:------------------|
| 0 | 35.242.45.253 |
| 1 | 35.220.45.2 |

②
「ピアVPNゲートウェイ」を選択しますが、この時点で作成されていないため、
「オンプレミスまたは非Google Cloud」を選択し、「新しいピアVPNゲートウェイを作成する」を選択します。

###2.2.4. ピアVPNゲートウェイのを作成
ピアVPNゲートウェイを以下の形で作成しました。
<img width="479" alt="05_ピアVPNゲートウェイ(rtx1200).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/2ffdccbe-63a9-7ffd-24a1-2a8c872e8464.png">

| 名前 | ピアVPNゲートウェイ インターフェース | インターフェース0のIPアドレス |
|:-----------------|:------------------|:-------------------|
| kato-rtx1200 | 1つのインターフェース | xxx.xxx.xxx.xxx(家のグローバルIPアドレス) |

###2.2.5. トンネル設定
まずはトンネルを1つ作成します。
先に作成したクラウドルーターを選択し、インターフェースを指定します。

ピアVPNゲートウェイはインターフェースが1つですが、VPNゲートウェイは2つあるので、まずは「インターフェーズ 0」を指定します。

IKEバージョンは2とします。

IKE事前共有キーはここで生成してしまっていいです。
<img width="727" alt="05_vpnトンネル1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/baad01f4-970d-d1b2-9ee5-fe23c6f977dd.png">

###2.2.6. BGPセッションの構成
BGPはここで設定してしまってもよいですが、本手順ではまずIPsecのトンネルが問題なく接続されることを確認した後で、BGPを構成します。
その方が、後々エラーでうまく接続できない場合に、ルーター側で設定するコンフィグの切り分けがしやすいからです。
<img width="1058" alt="06_vpnトンネル1_bgp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/aa453368-1885-5487-b932-e7263a2a3903.png">

###2.2.7. rtx1200 VPN設定(IPsecまで)
① rtx1200 トンネル1
こんな感じ

```
tunnel select 81
 ipsec tunnel 101
  ipsec sa policy 101 81 esp aes-cbc sha-hmac
  ipsec ike version 81 2
  ipsec ike duration ipsec-sa 81 3600
  ipsec ike encryption 81 aes-cbc
  ipsec ike group 81 modp1024
  ipsec ike hash 81 sha
  ipsec ike keepalive use 81 on dpd 10 3
  ipsec ike local address 81 192.168.123.254(家のルーター プライベートIPアドレス)
  ipsec ike local name 81 xxx.xxx.xxx.xxx(家のルーター グローバルIPアドレス) ipv4-addr
  ipsec ike pfs 81 on
  ipsec ike pre-shared-key 81 text 【IKE 事前共有キー】
  ipsec ike remote address 81 35.242.45.253(VPNゲートウェイ インターフェース0)
  ipsec ike remote name 81 35.242.45.253(VPNゲートウェイ インターフェース0) ipv4-addr
 ipsec tunnel outer df-bit clear
 ip tunnel tcp mss limit 1379
 tunnel enable 81

tunnel select none
ipsec auto refresh on
```

IKEバージョンが2なので、明示的に指定してます。
`ipsec ike version 81 2`
IKEバージョンが2の場合、下記が必要かと思われます。
`ipsec ike local name 81 xxx.xxx.xxx.xxx(家のルーター グローバルIPアドレス) ipv4-addr`
`ipsec ike remote name 81 35.242.45.253(VPNゲートウェイ インターフェース0) ipv4-addr`

###2.2.8. IPsecステータス確認
ここで一度状態を確認します。
うまくいってればこんな感じ。

【GCP側】
<img width="1580" alt="08_vpnトンネル確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/a93c99a6-7d93-d279-22e3-a59507c5575a.png">

【rtx1200側】

```
# show ipsec sa

sa   sgw isakmp connection   dir  life[s] remote-id
-----------------------------------------------------------------------------
1     81   -    ike          -    9547    35.242.45.253
2     81   1    tun[081]esp  send 3285    35.242.45.253
3     81   1    tun[081]esp  send 580     35.242.45.253
4     81   1    tun[081]esp  recv 580     35.242.45.253
5     81   1    tun[081]esp  recv 3285    35.242.45.253
```

うまくいかない場合は、GCP側のログ、rtx1200側のログをみてつぶしていきましょう。

https://network.yamaha.com/setting/router_firewall/cloud/amazon_vpc/setup_rt
AWSのVPNのときも必要となった設定で下記があります。VPN(IPsec)に使うパケットに必要です。
トンネル以外でこの設定が必要になるかと思います。

参考：

```
ip filter 200080 pass * 192.168.123.254 udp * 500
ip filter 200081 pass * 192.168.123.254 esp * *

nat descriptor type 1000 masquerade
nat descriptor address outer 1000 (ルーターのグローバルIPアドレス)
nat descriptor masquerade static 1000 1 192.168.123.254 udp 500
nat descriptor masquerade static 1000 2 192.168.123.254 esp
```

私の実際の設定：

```
ip filter 200101 pass * 192.168.123.254 esp
ip filter 200102 pass * 192.168.123.254 udp * 500

nat descriptor type 1000 masquerade
nat descriptor address outer 1000 ipcp
nat descriptor address inner 1000 auto
nat descriptor masquerade static 1000 1 192.168.123.254 esp
nat descriptor masquerade static 1000 2 192.168.123.254 udp 500
```

プロバイダ設定 pp1

```
pp select 1
 ip pp secure filter in 200101 200102 #デフォルトからルールを追記した形でここに記載してる(本当はもっと多いし、全部記載する必要がある)
 ip pp nat descriptor 1000 #NATのルールをここに適用
```

##2.3. VPNの作成(BGP構成)
###2.3.1. BGPセッションを構成
作成したトンネルを選択して、「BGPセッションを構成」をクリックします。
<img width="764" alt="09_トンネルbgp1_設定1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/1d1b0ba0-40a8-6347-36de-757489ee9d4a.png">

<img width="538" alt="10_トンネル1_bgp設定2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/d0117858-de92-8422-1fda-d0e4a1a231b2.png">

図ではカスタムルートになってますが、実際の設定は「Cloud Routerのアドバタイズを使用(デフォルト)」を選択してます。

| 名前 | ピアASN | Cloud RouterのBGP IP | BGPピアIP | アドバタイズされたルート |
|:-----------------|:------------------|:-------------------|:-------------------|:-------------------|
| kato-tvpn-tunnel1-bgp | 65100(家のルーター側) | 169.254.0.1 | 169.254.0.2 | Cloud Routerのアドバタイズを使用(デフォルト) |

BGP IPについて。
1対1の通信なので、CIDRは/30ならなんでもよいと思われるが、GCP側のマニュアルに合わせる感じで。

###2.3.2. rtx1200 VPN設定(BGP)
② rtx1200 トンネル1 BGP

```
tunnel select 81
 ip tunnel address 169.254.0.2/30
 ip tunnel remote address 169.254.0.1
tunnel select none

bgp use on
bgp autonomous-system 65100
bgp neighbor 1 64512 169.254.0.1 hold-time=30 local-address=169.254.0.2
bgp import filter 1 equal 192.168.123.0/24
bgp import 64512 static filter 1
bgp configure refresh
```

もしかしたら、最初の4行はいらないかもしれない。(AWSのときには入れてたので今回も入れました)

`bgp neighbor 1 64512 169.254.0.1 hold-time=30 local-address=169.254.0.2`
ここは重要。

`bgp import filter 1 equal 192.168.123.0/24`
`bgp import 64512 static filter 1`
これも重要。
GCP側にオンプレ側のネットワークをアドバタイズする必要があるので、広告したいネットワークを記載
この場合、オンプレ側のプライベートネットワークCIDR。

###2.3.3. VPNのステータス確認
ここでBGPまでが完了するはずなので、ステータスを確認します。
####2.3.3.1. GCP クラウドルーター確認
<img width="1172" alt="11_bgp確認1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/78c4e564-54f9-35c3-3e71-4a2e2e9c727d.png">

####2.3.3.2. GCP VPN確認
<img width="1664" alt="12_bgp確認2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/929189f9-8ba3-5ca0-b927-0f6bf5363911.png">

####2.3.3.3. rtx1200側の確認
```
# show status bgp neighbor 
BGP neighbor is 169.254.0.1, remote AS 64512, local AS 65100, external link
  BGP version 4, remote router ID 169.254.0.1
  BGP state = Established, up for 05:20:47
  Last read 00:00:03, hold time is 30, keepalive interval is 10 seconds
  Received 1925 messages, 0 notifications, 0 in queue
  Sent 1929 messages, 0 notifications, 0 in queue
  Connection established 8; dropped 7
  Last reset 05:21:11
Local host: 169.254.0.2, Local port: 179
Foreign host: 169.254.0.1, Foreign port: 40805
```

##2.4. トンネルが1つでVPN構成完了
ここまでで、ひとまず完了です。
トンネル1つでVPNができてます。
ただ、ここはAWSのVPNと同様トンネルを2つ構成したい。(オンプレのルーターは1つやからあんまり意味ないけど。)

ということでトンネルをもう1つ追加します。
さくっと流します。

###2.4.1. トンネル + BGP設定
<img width="541" alt="13_vpnトンネル2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/23099e96-f010-31ed-0536-6cf85f5a4a30.png">

<img width="475" alt="14_トンネル2_bgp設定1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/ce3a1c28-20a0-d22f-b44d-a0b98cf738bf.png">

###2.4.2. rtx1200 トンネル + BGP

```
tunnel select 82
 ipsec tunnel 102
  ipsec sa policy 102 82 esp aes-cbc sha-hmac
  ipsec ike version 82 2
  ipsec ike duration ipsec-sa 82 3600
  ipsec ike encryption 82 aes-cbc
  ipsec ike group 82 modp1024
  ipsec ike hash 82 sha
  ipsec ike keepalive use 82 on dpd 10 3
  ipsec ike local address 82 192.168.123.254(家のルーター プライベートIPアドレス)
  ipsec ike local name 82 xxx.xxx.xxx.xxx(家のルーター グローバルIPアドレス) ipv4-addr
  ipsec ike pfs 82 on
  ipsec ike pre-shared-key 82 text 【IKE 事前共有キー】
  ipsec ike remote address 82 35.220.45.2(VPNゲートウェイ インターフェース1)
  ipsec ike remote name 82 35.220.45.2(VPNゲートウェイ インターフェース1) ipv4-addr
 ipsec tunnel outer df-bit clear
 ip tunnel address 169.254.0.6/30
 ip tunnel remote address 169.254.0.5
 ip tunnel tcp mss limit 1379
 tunnel enable 82

tunnel select none

bgp neighbor 2 64512 169.254.0.5 hold-time=30 local-address=169.254.0.6
bgp configure refresh
```

###2.4.3. VPNのステータス確認
####2.4.3.1. GCP クラウドルーター確認
<img width="1193" alt="15_bgp2確認1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/d94cc2bb-e8f4-1a14-403d-581e23b6cfc3.png">

####2.4.3.2. GCP VPN確認
<img width="1580" alt="16_bgp2確認2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/53482877-9f80-4233-f0d3-a22a16edff78.png">

####2.4.3.3. rtx1200側の確認
IPsec

```
# show ipsec sa

sa   sgw isakmp connection   dir  life[s] remote-id
-----------------------------------------------------------------------------
12    81   -    ike          -    18293   35.242.45.253
26    81   12   tun[081]esp  send 1212    35.242.45.253
27    81   12   tun[081]esp  recv 1212    35.242.45.253
31    82   -    ike          -    27131   35.220.45.2
32    82   31   tun[082]esp  send 1931    35.220.45.2
33    82   31   tun[082]esp  recv 1931    35.220.45.2
```

BGP

```
# show status bgp neighbor 
BGP neighbor is 169.254.0.1, remote AS 64512, local AS 65100, external link
  BGP version 4, remote router ID 169.254.0.1
  BGP state = Established, up for 00:26:41
  Last read 00:00:09, hold time is 30, keepalive interval is 10 seconds
  Received 161 messages, 0 notifications, 0 in queue
  Sent 164 messages, 0 notifications, 0 in queue
  Connection established 1; dropped 0
  Last reset never
Local host: 169.254.0.2, Local port: 179
Foreign host: 169.254.0.1, Foreign port: 37739

BGP neighbor is 169.254.0.5, remote AS 64512, local AS 65100, external link
  BGP version 4, remote router ID 169.254.0.5
  BGP state = Established, up for 00:19:39
  Last read 00:00:08, hold time is 30, keepalive interval is 10 seconds
  Received 119 messages, 0 notifications, 0 in queue
  Sent 121 messages, 0 notifications, 0 in queue
  Connection established 1; dropped 0
  Last reset never
Local host: 169.254.0.6, Local port: 179
Foreign host: 169.254.0.5, Foreign port: 36357
```

#3. VPN BGP完了
ここまででVPN BGPがトンネル2つで完了しています。
ここからは通信確認になります。
##3.1. ルート(経路)確認
###3.1.1. GCPルート確認
GCPの場合、BGPでアドバタイズがちゃんとできていれば、下記画面のように自動で「ルート」の動的情報が追加されます。
AWSのようにルートテーブルを設定する必要はありません。
動的情報が上がってこない場合、アドバタイズがミスってると思います。
<img width="1055" alt="17_ルート動的.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191445/fa4dd627-ed21-b728-4a72-c3c297d6bac6.png">

###3.1.2. rtx1200ルート確認

```
# show ip route 
宛先ネットワーク    ゲートウェイ     インタフェース  種別  付加情報
default             -                    PP[01]    static  
169.254.0.0/30      -                TUNNEL[81]  implicit  
169.254.0.4/30      -                TUNNEL[82]  implicit  
172.28.0.0/20       169.254.0.1      TUNNEL[81]       BGP  path=64512
192.168.123.0/24    192.168.123.254        LAN1  implicit   
```

## 3.2. ファイアウォールルール
ということで必要な設定としてはファイアウォールルールとなります。
設定の詳細はここでは割愛しますが、基本的にインバウンド(上り)のルールにオンプレミス側のプライベートIPアドレスCIDRを許可します。
※ 下りは拒否しない限り`0.0.0.0/0`で許可されてるはず

オンプレミス側、GCP側より双方で通信確認をし、通れば完了となります。

以上です。