LoginSignup
27
23

More than 3 years have passed since last update.

GCP に VPC を構築して Cloud VPN で自宅ラボネットワークと VPN 接続

Last updated at Posted at 2020-06-27

はじめに

GCP でゼロから VPC を構築し、VPC 内に仮想マシン (GCE/Compete Engine) も構築する
自宅ラボのネットワークと VPC を接続する VPN を構築し、リソース間で直接疎通可能にする (Cloud VPN)
最終的に Internet → VPC内踏み台サーバ(GCE) → 自宅ラボサーバ とアクセスできるようにする(2段 SSH)

下記 GCP (Google CloudPlatform) 内の VPC 構築全てと、自宅ラボ(Home Lab) の VPN 設定が対象
gcp_vpn_abst.png

環境

自宅ネットワーク機器

  • EdgeRouter-X (以後, ER-X)
    • Ubiquiti Networks 製
    • Vyatta フォークで似た操作感の OS で動く Router で、Amazon で ¥9,999 (2020.06.21時点) でとてもコスパがいい
    • Vyatta / VyOS と少し違うが大体同じナレッジが使えるので、今回も VyOS 向けの VPN 設定を参考にしている

スクリーンショット 2020-03-01 22.52.26.png

自宅ネットワーク環境

  • Internet 向けはマンション側が提供しているネットワーク
  • 192.168.x.x のプライベートアドレスのみが DHCP でのみ提供され、グローバルIPはマンションで共有のもの
  • グローバルIP / プライベートIPの変換はマンション側提供でユーザ側には提供されていない

GCP

  • 個人契約の VPC でフル権限を持っている
  • 自宅ネットワークとは被らないアドレスで VPC を構築する

全体構成

gcp_vpn_map.png

  • VPC
    • vpc01 という VPC を構築する
    • Subnet
      • 名前: public-subnet01
      • アドレスセグメント: 10.10.0.0/20
    • Compute Engine (GCE)
    • Cloud Firewall Rules
      • Internet → VPC
        • TCP Port 22 (SSH) 許可
    • Cloud VPN
      • 自宅ラボと接続する homelabvpn と名前をつけた VPN を作成
  • Home Lab
    • ER-X (EdgeRouter-X)
      • 自宅ラボ(Home Lab) の Gateway ルータ
      • VPN の終端も実施する
    • Apartment環境
      • マンション備え付けルータで設定不可
      • 自宅ラボには Private IP が配られている (192.168.0.0/16 で 通常 192.168.10.xがアサインされる動作)

構築ステップ

  1. VPC / Compute Engine (踏み台サーバ) の構築
  2. CloudVPN の作成
  3. 自宅ラボネットワーク VPN 設定 (ER-X)

gcp_vpn_abst2.png

1. VPC / Compute Engine (踏み台サーバ) の構築

VPC / Compute Engine の構築、Internet から SSH の許可を実施する

gcp_vpn_abst_1.png

実施内容は下記の通り

  1. VPC ネットワーク作成
  2. サービスアカウント作成
  3. Compute Engine で VM インスタンスを作成
  4. ファイアウォール設定
  5. 接続確認

1.1 VPC ネットワーク作成

今回使用する VPC ネットワークを作成する

  • ナビゲーションメニュー (左上の三本線) から下記を開く
  • 「ネットワーキング」 → 「VPC ネットワーク」

スクリーンショット 2020-06-21 14.38.22.png

  • 「+VPC ネットワークを作成」 を選択

スクリーンショット 2020-06-21 14.44.20.png

名前やサブネットの設定を実施

  • 本例でのパラメータ
    • 名前: vpc01
    • サブネット
      • 名前: public-subnet01
      • リージョン: us-west1
      • IP アドレス範囲: 10.10.0.0/20
    • 動的ルーティングモード
      • グローバル

スクリーンショット 2020-05-05 15.22.38.png

作成クリックして VPC ネットワークの作成完了

1.2 サービスアカウント作成

今回作成する VM インスタンス向けのサービスアカウントを作成する
(このサービスアカウントを Firewall Rules で紐付けて SSH 許可を実施する)

  • 「IAM と管理」 → 「サービス アカウント」

スクリーンショット 2020-06-21 14.54.07.png

  • 「+ サービス アカウントを作成」

スクリーンショット 2020-06-21 14.57.04.png

  • サービス アカウント名 だけ入力してあとは「作成」

スクリーンショット 2020-05-05 15.40.31.png

今回使用するサービスアカウント作成完了

1.3 Compute Engine で VM インスタンスを作成

今回の踏み台サーバとして、試しにログインなどできるように VM を1台作成する
スペック等は無料枠 / Always Freeの範囲で作成する

  • 「コンピューティング」 → 「Compute Engine」 → 「VM インスタンス」
    スクリーンショット 2020-06-21 15.02.59.png

  • 「+アイコン (インスタンスの作成)」をクリック
    スクリーンショット 2020-06-21 15.04.12.png

インスタンスの設定

  • リージョン: us-west1
  • マシンタイプ: f1-micro
  • ブートディスク: CentOS7 30GB
  • サービスアカウント: 作成したサービスアカウントを指定

スクリーンショット 2020-05-05 15.45.08.png

セキュリティ: SSH公開鍵を貼り付ける

  • ここではリモートログインする PC で作成した RSA の公開鍵(id_rsa.pub)の内容を貼り付けた
  • ここで貼り付けた公開鍵のユーザが VM に作成され SSH が可能な状態で作成される

スクリーンショット 2020-05-05 15.45.22.png

ネットワーキング: 作成した VPC およびサブネットを指定する

スクリーンショット 2020-05-05 15.46.48.png

最後に作成をクリックして VM インスタンス作成完了

1.4 ファイアウォール設定

次に、Internet から作成した VM へ SSH ができるルールを作成する

  • 「ネットワーキング」 → 「VPC ネットワーク」 → 「ファイアウォール」
    スクリーンショット 2020-06-21 17.13.26.png

  • 「+ファイアウォール ルールを作成」 をクリック
    スクリーンショット 2020-06-21 17.25.03.png

下記パラメータでファイアウォール ルールを作成する

  • ネットワーク: 作成した VPC (vpc01)
  • ターゲット: 指定されたサービス アカウント
    • ターゲット サービス アカウント: 作成したサービスアカウント名 (public-server)
  • ソースフィルタ: IP範囲
    • ソース IP の範囲: 0.0.0.0/0
  • プロトコルとポート: 指定したプロトコルとポート
    • tcp: 22

スクリーンショット 2020-06-21 17.53.26.png

作成をクリックしてファイアウォールルール作成完了

1.5 接続確認

ここまでで VPC および GCE での VM インスタンス作成が完了し、
インターネットから VM の Public IP へ SSH 接続が可能

VM インスタンスの IP は VM インスタンス管理画面の外部 IP をみることで確認可能

スクリーンショット 2020-06-21 17.29.55.png

ssh [公開鍵でのユーザ名]@[作成した VM インスタンスの外部 IP(public ip)]

ログイン確認できれば VPC / GCE 作成まで完了

2. CloudVPN の作成

自宅ラボネットワークへ接続する VPN を構築するため、CloudVPN の構築・設定を実施する
合わせて、自宅ラボから VPC へもアクセスできるように Firewall Rule も追加しておく

CloudVPNの作成

gcp_vpn_abst_2.png

VPN設定画面へ移動

  • 「ネットワーキング」 → 「ハイブリッド接続」 → 「VPN」

スクリーンショット 2020-06-21 18.04.08.png

「+ VPN 設定ウィザード」をクリック

スクリーンショット 2020-06-21 18.05.30.png

今回はシンプルに Classic の方を使用する

  • 「Classic VPN」を選択

スクリーンショット 2020-06-21 20.32.03.png

各種パラメータを入力

  • Google Compute Engine VPN ゲートウェイ
    • 名前:今回は homelabvpn とした
    • ネットワーク: 作成した VPC を選択 (今回は vpc01)
    • リージョン: us-west1
    • IPアドレス: 作成する
      • ウィザードが開くので(次の次の画像)、静的アドレスの予約を実施して指定する  - トンネル
    • 名前: 今回は vpn-1-tunnel-1 とした
    • リモートピア IP アドレス: 自宅ネットワークの Public (Global) IP を記載する
    • IKE 事前共有キー: 「生成してコピー」をクリックして、作成し、コピーしておく(自宅ラボ VPN 側設定で必要になる)
    • ルーティングオプション: 今回は「ルートベース」で実施する
      • リモートネットワーク IP の範囲: 自宅ラボネットワークの IP を記載する (今回は 192.168.128.0/20)

最後に「作成」をクリック

スクリーンショット 2020-06-21 20.44.32.png

※途中のIPアドレスでの静的アドレス予約の画面

スクリーンショット 2020-06-21 20.39.00.png

構築完了すると下記のような画面になる
(下記画像は、全て構築完了後でのキャプチャ。VPNトンネルのステータスは 3 自宅ラボネットワーク VPN 設定 完了後に確立済みになる)

スクリーンショット 2020-06-26 22.50.15.png

これで、Cloud VPN 作成完了

Firewall Rules 追加(自宅ラボ → VPC)

自宅ラボから逆に GCP のサーバへアクセスできるようにファイアウォールルールを追加しておく
ここではとりあえず、 SSH (TCP/22) と ICMP を許可しておく

下記パラメータでファイアウォール ルールを作成する (作成メニューを開くまでは「1.4 ファイアウォール設定」を参照)

  • 名前: 適当な名前で良い (ここでは homelab-to-public-001)
  • ネットワーク: 作成した VPC (vpc01)
  • ターゲット: 指定されたサービス アカウント
    • ターゲット サービス アカウント: 作成したサービスアカウント名 (public-server)
  • ソースフィルタ: IP範囲
    • ソース IP の範囲: 自宅ラボのアドレスセグメント (192.168.128.0/20)
  • プロトコルとポート: 指定したプロトコルとポート
    • tcp: 22
    • その他のプロトコル: icmp

スクリーンショット 2020-06-29 1.25.08.png

作成を押して、Firewall Rule 作成完了

以上で、GCP 側の自宅ラボ VPN 接続系の設定完了

3. 自宅ラボネットワーク VPN 設定 (ER-X)

自宅ラボ側のルータへの VPN 設定の追加を実施する

gcp_vpn_abst_3.png
ER-X の設定状況は下記の通り

  • Interface
    • eth0
      • 外部向けのInteface
      • dhcp でグローバルと通信可能なプライベートアドレスを取得している
  • firewall
    • zone base の Firewall を設定している
    • Untrust-Trust
      • 外部から自宅ラボ内のサーバへのファイアウォールルール
      • Untrust が eth0 (外部向け Inteface), Trust が自宅ラボネットワークで、Untrust から Trust 向けのルール
      • 追加ルールとして今回の GCP VPC セグメントの許可を追加する
  • nat
    • 外部向けに NAT している
    • VPC 向けアドレスを NAT 対象から除外する必要がある

下記の順で設定する

  1. VPN 設定
  2. Firewall 設定
  3. NAT 設定
  4. MSS 設定
  5. 設定保存, 状態確認

3.1. VPN 設定

ipsec 設定を実施する
「2. CloudVPN の作成」で作成などしたパラメータを組み込む

set vpn ipsec allow-access-to-local-interface disable
set vpn ipsec auto-firewall-nat-exclude disable
set vpn ipsec esp-group gcp-esp compression disable
set vpn ipsec esp-group gcp-esp lifetime 10800
set vpn ipsec esp-group gcp-esp mode tunnel
set vpn ipsec esp-group gcp-esp pfs enable
set vpn ipsec esp-group gcp-esp proposal 1 encryption aes256
set vpn ipsec esp-group gcp-esp proposal 1 hash sha1
set vpn ipsec ike-group gcp-ike dead-peer-detection action restart
set vpn ipsec ike-group gcp-ike dead-peer-detection interval 30
set vpn ipsec ike-group gcp-ike dead-peer-detection timeout 120
set vpn ipsec ike-group gcp-ike ikev2-reauth no
set vpn ipsec ike-group gcp-ike key-exchange ikev2
set vpn ipsec ike-group gcp-ike lifetime 36000
set vpn ipsec ike-group gcp-ike proposal 1 dh-group 14
set vpn ipsec ike-group gcp-ike proposal 1 encryption aes256
set vpn ipsec ike-group gcp-ike proposal 1 hash sha1
set vpn ipsec ipsec-interfaces interface eth0
set vpn ipsec nat-traversal enable
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] authentication id [自宅ラボが Internet から見える Public IP]
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] authentication mode pre-shared-secret
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] authentication pre-shared-secret [2.で作成した IKE 事前共有キー]
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] connection-type initiate
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] dhcp-interface eth0
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] ike-group gcp-ike
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] ikev2-reauth inherit
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] tunnel 0 allow-nat-networks disable
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] tunnel 0 allow-public-networks disable
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] tunnel 0 esp-group gcp-esp
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] tunnel 0 local prefix 192.168.128.0/20
set vpn ipsec site-to-site peer [CloudVPN の静的 IP アドレス] tunnel 0 remote prefix 10.10.0.0/20

3.2. Firewall 設定

SSH/ICMP の許可の追加を実施する
設定するパラメータは VPN 設定するインタフェース(ここでは eth0 )の Zone 向けの設定で、IPはVPCのアドレス向けに設定すれば良い

set firewall name Untrust-Trust rule 1010 action accept
set firewall name Untrust-Trust rule 1010 destination address 192.168.128.0/20
set firewall name Untrust-Trust rule 1010 destination port 22
set firewall name Untrust-Trust rule 1010 log enable
set firewall name Untrust-Trust rule 1010 protocol tcp
set firewall name Untrust-Trust rule 1010 source address 10.10.0.0/20
set firewall name Untrust-Trust rule 1010 state new enable
set firewall name Untrust-Trust rule 1012 action accept
set firewall name Untrust-Trust rule 1012 destination address 192.168.128.0/20
set firewall name Untrust-Trust rule 1012 log enable
set firewall name Untrust-Trust rule 1012 protocol icmp
set firewall name Untrust-Trust rule 1012 source address 10.10.0.0/20
set firewall name Untrust-Trust rule 1012 state new enable

3.3. NAT 設定

外部向けに NAT している場合は、VPN を通すアドレスは NAT 対象から除外する
既存で rule 5000 で作成しており、今回は下記一行追加した。(全体はその次)
set service nat rule 5000 destination address '!10.10.0.0/20'

set service nat rule 5000 description Trust_to_Internet
set service nat rule 5000 destination address '!10.10.0.0/20'
set service nat rule 5000 log enable
set service nat rule 5000 outbound-interface eth0
set service nat rule 5000 protocol all
set service nat rule 5000 source address 192.168.128.0/20
set service nat rule 5000 type masquerade

3.4. MSS 設定

VPN を使用した通信を実施すると MTU の関係から SSH ができない状態を確認した。
下記の通り、少し雑ではあるが、VPN が通る inteface 向けに MSS 変更を実施する。(最適な MSS 値は環境による)

set firewall modify mss rule 1 action modify
set firewall modify mss rule 1 modify tcp-mss 1292
set firewall modify mss rule 1 protocol tcp
set firewall modify mss rule 1 tcp flags 'SYN,!RST'
set interfaces ethernet eth0 firewall in modify mss
set interfaces ethernet eth0 firewall out modify mss

3.5. 設定保存, 状態確認

下記コマンドで設定保存をする

commit; save

VPN が Peering できるようになったので、状態確認をする。

show vpn ipsec status, show vpn ipsec state で状態確認できる。
show vpn ipsec saSA 確立(ESTABLISHED) を確認できる。
※下記出力例。一部F,fでマスク. x.x.x.x は CloudVPN の Public IP. y.y.y.y は自宅ラボ側 Public IP.

$ show vpn ipsec status
IPSec Process Running PID: 3936

1 Active IPsec Tunnels

IPsec Interfaces :
        eth0    (192.168.10.66)

$ show vpn ipsec state 
src 192.168.10.66 dst x.x.x.x
        proto esp spi 0x43375b23 reqid 2 mode tunnel
        replay-window 0 flag af-unspec
        auth-trunc hmac(sha1) 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 96
        enc cbc(aes) 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
        encap type espinudp sport 4500 dport 4500 addr 0.0.0.0
        anti-replay context: seq 0x0, oseq 0x9c, bitmap 0x00000000
src x.x.x.x dst 192.168.10.66
        proto esp spi 0xc2e893e2 reqid 2 mode tunnel
        replay-window 32 flag af-unspec
        auth-trunc hmac(sha1) 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 96
        enc cbc(aes) 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
        encap type espinudp sport 4500 dport 4500 addr 0.0.0.0
        anti-replay context: seq 0xbb, oseq 0x0, bitmap 0xffffffff

$ show vpn ipsec sa
peer-x.x.x.x-tunnel-0: #9, ESTABLISHED, IKEv2, a0b0d76aefbb2b42_i* 8e46ea9a86585214_r
  local  'y.y.y.y' @ 192.168.10.66[4500]
  remote 'x.x.x.x' @ x.x.x.x[4500]
  AES_CBC-256/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048
  established 9426s ago, rekeying in 25535s
  peer-x.x.x.x-tunnel-0: #4, reqid 2, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-256/HMAC_SHA1_96/MODP_2048
    installed 245s ago, rekeying in 9548s, expires in 10555s
    in  cf95ba85,      0 bytes,     0 packets
    out a58c62b2,      0 bytes,     0 packets
    local  192.168.128.0/20
    remote 10.10.0.0/20

上記状態の通り、VPN 接続完了

おわりに

GCP に VPC を構築して自宅ラボと CloudVPN で接続を完了した
自宅ラボとクラウドが繋がったので、色々試していきたい

ただ、下記の通りまだ構成的にもやりたことが見えている
また、VPN は料金が発生する (Always Free 枠がない) ので注意

今後

今後やりたいと思っていることを3点記載する

Public IP 変更時の対応

マンションの Public IP (Global IP) が変わると CloudVPN の設定を変更しないといけない
これは、IP変更検知をして、登録変更の自動化を今後実施したい

VPN 断時に clear が必要

VPN切れた際に復旧させるためには、自宅ラボ側の VPN 機器 (ER-X) で下記が実施が必要

$ clear vpn ipsec-peer [Cloud VPN ゲートウェイの IP]

こちらは task scheduler を使用して VPN 断を検知して clear などをさせたい
(Public IP 変更対応とセットで対応)

高可用性(HA)対応の Cloud VPN ゲートウェイ / BGP で構築

今回は Classic VPN で作成したが、HA対応の Cloud VPN , BGP での経路交換の方に変更をしていきたい

料金について

VM インスタンスは Always Free のためいつまでも無料だが、CloudVPN はお金がかかる

VPN 料金

トラフィックはほぼ載せずに 約1ヶ月様子見すると、約4千円かかった。
最初に付与されるトライアルの無料クレジットがあるので請求は今のところないが、クレジットが無くなっても続けるには個人利用としては厳しい料金だった。

下記は使用料金例。
山になっているのは試しに複数建てた際のもので、通常時は1日129円となっていた。
スクリーンショット 2020-06-27 14.27.12.png

もう少し値下げとか、無料枠用意としてくれないかなぁ。。
もしくは必要な時だけすぐ構築できるように構築・破棄自動化を要検討。。

参考

Cloud VPN の概要
https://cloud.google.com/vpn/docs/concepts/overview?hl=ja

Google Cloud VPN Interop Guide Using Cloud VPN With VyOS
https://cloud.google.com/files/CloudVPNGuide-UsingCloudVPNwithVyOS.pdf?hl=ja

community.ui.com Site-to-site VPN and MSS clamping
https://community.ui.com/questions/Site-to-site-VPN-and-MSS-clamping/9ec02bdb-f327-4e6e-9199-bbdc5f639904

27
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
23