VPC フローログの使用

VPC フローログは、VM インスタンスによって送受信されるネットワーク フローのサンプルを記録します。これらのログは、ネットワーク モニタリング、フォレンジック、リアルタイム セキュリティ分析、および費用の最適化に使用できます。

フローログは Stackdriver Logging で表示できます。また、Stackdriver Logging でのエクスポートでサポートされる任意の宛先(Cloud Pub/SubBigQuery など)にログをエクスポートできます。

フローログは、Compute Engine VM からの接続ごとに 5 秒間隔で集計され、リアルタイムでエクスポートされます。Cloud Pub/Sub に登録すると、リアルタイム ストリーミングの API を使用してフローログを分析できます。

基本特性

  • VPC サブネットごとに VPC フローログを有効または無効にできます。サブネットに対して有効になっている場合、VPC フローログはそのサブネット内のすべての VM インスタンスからデータを収集します。
  • VM は、すべての TCP フローと UDP フローについて報告します。各フローレコードには、レコードの形式セクションで説明されている情報が含まれます。
  • 各 VM は、監視する TCP フローと UDP フローのインバウンドとアウトバウンドをサンプリングし、そのフローの送受信が、別の VM、オンプレミス データセンターのホスト、Google サービス、またはインターネット上のホストのどれに対して行われているかを確認します。通信している 2 つの GCP VM が両方とも、VPC フローログが有効になっているサブネットにある場合、両方の VM がフローを報告します。
  • フィルタを使用して、Stackdriver Logging から除外するフローログと、外部 API にエクスポートするフローログを選択できます。
  • VPC フローログは、VPC ネットワーク インフラストラクチャのネットワーキング スタックにネイティブで組み込まれています。記録対象である IP パケットの宛先へのルーティングでは、余分な遅延やパフォーマンスの低下は発生しません。

使用例

ネットワーク モニタリング

VPC フローログを使用すると、ネットワークのスループットとパフォーマンスをリアルタイムで把握できます。以下を実現できます。

  • VPC ネットワークをモニタリングする
  • ネットワーク診断を実行する
  • VM とアプリケーションによりフローログをフィルタ処理して、トラフィックの変化を理解する
  • トラフィックの増加を把握し、キャパシティの予測に役立てる

ネットワーク使用方法の理解とネットワーク トラフィック費用の最適化

VPC フローログを使用すると、ネットワーク使用量を分析できます。ネットワーク フローを分析して次のことを把握できます。

  • リージョンとゾーンの間のトラフィック
  • インターネットでの特定の国へのトラフィック
  • トラフィック使用量が特に多いプロセス

分析を基にして、ネットワーク トラフィックの費用を最適化できます。

ネットワーク フォレンジック

VPC フローログをネットワーク フォレンジックに利用できます。たとえば、インシデントが発生した場合、以下を調べることができます。

  • どの IP が、いつ、どの相手と情報をやり取りしたか
  • 不正使用された IP(すべての受信と送信のネットワーク フローを分析して調査)

リアルタイムのセキュリティ分析

リアルタイム ストリーミングの API を(Cloud Pub/Sub 経由で)活用し、SIEM(Security Information and Event Management)システムと統合できます。これにより、リアルタイムのモニタリング、イベントの相関、分析、およびセキュリティ アラートを提供できます。

ログの収集

フローログは、5 秒ごとに各 VM 接続に関して収集されます。次に、このデータにアノテーションが付けられ、ここで説明されているデータと形式を使用して送信されます。一部のフィールドはマルチ フィールド形式であり、所定のフィールドに複数のデータが含まれます。たとえば、connection フィールドは IpConnection 形式であり、送信元と宛先の IP アドレスおよびポートに加え、プロトコルが 1 つのフィールドに含まれています。

これらのマルチ フィールドについては、下記のレコードの形式に関する表で説明します。

レコードの形式

フィールド フィールドの形式 フィールド タイプ: 基本またはオプションのメタデータ
connection IpConnection
この接続を説明する 5 タプル。
基本
start_time 文字列
集計対象である時間間隔で最初に観測されるパケットのタイムスタンプ(RFC 3339 の日付文字列形式)
基本
end_time 文字列
集計対象である時間間隔で最後に観測されるパケットのタイムスタンプ(RFC 3339 の日付文字列形式)
基本
bytes_sent int64
送信元から宛先に送信されるバイト数
基本
packets_sent int64
送信元から宛先に送信されるパケット数
基本
rtt_msec int64
時間間隔中に測定されるレイテンシ(対象は TCP フローのみ)。これは、SEQ を送信してから対応する ACK を受信するまでの経過時間であり、ネットワークの RTT とアプリケーション関連の遅延が含まれます。
基本
reporter 文字列
フローを報告した側。「SRC」と「DEST」のいずれかになります。
基本
src_instance InstanceDetails
接続の送信元が、同じ VPC 上に存在する VM であった場合、このフィールドには VM インスタンスの詳細が設定されます。共有 VPC 構成では、project_id はインスタンスを所有するプロジェクト(通常は、サービス プロジェクト)に相当します。
メタデータ
dest_instance InstanceDetails
接続の宛先が、同じ VPC 上に存在する VM であった場合、このフィールドには VM インスタンスの詳細が設定されます。共有 VPC 構成では、project_id はインスタンスを所有するプロジェクト(通常は、サービス プロジェクト)に相当します。
メタデータ
src_vpc VpcDetails
接続の送信元が、同じ VPC 上に存在する VM であった場合、このフィールドには VPC ネットワークの詳細が設定されます。共有 VPC 構成では、project_id はホスト プロジェクトの ID に相当します。
メタデータ
dest_vpc VpcDetails
接続の宛先が、同じ VPC 上に存在する VM であった場合、このフィールドには VPC ネットワークの詳細が設定されます。共有 VPC 構成では、project_id はホスト プロジェクトの ID に相当します。
メタデータ
src_location GeographicDetails
接続の送信元が Google VPC の外部であった場合、このフィールドには利用可能な位置情報メタデータが設定されます。
メタデータ
dest_location GeographicDetails
接続の宛先が Google VPC の外部であった場合、このフィールドには利用可能な位置情報メタデータが設定されます。
メタデータ

IpConnection フィールドの形式

フィールド 説明
src_ip 文字列 送信元 IP アドレス
src_port int32 送信元ポート
dest_ip 文字列 宛先 IP アドレス
dest_port int32 宛先ポート
protocol int32 IANA プロトコル番号

InstanceDetails フィールドの形式

フィールド 説明
project_id 文字列 VM を含むプロジェクトの ID
vm_name 文字列 VM のインスタンス名
region 文字列 VM のリージョン
zone 文字列 VM のゾーン

VpcDetails フィールドの形式

フィールド 説明
project_id 文字列 VPC を含むプロジェクトの ID
vpc_name 文字列 VM が動作している VPC
subnetwork_name 文字列 VM が動作しているサブネットワーク

GeographicDetails フィールドの形式

フィールド 説明
continent 文字列 外部エンドポイントの大陸
country 文字列 外部エンドポイントの国
region 文字列 外部エンドポイントのリージョン
city 文字列 外部エンドポイントの都市
asn int32 このエンドポイントが属する外部ネットワークの自律システム番号(ASN)

トラフィック パターンの例

このセクションでは、次のユースケースでの VPC フローログの動作を示します。

  • 同一 VPC 内での VM から VM へのフロー
  • VM から外部へのフロー
  • 共有 VPC での VM から VM へのフロー
  • VPC ピアリングでの VM から VM へのフロー
  • 内部負荷分散での VM から VM へのフロー

同一 VPC 内での VM から VM へのフロー

VPC 内での VM のフロー(クリックで拡大)
VPC 内での VM のフロー(クリックで拡大)

同じ VPC での VM から VM へのフローの場合、VPC フローログが有効になっているサブネット内に要求側の VM と応答側の VM の両方がある場合に限り、フローログはそれら両方の VM から報告されます。この例では、VM 10.10.0.1 が 1224 バイトのリクエストを、同様にロギングが有効になっているサブネット内にある VM 10.50.0.2 に送信します。次に、10.50.0.2 は 5342 バイトを含む応答でリクエストに応答します。リクエストと応答の両方が、要求側 VM と応答側 VM の両方から記録されます。

要求側 VM(10.10.0.1)による報告
リクエスト / 応答 connection.src_ip connection.dest_ip sent_bytes VPC アノテーション
リクエスト 10.10.0.1 10.50.0.2 1224 src_instance.*
dest_instance.*
src_vpc.*
dest_vpc.*
応答 10.50.0.2 10.10.0.1 5342 src_instance.*
dest_instance.*
src_vpc.*
dest_vpc.*
応答側 VM(10.50.0.2)による報告
リクエスト / 応答 connection.src_ip connection.dest_ip bytes VPC アノテーション
リクエスト 10.10.0.1 10.50.0.2 1224 src_instance.*
dest_instance.*
src_vpc.*
dest_vpc.*
応答 10.50.0.2 10.10.0.1 5342 src_instance.*
dest_instance.*
src_vpc.*
dest_vpc.*

VM から外部へのフロー

VM から外部へのフロー(クリックで拡大)
VM から外部へのフロー(クリックで拡大)

VM と外部エンティティ間のフローの場合、フローログは VM からのみ報告されます。

  • 下りフローの場合、ログはトラフィックの送信元である VM から報告されます。
  • 上りフローの場合、ログはトラフィックの宛先である VM から報告されます。

これは次のトラフィックに適用されます。

  • VPN または Cloud Interconnect を経由する、VPC ネットワークとオンプレミス ネットワーク間のトラフィック
  • VM とインターネット上のロケーションの間のトラフィック

次の例では、VM 10.10.0.1 とオンプレミス エンドポイント 10.30.0.2 は、VPN ゲートウェイまたは Cloud Interconnect を介して接続されています。10.10.0.1 から 10.30.0.2 に送信された 1224 バイトの発信トラフィックは、送信元 VM 10.10.0.1 から報告されます。10.30.0.2 から 10.10.0.1 に送信された 5342 バイトの受信トラフィックは、トラフィックの宛先である VM 10.10.0.1 から報告されます。

リクエスト / 応答 connection.src_ip connection.dest_ip sent_bytes VPC アノテーション
リクエスト 10.10.0.1 10.30.0.2 1224 src_instance.*
src_vpc.*
dest_location.*
応答 10.30.0.2 10.10.0.1 5342 dest_instance.*
dest_vpc.*
src_location.*

共有 VPC での VM から VM へのフロー

共有 VPC でのフロー(クリックで拡大)
共有 VPC でのフロー(クリックで拡大)

共有 VPC での VM から VM へのフローの場合は、ホスト プロジェクトでサブネットに対して VPC フローログを有効にできます。たとえば、サブネット 10.10.0.0/20 が、ホスト プロジェクトで定義されている共有 VPC ネットワークに属しているとします。このサブネットに属する VM のフローログを確認できます(サービス プロジェクトによって作成されたものを含みます)。この例では、サービス プロジェクトは "webserver"、"recommendation"、"database" と呼ばれます。

VM から VM へのフローの場合に、両方の VM が同じプロジェクト内にある場合、または共有ネットワーク内にある場合、同じホスト プロジェクトや、プロジェクト ID のアノテーションなどが接続のもう一方のエンドポイントで提供されます。他の VM が別のプロジェクトにある場合、その他の VM のアノテーションは提供されません。

次の表には、10.10.0.1 または 10.10.0.20 のいずれかで報告されるフローが示されています。

  • VPC サブネットはホスト プロジェクトに属するため、src_vpc.project_iddest_vpc.project_id はホスト プロジェクト用のものです。
  • インスタンスはサービス プロジェクトに属するため、src_instance.project_iddest_instance.project_id はサービス プロジェクト用のものです。
connection
.src_ip
src_instance
.project_id
src_vpc
.project_id
connection
.dest_ip
dest_instance
.project_id
dest_vpc
.project_id
10.10.0.1 webserver host_project 10.10.0.20 recommendation host_project

サービス プロジェクトは独自の共有 VPC ネットワークを所有していないため、共有 VPC ネットワークのフローログにアクセスできません。

VPC ピアリングでの VM から VM へのフロー

VPC ピアリングでのフロー(クリックで拡大)
VPC ピアリングでのフロー(クリックで拡大)

両方の VM が同じ GCP プロジェクトにない場合、ピアリングされた VPC の VM から VM へのフローは外部エンドポイントの場合と同じ方法で報告されます。他の VM に関するプロジェクトとその他のアノテーション情報は提供されません。両方の VM が同じプロジェクトにある場合、異なるネットワーク上にある場合でも、プロジェクトとその他のアノテーション情報は他の VM についても提供されます。

次の例では、プロジェクト analytics-prod の VM 10.10.0.1 およびプロジェクト webserver-test の VM 10.50.0.2 のサブネットが VPC ピアリングで接続されています。VPC フローログがプロジェクト analytics-prod で有効になると、10.10.0.1 から 10.50.0.2 に送信されるトラフィック(1224 バイト)が、フローの送信元である VM 10.10.0.1 から報告されます。10.50.0.2 から 10.10.0.1 に送信されるトラフィック(5342 バイト)も、フローの宛先である VM 10.10.0.1 から報告されます。

この例では、VPC フローログはプロジェクト webserver-test で有効になっていないため、VM 10.50.0.2 でログは記録されません。

reporter connection.src_ip connection.dest_ip sent_bytes VPC アノテーション
送信元 10.10.0.1 10.50.0.2 1224 src_instance.*
src_vpc.*
宛先 10.50.0.2 10.10.0.1 5342 dest_instance.*
dest_vpc.*

内部負荷分散での VM から VM へのフロー

内部負荷分散でのフロー(クリックで拡大)
内部負荷分散でのフロー(クリックで拡大)

内部ロードバランサのバックエンド サービスに VM を追加すると、Linux または Windows のゲスト環境によってロードバランサの IP アドレスが VM のローカル ルーティング テーブルに追加されます。これにより、VM はロードバランサの IP アドレスに宛先が設定されたリクエスト パケットを受け入れられるようになります。VM が応答すると、そのレスポンスが直接送信されます。ただし、レスポンス パケットの送信元 IP アドレスは、負荷分散される VM ではなく、ロードバランサの IP アドレスに設定されます。

内部ロードバランサを経由して送信される VM から VM へのフローは、送信元と宛先の両方から報告されます。HTTP リクエスト / レスポンスのペアの例について、監視されたフローログのエントリに使用されるフィールドを以下の表で説明します。これを示すために、以下のネットワーク構成を想定します。

  • ブラウザ インスタンス(10.100.0.2)
  • ウェブサーバー インスタンス(10.100.0.3)
  • 内部ロードバランサ(10.100.0.4)
トラフィックの方向 reporter connection.src_ip connection.dest_ip connection.src_instance connection.dest_instance
リクエスト SRC 10.100.0.2 10.100.0.4 ブラウザ インスタンス
リクエスト DEST 10.100.0.2 10.100.0.4 ブラウザ インスタンス ウェブサーバー インスタンス
レスポンス SRC 10.100.0.4 10.100.0.2 ウェブサーバー インスタンス ブラウザ インスタンス
レスポンス DEST 10.100.0.4 10.100.0.2 ブラウザ インスタンス

要求側 VM は、どの VM がリクエストに応答するか認識しません。また、他の VM は送信元アドレスとして内部ロードバランサの IP を使用してレスポンスを送信するため、どの VM が応答したかも認識しません。このため、要求側 VM は dest_instance 情報をそのレポートに追加できず、追加できるのは src_instance 情報のみです。応答側 VM は他の VM の IP アドレスを把握しているため、src_instancedest_instance の両方の情報を提供できます。

VPC フローログの有効化

VPC フローログを有効にすると、サブネット内のすべての VM に対して有効にすることになります。

サブネット作成時の VPC フローログの有効化

Console

  1. Google Cloud Platform Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. サブネットを追加するネットワークをクリックします。
  3. [サブネットを追加] をクリックします。
  4. [フローログ] で [オン] を選択します。
  5. 必要に応じて他のフィールドに値を入力します。
  6. [追加] をクリックします。

gcloud

gcloud compute networks subnets create [NAME] \
    --enable-flow-logs
    [other flags as needed]

既存のサブネットの VPC フローロギングの有効化

Console

  1. Google Cloud Platform Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. 更新するサブネットをクリックします。
  3. [編集] をクリックします。
  4. [フローログ] で [オン] を選択します。
  5. [保存] をクリックします。

gcloud

gcloud compute networks subnets update [NAME] \
    --enable-flow-logs

サブネットの VPC フローロギングの無効化

Console

  1. Google Cloud Platform Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. 更新するサブネットをクリックします。
  3. [編集] をクリックします。
  4. [フローログ] で [オフ] を選択します。
  5. [保存] をクリックします。

gcloud

gcloud compute networks subnets update [NAME] \
    --no-enable-flow-logs

Stackdriver Logging 経由でのログへのアクセス

IAM の構成

Stackdriver Logging のアクセス制御ガイドの手順に沿って操作します。

[ログビューア] ページからログを表示します。

これらのコマンドには、プロジェクトのプロジェクト ID が必要です。

すべてのフローログへのアクセス

  1. Google Cloud Platform Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. 最初のプルダウン メニューで [サブネットワーク] を選択します。
  3. 2 番目のプルダウン メニューで [vpc_flows] を選択します。

または、[ログ] ページに移動して、[ラベルまたはテキスト検索でフィルタ] フィールドに次の文字列を貼り付けます。

resource.type="gce_subnetwork"
logName="projects/{#project_id}/logs/compute.googleapis.com%2Fvpc_flows"

特定のサブネットのログへのアクセス

  1. Google Cloud Platform Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. 最初のプルダウン メニューで [サブネットワーク] > サブネットの名前を選択します。
  3. 2 番目のプルダウン メニューで [vpc_flows] を選択します。

または、[ログ] ページに移動して、[ラベルまたはテキスト検索でフィルタ] フィールドに次の文字列を貼り付けます。

resource.type="gce_subnetwork"
logName="projects/{#project_id}/logs/compute.googleapis.com%2Fvpc_flows"
resource.labels.subnetwork_name="{#subnetwork_name}"

特定の VM のログへのアクセス

  1. Google Cloud Platform Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドに次の文字列を貼り付けます。
    resource.type="gce_subnetwork"
    logName="projects/{#project_id}/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.src_instance.vm_name="{#vm_name}"
    

特定の接頭辞に対するトラフィックのログへのアクセス

  1. Google Cloud Platform Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドに次の文字列を貼り付けます。
    resource.type="gce_subnetwork"
    logName="projects/{#project_id}/logs/compute.googleapis.com%2Fvpc_flows"
    ip_in_net(jsonPayload.connection.dest_ip, {#subnet})
    

特定のポートとプロトコルのログへのアクセス

単一のポートの場合

  1. Google Cloud Platform Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドに次の文字列を貼り付けます。
    resource.type="gce_subnetwork"
    logName="projects/{#project_id}/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.src_port={#port}
    jsonPayload.connection.protocol={#protocol}
    

複数のポートの場合

  1. Google Cloud Platform Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドに次の文字列を貼り付けます。
    resource.type="gce_subnetwork"
    logName="projects/{#project_id}/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.src_port=({#port1} OR {#port2})
    jsonPayload.connection.protocol={#protocol}
    

BigQuery、Cloud Pub/Sub、およびカスタム ターゲットへのログのエクスポート

Stackdriver Logging のドキュメントの説明に従って、Stackdriver Logging から目的の宛先にフローログをエクスポートできます。フィルタの例については、前のセクションをご覧ください。

トラブルシューティング

Stackdriver Logging の gce_subnetwork リソースに vpc_flows が表示されない

  • VPC フローがサポートされるのは VPC ネットワークのみです。レガシー ネットワークを使用している場合、ログは表示されません。
  • 共有 VPC ネットワークでは、ログはホスト プロジェクトでのみ表示され、サービス プロジェクトでは表示されません。必ず、ホスト プロジェクトのログを調べてください。
  • Stackdriver Logging の除外フィルタは、指定されたログをブロックします。VPC フローログを破棄する除外ルールが存在しないことを確認してください。
    1. [リソースの使用量] に移動します。
    2. [除外] タブをクリックします。
    3. VPC フローログを破棄する除外ルールが存在しないことを確認します。

一部のログで RTT 値またはバイト値が存在しない

  • RTT をキャプチャするのに十分なパケットがサンプリングされなかった場合、RTT の測定値が存在しないことがあります。この現象は、接続が少量である場合に発生する可能性が高くなります。
  • UDP フローでは RTT 値は提供されません。
  • 一部のパケットはペイロードなしで送信されます。ヘッダーのみのパケットがサンプリングされた場合、バイト値は 0 になります。

一部のフローが見つからない

  • サポートされているのは UDP プロトコルと TCP プロトコルのみです。他のプロトコルのログは記録されません。
  • パケット処理ではある程度のサンプリングが行われます。非常に少量のフローでは、一部のパケットが失われる場合があります。

料金

Stackdriver Logging、BigQuery、または Cloud Pub/Sub の標準料金が適用されます。Virtual Private Cloud の料金で説明されているように、一般提供以降は VPC フローログの生成に課金されます。

よくある質問

  • ログは、ファイアウォール ルールに基づいて許可されるトラフィックと拒否されるトラフィックの両方をカバーしますか?

    • ログは、VM により認識されるすべてのトラフィックをカバーします。VM から送信されたトラフィックが、その VM の下りルールによってブロックされた場合も、トラフィックはその VM によって記録されます。受信トラフィックが上りルールによってブロックされた場合、そのトラフィックは VM によって認識されず、その VM では記録されません。
  • VPC フローログは、インターフェースが複数あるインスタンスで動作しますか?

  • VPC フローログはレガシー ネットワークで動作しますか?

次のステップ

このページは役立ちましたか?評価をお願いいたします。