はじめに
GCP でゼロから VPC を構築し、VPC 内に仮想マシン (GCE/Compete Engine) も構築する
自宅ラボのネットワークと VPC を接続する VPN を構築し、リソース間で直接疎通可能にする (Cloud VPN)
最終的に Internet → VPC内踏み台サーバ(GCE) → 自宅ラボサーバ とアクセスできるようにする(2段 SSH)
下記 GCP (Google CloudPlatform) 内の VPC 構築全てと、自宅ラボ(Home Lab) の VPN 設定が対象
環境
自宅ネットワーク機器
- EdgeRouter-X (以後, ER-X)
- Ubiquiti Networks 製
- Vyatta フォークで似た操作感の OS で動く Router で、Amazon で ¥9,999 (2020.06.21時点) でとてもコスパがいい
- Vyatta / VyOS と少し違うが大体同じナレッジが使えるので、今回も VyOS 向けの VPN 設定を参考にしている
自宅ネットワーク環境
- Internet 向けはマンション側が提供しているネットワーク
- 192.168.x.x のプライベートアドレスのみが DHCP でのみ提供され、グローバルIPはマンションで共有のもの
- グローバルIP / プライベートIPの変換はマンション側提供でユーザ側には提供されていない
GCP
- 個人契約の VPC でフル権限を持っている
- 自宅ネットワークとは被らないアドレスで VPC を構築する
全体構成
- VPC
- vpc01 という VPC を構築する
- Subnet
- 名前: public-subnet01
- アドレスセグメント: 10.10.0.0/20
- Compute Engine (GCE)
- centos7 で無料枠 / Always Freeで 1台作成
- Cloud Firewall Rules
- Internet → VPC
- TCP Port 22 (SSH) 許可
- Internet → VPC
- 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がアサインされる動作)
- ER-X (EdgeRouter-X)
構築ステップ
- VPC / Compute Engine (踏み台サーバ) の構築
- CloudVPN の作成
- 自宅ラボネットワーク VPN 設定 (ER-X)
1. VPC / Compute Engine (踏み台サーバ) の構築
VPC / Compute Engine の構築、Internet から SSH の許可を実施する
実施内容は下記の通り
- VPC ネットワーク作成
- サービスアカウント作成
- Compute Engine で VM インスタンスを作成
- ファイアウォール設定
- 接続確認
1.1 VPC ネットワーク作成
今回使用する VPC ネットワークを作成する
- ナビゲーションメニュー (左上の三本線) から下記を開く
- 「ネットワーキング」 → 「VPC ネットワーク」
- 「+VPC ネットワークを作成」 を選択
名前やサブネットの設定を実施
- 本例でのパラメータ
- 名前: vpc01
- サブネット
- 名前: public-subnet01
- リージョン: us-west1
- IP アドレス範囲: 10.10.0.0/20
- 動的ルーティングモード
- グローバル
作成クリックして VPC ネットワークの作成完了
1.2 サービスアカウント作成
今回作成する VM インスタンス向けのサービスアカウントを作成する
(このサービスアカウントを Firewall Rules で紐付けて SSH 許可を実施する)
- 「IAM と管理」 → 「サービス アカウント」
- 「+ サービス アカウントを作成」
- サービス アカウント名 だけ入力してあとは「作成」
今回使用するサービスアカウント作成完了
1.3 Compute Engine で VM インスタンスを作成
今回の踏み台サーバとして、試しにログインなどできるように VM を1台作成する
スペック等は無料枠 / Always Freeの範囲で作成する
- 「コンピューティング」 → 「Compute Engine」 → 「VM インスタンス」
- 「+アイコン (インスタンスの作成)」をクリック
インスタンスの設定
- リージョン: us-west1
- マシンタイプ: f1-micro
- ブートディスク: CentOS7 30GB
- サービスアカウント: 作成したサービスアカウントを指定
セキュリティ: SSH公開鍵を貼り付ける
- ここではリモートログインする PC で作成した RSA の公開鍵(id_rsa.pub)の内容を貼り付けた
- ここで貼り付けた公開鍵のユーザが VM に作成され SSH が可能な状態で作成される
ネットワーキング: 作成した VPC およびサブネットを指定する
最後に作成をクリックして VM インスタンス作成完了
1.4 ファイアウォール設定
次に、Internet から作成した VM へ SSH ができるルールを作成する
下記パラメータでファイアウォール ルールを作成する
- ネットワーク: 作成した VPC (vpc01)
- ターゲット: 指定されたサービス アカウント
- ターゲット サービス アカウント: 作成したサービスアカウント名 (public-server)
- ソースフィルタ: IP範囲
- ソース IP の範囲: 0.0.0.0/0
- プロトコルとポート: 指定したプロトコルとポート
- tcp: 22
作成をクリックしてファイアウォールルール作成完了
1.5 接続確認
ここまでで VPC および GCE での VM インスタンス作成が完了し、
インターネットから VM の Public IP へ SSH 接続が可能
VM インスタンスの IP は VM インスタンス管理画面の外部 IP をみることで確認可能
ssh [公開鍵でのユーザ名]@[作成した VM インスタンスの外部 IP(public ip)]
ログイン確認できれば VPC / GCE 作成まで完了
2. CloudVPN の作成
自宅ラボネットワークへ接続する VPN を構築するため、CloudVPN の構築・設定を実施する
合わせて、自宅ラボから VPC へもアクセスできるように Firewall Rule も追加しておく
CloudVPNの作成
VPN設定画面へ移動
- 「ネットワーキング」 → 「ハイブリッド接続」 → 「VPN」
「+ VPN 設定ウィザード」をクリック
今回はシンプルに Classic の方を使用する
- 「Classic VPN」を選択
各種パラメータを入力
- 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)
最後に「作成」をクリック
※途中のIPアドレスでの静的アドレス予約の画面
構築完了すると下記のような画面になる
(下記画像は、全て構築完了後でのキャプチャ。VPNトンネルのステータスは 3 自宅ラボネットワーク VPN 設定 完了後に確立済みになる)
これで、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
作成を押して、Firewall Rule 作成完了
以上で、GCP 側の自宅ラボ VPN 接続系の設定完了
3. 自宅ラボネットワーク VPN 設定 (ER-X)
自宅ラボ側のルータへの VPN 設定の追加を実施する
- Interface
- eth0
- 外部向けのInteface
- dhcp でグローバルと通信可能なプライベートアドレスを取得している
- eth0
- firewall
- zone base の Firewall を設定している
- Untrust-Trust
- 外部から自宅ラボ内のサーバへのファイアウォールルール
- Untrust が eth0 (外部向け Inteface), Trust が自宅ラボネットワークで、Untrust から Trust 向けのルール
- 追加ルールとして今回の GCP VPC セグメントの許可を追加する
- nat
- 外部向けに NAT している
- VPC 向けアドレスを NAT 対象から除外する必要がある
下記の順で設定する
- VPN 設定
- Firewall 設定
- NAT 設定
- MSS 設定
- 設定保存, 状態確認
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 sa
で SA 確立(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円となっていた。
もう少し値下げとか、無料枠用意としてくれないかなぁ。。
もしくは必要な時だけすぐ構築できるように構築・破棄自動化を要検討。。
参考
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