ネットワークエンジニアのITブログ

長らくネットワークで仕事をしてきましたが、ここ数年クラウドとサーバー系に触れる機会が増えて、クラウドのネットワークというのが自分の性分にはあっているようです。最近のお気に入りはNSXALBとGoogle Cloud。

Google Cloudとオンプレミス環境をVPN接続する方法

富士ソフトの佐藤です。
Google Cloudに環境を構築した後、既存の社内環境と接続する必要が出てくることがあります。セキュアかつ高速で安定した経路としてInterConnectがおすすめですが、コストをかけずに迅速に接続したい場合は、VPN接続が適しています。
今回は、Google Cloudと社内環境に見立てた自宅のホームラボ環境をVPN接続し、自宅からGoogle Cloudに接続する方法をご紹介します。

構成

ホームラボのゲートウェイであるFortigate60DとGoogle CloudのCloud VPNVPN接続を行い、さらにCloud RouterとBGPによるルート情報の交換を行うことで、通信を可能にします。
Compute Engineはすでに構築済みで、Webサーバーとして起動しています。


Cloud VPNの概要

Cloud VPNは、IPsec VPN接続を使用してピアネットワークをVPCネットワークに安全に拡張するサービスです。
ネットワーク間のトラフィックを暗号化し、VPNゲートウェイ間で暗号化と復号を行うことで、送信中のデータを保護します。
主なVPN接続サービスには以下の2種類があります。

HA VPN(高可用性VPN

  • 2つのインターフェースと2つの外部IPアドレスを持ち、冗長構成が可能
  • 動的ルーティング(BGP)をサポート
  • 99.99%のサービス可用性SLAを提供
  • IPv6をサポート
  • 最新かつ推奨されるVPNサービス

Classic VPN

  • 従来型のVPNサービス

利用シーン

Cloud VPNは以下のような場合に利用されます

  • オンプレミス環境とGoogle Cloud環境の接続
  • 異なるVPCネットワーク間の接続
  • リモートワーク環境からの安全なアクセス確保
  • クラウド間接続(例:AWSやAzureとの接続)

設計時の考慮ポイント

Cloud VPNを設計する際は、以下の点を考慮することが重要です。

プロジェクト構成

Cloud VPNリソースとCloud Routerリソースを他のGoogle Cloudリソースとは別のプロジェクトに配置することで、IAMのロールと権限の構成が簡素化されます。

ルーティングとフェイルオーバー

動的ルーティングとBGPを使用するCloud VPNゲートウェイを選択し、可能な限りHA VPNを使用します。

トンネル構成

HA VPNトンネルが2つある場合はアクティブ/パッシブ構成、3つ以上ある場合はアクティブ/アクティブ構成を使用します。

セキュリティ対策

  • VPNトンネル内のトラフィックを暗号化し、データの機密性を確保します。
  • ファイアウォールルールを適切に設定し、不要なトラフィックをブロックします。
  • ログ記録と監視を行い、異常なアクティビティを検出できるようにします。

パフォーマンス最適化

コンプライアンス要件

業界標準や法規制に準拠したVPN設定を行い、必要に応じて暗号化アルゴリズムや鍵長を調整します。

テストと検証

本番環境に展開する前に、テスト環境でVPN接続の動作を確認します。

設定手順概要

Cloud VPNの設定手順
1.VPN設定ウィザードの起動
2.VPNオプションの選択
3.Cloud HA VPNゲートウェイの作成
4.VPNトンネルの追加
5.Cloud Routerの設定
6.BGPセッションの構成
7.設定の確認とサンプル構成ファイルのダウンロード

ホームラボのFortigate60Dの設定手順
1.サンプル構成ファイルの修正
2.CLIからの設定の適用
3.VPNトンネルの確認
4.BGPルーティングの確認

Cloud VPNの設定手順

1.JITHUBプロジェクトで、 [ネットワーク接続]-[VPN]を選択し、[+VPN設定ウィザード]を選択する。
2.VPNオプションで、「高可用性(HA)VPN」選択し、「続行」をクリックする。

3.「①Cloud HA VPNゲートウェイの作成」で以下の情報を入力し、「作成して続行」を選択する。
  VPNゲートウェイの名前:gcvpngw
  ネットワーク:mainvpc
  リージョン:asia-northeast1(東京)
  VPNゲートウェイのIPバージョン:IPv4
  VPNゲートウェイのIPスタックタイプ:IPv4(シングルスタック)

4.「②VPNトンネルの追加」で以下の情報を入力し、「作成して続行」を選択する。
  ピアVPNゲートウェイ:オンプレミス、または Google Cloud 以外
  ピアVPNゲートウェイの名前:「新しいピアVPNゲートウェイを作成する」を選択
  名前:fgt60d
  インタフェース:1つのインターフェース
  インタフェース0のIPアドレス:183.180.20.137 ←Fortigate60DのグロバールIPを入力する
  高可用性:VPNトンネルを1つ作成する

5.引き続き以下の情報を入力する。
  Cloud Router:「新しいルーターを作成」を選択する。
  名前:vpnrouter
  Google ASN:64640
  ルート:Cloud Routerに表示されるすべてのサブネットにアドバタイズ(デフォルト)

6.引き続き以下の情報を入力する。
  Cloud Router:vpnrouter
  名前:vpntunnel01
  IKE事前共有鍵キー:xxxxxxxx

7.「+VPNTUNNEL01用のBPGセッションを構成」を選択する。

8.「BGPセッションの作成」で以下の情報を入力し、「保存して次へ」を選択する。
  BGPセッションの種類:IPv4 BGPセッション
  名前:bgpsession01
  ピアASN:65000 ←Fortigateでは、65000でBGPのASNを設定している
  BGP IPv4アドレスを割り当てる:自動

9.BGPの設定が反映されたことを確認して、「BGP構成を保存」を選択する。

10.「リマインダー」の下にある「構成をダウンロード」を押下すると、オンプレ環境用のサンプル構成ファイルをダウンロードできるので、該当するベンダー、プラットフォーム、ソフトウェアを選択してください。
なお、Fortigateは1つしか設定ファイルがなかったので、これをダウンロードします。

サンプル構成ファイルは以下となります。

# Google Cloud
# Configuration generated for fgt60d, project: jithub-414902.
#
# This configuration contains _SNAKE_CASE_ variables which are required to be
# replaced by the network engineer setting up the GCP <-> Prem VPN tunnels.
#
# These values are as follows:
#   > _IKE_SHARED_SECRET_PLACEHOLDER_ if configuration is downloaded after creation in GCP, this is where pre-shared secret is replaced.
#   > _CUSTOMER_ONPREM_IP_ ip component of on-premise IP range e.g. 172.10.11.0/24 => 172.10.11.0
#   > _CUSTOMER_ONPREM_NETMASK_ netmask component of GCP on-premise IP range e.g. 172.10.11.0/24 => 24 => 255.255.255.0
# Other
#   > Port assignment assumes no prior set up for virtual port assignments
#   > aes256-sha1 algorithms are chosen as a sensible default; if modified, pay
#     mind to MTU differences
config system interface
    edit port1
        set vdom root
        set mode static
        set ip 169.254.76.222 255.255.255.252
        set allowaccess ping https ssh
        set description wan1
    next
    edit port2
        set vdom root
        set mode static
        set ip _CUSTOMER_ONPREM_IP_ _CUSTOMER_ONPREM_NETMASK_
        set allowaccess ping
        set description lan1
    next
end

# phase1
config vpn ipsec phase1-interface
    edit GCP-HA-VPN-INT0
        set interface port1
                set ike-version 2
                set keylife 36000
        set peertype any
        set proposal aes256-sha1
        set remote-gw 34.157.78.15
        set local-gw 183.180.20.137
        set psksecret VMwarevmware1! 
    next
end

# phase2
config vpn ipsec phase2-interface
    edit GCP-HA-VPN-INT0
        set phase1name GCP-HA-VPN-INT0
        set proposal aes256-sha1
        set dhgrp 15
        set keylifeseconds 10800
    next
end

# tunnel interfaces
config system interface
    edit GCP-HA-VPN-INT0
        set ip 169.254.76.222 _CUSTOMER_ONPREM_NETMASK_TUNNEL0_
        set remote-ip 169.254.76.221 255.255.255.252
    next
end

# Configure BGP settings
config router bgp
    set as 65000
    set router-id 169.254.76.222
    config neighbor
        edit 169.254.76.221
            set soft-reconfiguration enable
            set remote-as 64640
        next
    end
    config redistribute connected
        set status enable
    end
end

# Configure the firewall policy to allow traffic
config firewall policy
    edit 1
        set name allow-gcp-to-lan
        set srcintf  GCP-HA-VPN-INT0
        set dstintf port2
        set srcaddr all
        set dstaddr all
        set action accept
        set schedule always
        set service ALL
    next
    edit 2
        set name allow-lan-to-gcp
        set srcintf port2
        set dstintf  GCP-HA-VPN-INT0
        set srcaddr all
        set dstaddr all
        set action accept
        set schedule always
        set service ALL
    end
end

ホームラボのFortigate60Dの設定手順

VPN設定の実施

サンプル構成ファイルの情報をもとに、インタフェースの設定を書き換えて、CLIから流し込みを行います。
以下、変更した箇所です。
port1 → wan1
port2 → internal1
psksecret → マスクしています
_CUSTOMER_ONPREM_NETMASK_TUNNEL0_ → 255.255.255.255

# phase1
config vpn ipsec phase1-interface
   edit GCP-HA-VPN-INT0
       set interface "wan1"
       set ike-version 2
       set keylife 36000
       set peertype any
       set proposal aes256-sha1
       set dhgrp 5 2
       set nattraversal disable
       set remote-gw 34.157.78.15
       set psksecret xxxxxxxx
   next
end

# phase2
config vpn ipsec phase2-interface
   edit GCP-HA-VPN-INT0
       set phase1name GCP-HA-VPN-INT0
       set proposal aes256-sha1
       set dhgrp 15
       set auto-negotiate enable
       set keylifeseconds 10800
   next
end

# tunnel interfaces
config system interface
    edit GCP-HA-VPN-INT0
        set ip 169.254.76.222 255.255.255.255
        set remote-ip 169.254.76.221 255.255.255.252
        set allowaccess ping
        set type tunnel
        set interface "wan1"
    next
end

# Configure BGP settings
config router bgp
    config neighbor
        edit 169.254.76.221
            set remote-as 64640
        next
    end
end

# Configure the firewall policy to allow traffic
config firewall policy
    edit 151
        set name allow-gcp-to-lan
        set srcintf "GCP-HA-VPN-INT0"
        set dstintf "internal1"
        set srcaddr all
        set dstaddr all
        set action accept
        set schedule always
        set service ALL
    next
    edit 152
        set name allow-lan-to-gcp
        set srcintf "internal1"
        set dstintf "GCP-HA-VPN-INT0"
        set srcaddr all
        set dstaddr all
        set action accept
        set schedule always
        set service ALL
    end
end
VPNトンネルの確認

設定が完了すると、VPNトンネルがアップし接続していることを確認できました。

BGPルーティングの確認

また、VPN経由でGoogle Cloudのネットワーク情報をBGPで受信していることを確認できました。

動作確認

オンプレ環境の仮想マシン(192.168.10.91)から、Google CloudのCompute Engine(10.24.1.3)への接続を確認します。
pingcurlコマンドを使用して、接続性とWebサーバーの応答を確認しました。

[root@cent91 ~]#
[root@cent91 ~]# ping 10.24.1.3 -c 3
PING 10.24.1.3 (10.24.1.3) 56(84) bytes of data.
64 バイト応答 送信元 10.24.1.3: icmp_seq=1 ttl=61 時間=49.8ミリ秒
64 バイト応答 送信元 10.24.1.3: icmp_seq=2 ttl=61 時間=54.4ミリ秒
64 バイト応答 送信元 10.24.1.3: icmp_seq=3 ttl=61 時間=54.4ミリ秒

--- 10.24.1.3 ping 統計 ---
送信パケット数 3, 受信パケット数 3, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 49.844/52.885/54.408/2.150 ms
[root@cent91 ~]#
[root@cent91 ~]#
[root@cent91 ~]# curl -v http://10.24.1.3
*   Trying 10.24.1.3:80...
* Connected to 10.24.1.3 (10.24.1.3) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.24.1.3
> User-Agent: curl/7.76.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Sun, 06 Oct 2024 12:39:04 GMT
< Server: Apache/2.4.62 (CentOS Stream)
< Last-Modified: Sun, 06 Oct 2024 10:44:04 GMT
< ETag: "69f-623cc95439ba1"
< Accept-Ranges: bytes
< Content-Length: 1695
< Content-Type: text/html; charset=UTF-8
<

まとめ

以上で、Google CloudとオンプレミスのVPN接続の設定と確認が完了しました。
今回の検証では、VPNトンネルを1つしか設定していませんが、Cloud Routerは、2つのインターフェースを持っているので、設定することで耐障害性を高めたり、負荷分散したりすることも可能です。
この方法を使用することで、セキュアかつ効率的なネットワーク接続を実現してみてください。