VPCフローログとは
VPCフローログは、VPCのネットワークインターフェイスとの間で行き来するIPトラフィックに関する情報をキャプチャできるようにする機能のことです。フローログデータは、Amazon CloudWatch Logs、Amazon S3、または Amazon Kinesis Data Firehose に発行できます。
VPCフローログの特徴
VPCフローログは、様々なタスクに役立ちます。
・制限の過度に厳しいセキュリティグループルールを診断する
・インスタンスに到達するトラフィックをモニタリングする
・ネットワークインターフェイスに出入りするトラフィックの方向を決定する
具体的にはこのような場合に役立ちます。また、フローログデータはネットワークトラフィックのパスの外で収集されるため、ネットワークのスループットやレイテンシーには影響しません。
フローログの使い方
フローログを使うには、様々な設定を行う必要があります。フローログの設定について、順番に見ていきましょう。 ここでは、CloudWatch Logsへフローログを発行します。
1)CloudWatch Logsのロググループを作成
まず、作成してあるEC2インスタンスにロググループを作成します。実行中のインスタンスを選択して、ネットワーキングをクリックします。
下にスクロールしていくと、ネットワークインターフェイスIDがあるので、それをクリックします。ネットワークインターフェイスのページに移動したら、アクションから「フローログの作成」をクリックしてフローログを作成します。
フローログの設定では、名前や送信先などの設定を行います。そして、作成が終わったら右下オレンジ色のボタン「フローログの作成」をクリックして完了です。
出力されたフローログを確認する
先ほどフローログの作成を行ったので、次は出力を確認していきます。先ほど作成したロググループの中にあるログストリームをクリックします。その後、ログイベントの部分にアクションが表示されます。
デフォルトのログ出力形式です。
[version, accountid, interfaceid, srcaddr, dstaddr, srcport, dstport, protocol, packets, bytes, start, end, action, logstatus]
フィールド | 説明 | バージョン |
---|---|---|
version | VPC フローログバージョン。デフォルトの形式を使用する場合、バージョンは 2 です。カスタム形式を使用する場合、そのバージョンは指定されたフィールドの中で最も高いバージョンです。例えば、バージョン 2 のフィールドのみを指定した場合、バージョンは 2 です。バージョン 2、3、4 のフィールドを混在させて指定すると、バージョンは 4 になります。Parquet データ型: INT_32 | 2 |
account-id | トラフィックが記録されるソースネットワークインターフェイスの所有者の AWS アカウント ID。ネットワークインターフェイスが AWS のサービスによって作成された場合 (VPC エンドポイントまたは Network Load Balancer の作成時など)、このフィールドに対してレコードに unknown と表示されることがあります。Parquet データ型: STRING | 2 |
interface-id | トラフィックが記録されるネットワークインターフェイスの ID。Parquet データ型: STRING | 2 |
srcaddr | 受信トラフィックの送信元アドレスか、ネットワークインターフェイスにおける送信トラフィックのネットワークインターフェイスの IPv4 または IPv6 アドレス。ネットワークインターフェイスの IPv4 アドレスは常にそのプライベート IPv4 アドレスです。「pkt-srcaddr」も参照してください。Parquet データ型: STRING | 2 |
dstaddr | 送信トラフィックの送信先アドレスか、ネットワークインターフェイスにおける受信トラフィックのネットワークインターフェイスの IPv4 または IPv6 アドレス。ネットワークインターフェイスの IPv4 アドレスは常にそのプライベート IPv4 アドレスです。「pkt-dstaddr」も参照してください。Parquet データ型: STRING | 2 |
srcport | トラフィックの送信元ポート。Parquet データ型: INT_32 | 2 |
dstport | トラフィックの送信先ポート。Parquet データ型: INT_32 | 2 |
protocol | トラフィックの IANA プロトコル番号。詳細については、「割り当てられたインターネットプロトコル番号」を参照してください。Parquet データ型: INT_32 | 2 |
packets | フロー中に転送されたパケットの数。Parquet データ型: INT_64 | 2 |
bytes | フロー中に転送されたバイト数。Parquet データ型: INT_64 | 2 |
start | 集約間隔内にフローの最初のパケットが受信された時間 (UNIX 秒)。これは、パケットがネットワークインターフェイス上で送信または受信されてから最大 60 秒になる場合があります。Parquet データ型: INT_64 | 2 |
end | 集約間隔内にフローの最後のパケットが受信された時間 (UNIX 秒)。これは、パケットがネットワークインターフェイス上で送信または受信されてから最大 60 秒になる場合があります。Parquet データ型: INT_64 | 2 |
action | トラフィックに関連付けられたアクション:ACCEPT ― トラフィックが承認されました。REJECT ― トラフィックが拒否されました。例えば、トラフィックがセキュリティグループまたはネットワーク ACL により許可されなかった、接続終了後にパケットが到着したなどです。Parquet データ型: STRING | 2 |
log-status | フローログのロギングステータス。OK — データは選択された送信先に正常に記録されます。NODATA — 集約間隔内にネットワークインターフェイスとの間で行き来するネットワークトラフィックはありませんでした。SKIPDATA — 集約間隔内に一部のフローログレコードがスキップされました。これは、内部的なキャパシティー制限、または内部エラーが原因である可能性があります。Parquet データ型: STRING | 2 |
vpc-id | トラフィックが記録されるネットワークインターフェイスが含まれる VPC の ID。Parquet データ型: STRING | 3 |
subnet-id | トラフィックが記録されるネットワークインターフェイスが含まれるサブネットの ID。Parquet データ型: STRING | 3 |
instance-id | インスタンスをお客様が所有している場合、トラフィックが記録されるネットワークインターフェイスに関連するインスタンスの ID。リクエスタマネージド型のネットワークインターフェイス (NAT ゲートウェイのネットワークインターフェイスなど) の場合、「-」記号を返します。Parquet データ型: STRING | 3 |
tcp-flags | 次の TCP フラグのビットマスク値:FIN — 1SYN — 2RST — 4SYN-ACK — 18TCP フラグは、集約間隔内に OR 処理することができます。短い接続の場合、フラグがフローログレコードの同じ行に設定されることがあります (例えば、SYN-ACK と FIN の場合は 19、SYN と FIN の場合は 3 など)。例については、「TCP フラグシーケンス」を参照してください。Parquet データ型: INT_32 | 3 |
type | トラフィックの種類。指定できる値は IPv4 | IPv6 | EFA です。詳細については、「Elastic Fabric Adapter」を参照してください。Parquet データ型: STRING | 3 |
pkt-srcaddr | トラフィックのパケットレベルの (元の) 送信元 IP アドレス。srcaddr フィールドとともにこのフィールドを使用し、トラフィックが通過する中間レイヤーの IP アドレスとトラフィックの元の送信元 IP アドレスを区別します。例えば、トラフィックが NAT ゲートウェイのネットワークインターフェイスを通過する場合や、Amazon EKS 内のポッドの IP アドレスが、ポッドが実行されているインスタンスノードのネットワークインターフェイスの IP アドレスとは異なる場合などです (VPC 内の通信の場合)。Parquet データ型: STRING | 3 |
pkt-dstaddr | トラフィックのパケットレベルの (元の) 送信先 IP アドレス。dstaddr フィールドとともにこのフィールドを使用し、トラフィックが通過する中間レイヤーの IP アドレスとトラフィックの最終的な送信元 IP アドレスを区別します。例えば、トラフィックが NAT ゲートウェイのネットワークインターフェイスを通過する場合や、Amazon EKS 内のポッドの IP アドレスが、ポッドが実行されているインスタンスノードのネットワークインターフェイスの IP アドレスとは異なる場合などです (VPC 内の通信の場合)。Parquet データ型: STRING | 3 |
region | トラフィックが記録されるネットワークインターフェイスが含まれるリージョン。Parquet データ型: STRING | 4 |
az-id | トラフィックが記録されるネットワークインターフェイスが含まれるアベイラビリティーゾーンの ID。トラフィックがサブロケーションからの場合、レコードにはこのフィールドに「-」記号が表示されます。Parquet データ型: STRING | 4 |
sublocation-type | sublocation-id フィールドに返されるサブロケーションのタイプ。指定可能な値は次のとおりです: wavelength | outpost | localzone。トラフィックがサブロケーションからではない場合、レコードにはこのフィールドに「-」記号が表示されます。Parquet データ型: STRING | 4 |
sublocation-id | トラフィックが記録されるネットワークインターフェイスが含まれるサブロケーションの ID。トラフィックがサブロケーションからではない場合、レコードにはこのフィールドに「-」記号が表示されます。Parquet データ型: STRING | 4 |
pkt-src-aws-service | pkt-srcaddr フィールド用の IP アドレスの範囲のサブセットの名前 (送信元 IP アドレスが AWS のサービス用の場合)。指定可能な値は次のとおりです:AMAZON |AMAZON_APPFLOW |AMAZON_CONNECT |API_GATEWAY |CHIME_MEETINGS |CHIME_VOICECONNECTOR |CLOUD9 |CLOUDFRONT |CODEBUILD |DYNAMODB |EBS |EC2 |EC2_INSTANCE_CONNECT |GLOBALACCELERATOR |KINESIS_VIDEO_STREAMS |ROUTE53 |ROUTE53_HEALTHCHECKS |ROUTE53_HEALTHCHECKS_PUBLISHING |ROUTE53_RESOLVER |S3 |WORKSPACES_GATEWAYS。Parquet データ型: STRING | 5 |
pkt-dst-aws-service | pkt-dstaddr フィールド用の IP アドレスの範囲のサブセットの名前 (送信先 IP アドレスが AWS のサービス用の場合)。可能な値の一覧については、pkt-src-aws-service フィールドをご参照ください。Parquet データ型: STRING | 5 |
flow-direction | トラフィックがキャプチャされるインターフェイスに対するフローの方向。指定できる値は次のとおりです: ingress | egress。Parquet データ型: STRING | 5 |
traffic-path | 出力トラフィックが送信先につながるパス。トラフィックが出力トラフィックであるかどうかを判断するには、flow-direction フィールドを確認します。指定できる値は次のとおりです。いずれの値も適用されない場合、フィールドは – に設定されます。1 — 同じ VPC 内の別のリソース経由2 — インターネットゲートウェイまたはゲートウェイ VPC エンドポイント経由3 — 仮想プライベートゲートウェイ経由4 — リージョン内 VPC ピア接続経由5 — リージョン間 VPC ピア接続経由6 — ローカルゲートウェイ経由7 — ゲートウェイ VPC エンドポイント経由 (Nitro ベースのインスタンスのみ)8 — インターネットゲートウェイ経由 (Nitro ベースのインスタンスのみ)Parquet データ型: INT_32 | 5 |
まとめ
通信ログの取得をすることができるので、SSH接続できないといったような通信トラブルが発生した際に役に立つと感じました。設定も比較的容易に行うことが出来たので、使う際にはさほど困ることはないと思います。ただ、出力されたログを見ると、ぱっと見何を書いてあるのかわかりませんでした。慣れて、解析や障害対応時に活かしていきたいと思います!