結論ファースト — 4つのフィールドを30秒で理解
srcaddr
送信元ENIのプライマリIPアドレスを記録。常にプライマリIPが表示される。
dstaddr
宛先ENIのプライマリIPアドレスを記録。セカンダリIP宛てでもプライマリIPが表示される。
pkt-srcaddr
パケットの実際の送信元IPを記録。セカンダリIPから送信された場合はそのIPが表示される。
pkt-dstaddr
パケットの実際の宛先IPを記録。セカンダリIP宛ての場合はそのIPが表示される。
最重要ポイント:
dstaddr は ENI のプライマリIPを「常に」表示するが、
pkt-dstaddr はパケットの実際の宛先IPを表示する。
ENIに複数のIPが割り当てられている場合、この2つの値は異なることがある。
1
たとえ話 — ホテルの荷物配送で理解する
🏨
ENI(ネットワークインターフェース)に複数のIPが付いている状況は、
1つのホテルに複数の客室があるのと同じです
1つのホテルに複数の客室があるのと同じです
📦 荷物が届くシーン
🏨 AWSホテル(= ENI)
ホテルの代表住所
10.0.1.100(プライマリIP)
101号室(プライマリIP)
10.0.1.100
202号室(セカンダリIP ①)
10.0.1.200
303号室(セカンダリIP ②)
10.0.1.300
📦 配送伝票(外箱)
宛先:AWSホテル
10.0.1.100
= dstaddr が記録する値
10.0.1.100
= dstaddr が記録する値
→
💌 中の手紙(実際の宛先)
宛先:202号室 様
10.0.1.200
= pkt-dstaddr が記録する値
10.0.1.200
= pkt-dstaddr が記録する値
| ホテルのたとえ | AWSの実態 | フローログフィールド | |
|---|---|---|---|
| 🏨 | ホテルの代表住所 | ENIのプライマリIPアドレス | dstaddr / srcaddr |
| 🚪 | 各客室の部屋番号 | ENIのセカンダリIPアドレス | pkt-dstaddr / pkt-srcaddr |
| 📦 | 配送伝票の宛先(外箱) | 常にプライマリIPを表示 | dstaddr |
| 💌 | 中の手紙の本当の宛先 | パケットの実際の宛先IPを表示 | pkt-dstaddr |
2
技術詳細 — 4つのフィールドの正確な動作
📘 デフォルトフィールド
srcaddr / dstaddr — 常に記録される
- ENIのプライマリIPアドレスを常に記録
- セカンダリIP宛てのトラフィックでもプライマリIPが表示
- カスタムフォーマット不要で自動的に含まれる
- 「このENIを通ったトラフィック」を特定するのに最適
📙 オプションフィールド
pkt-srcaddr / pkt-dstaddr — 明示的な追加が必要
- パケットの実際のIPアドレスを記録
- セカンダリIP宛てなら、セカンダリIPがそのまま表示
- カスタムフォーマットで明示的に追加する必要あり
- NATやロードバランサーの元の送信元IP特定にも有効
| フィールド名 | 種別 | 記録する内容 | 複数IPの場合 |
|---|---|---|---|
srcaddr |
デフォルト | 送信元の ENI の IP アドレス | 常にプライマリIPを表示 |
dstaddr |
デフォルト | 宛先の ENI の IP アドレス | 常にプライマリIPを表示 |
pkt-srcaddr |
オプション | パケットの実際の送信元 IP | 実際のIP(セカンダリの場合あり) |
pkt-dstaddr |
オプション | パケットの実際の宛先 IP | 実際のIP(セカンダリの場合あり) |
3
図解シナリオ — 値がどう変わるか見る
🅰️ シナリオA:プライマリIP宛てのトラフィック
外部から ENI のプライマリIP(10.0.1.100)にトラフィックが到達する場合
💻
送信元サーバー
192.168.1.50
➡️
🔌
宛先 ENI
Primary: 10.0.1.100
Secondary: 10.0.1.200
dstaddr =
10.0.1.100
✅ プライマリIP = 実際の宛先 → 一致
pkt-dstaddr =
10.0.1.100
✅ 実際の宛先もプライマリ → 一致
🅱️ シナリオB:セカンダリIP宛てのトラフィック ⚠️ ここが重要
外部から ENI のセカンダリIP(10.0.1.200)にトラフィックが到達する場合
💻
送信元サーバー
192.168.1.50
➡️
🔌
宛先 ENI
Primary: 10.0.1.100
→ Secondary: 10.0.1.200 🎯
dstaddr =
10.0.1.100
⚠️ セカンダリ宛てでもプライマリIPを表示!
pkt-dstaddr =
10.0.1.200
✅ 実際の宛先であるセカンダリIPを表示
📄 実際のフローログ出力例(カスタムフォーマット)
FLOW LOG FORMAT: ${srcaddr} ${dstaddr} ${pkt-srcaddr} ${pkt-dstaddr} ${action}
# シナリオA(プライマリIP宛て):
192.168.1.50
10.0.1.100
192.168.1.50
10.0.1.100
ACCEPT
# シナリオB(セカンダリIP宛て):
192.168.1.50
10.0.1.100
192.168.1.50
10.0.1.200
ACCEPT
フィールド:
srcaddr
dstaddr
pkt-srcaddr
pkt-dstaddr
action
4
ユースケース — いつどのフィールドを使うか
セカンダリIPへのトラフィック分析
1つのENIに複数IPを割り当てている場合、どのIPにトラフィックが来ているかを正確に把握したい
pkt-dstaddr を使う
NATゲートウェイの元IP追跡
NATゲートウェイを経由したトラフィックの元の送信元IPアドレスを特定したい
pkt-srcaddr を使う
ENI単位のトラフィック集計
どのENI(ネットワークインターフェース)にトラフィックが集中しているかを集計したい
srcaddr / dstaddr を使う
ロードバランサー背後のアクセス分析
ELB/ALBの背後にあるインスタンスへの実際のクライアントIPを確認したい
pkt-srcaddr を使う
5
ベストプラクティス & アンチパターン
カスタムフォーマットで pkt-srcaddr / pkt-dstaddr を含める
デフォルトフォーマットには含まれないため、セカンダリIPの分析が必要な場合は必ずカスタムフォーマットで追加する。
NATやELBがある環境では pkt-srcaddr を必ず有効化
srcaddr だけでは中間デバイスのIPしか見えない。元のクライアントIPを追跡するには pkt-srcaddr が不可欠。
4つのフィールドをすべて記録してから分析
後からフィールドを追加しても過去のログには反映されない。最初からすべて含めておくのがベスト。
dstaddr だけでセカンダリIP宛てのトラフィックを特定しようとする
dstaddr は常にプライマリIPを表示するため、セカンダリIPへのトラフィックを見落としてしまう。pkt-dstaddr が必要。
srcaddr でNAT背後のクライアントIPを特定しようとする
srcaddr はNATゲートウェイのIPを表示するため、元のクライアントIPは分からない。pkt-srcaddr を使う。
AWS試験で狙われるポイント
VPCフローログのフィールドに関する問題は、以下のパターンで出題されます:
- 🎯 「セカンダリIPへのトラフィックを特定するにはどのフィールドを使うか?」→ pkt-dstaddr
- 🎯 「NATゲートウェイ経由の元のクライアントIPを確認するには?」→ pkt-srcaddr
- 🎯 「dstaddr と pkt-dstaddr の違いは何か?」→ ENIの複数IP時にプライマリか実際のIPかの違い
- 🎯 「デフォルトのフローログフォーマットに含まれないフィールドは?」→ pkt-srcaddr / pkt-dstaddrはオプション
6
FAQ — よくある質問
ENIにIPが1つだけの場合、dstaddrとpkt-dstaddrは同じ値になる?
はい、同じ値になります。dstaddr と pkt-dstaddr の値が異なるのは、ENIに複数のIPアドレス(プライマリ + セカンダリ)が割り当てられていて、セカンダリIP宛てのトラフィックが発生した場合のみです。IPが1つだけの場合は、両方ともそのIPアドレスを表示します。
pkt-srcaddr / pkt-dstaddr はデフォルトで記録される?
いいえ、デフォルトでは記録されません。フローログ作成時にカスタムフォーマットを指定し、
${pkt-srcaddr} と ${pkt-dstaddr} を明示的に追加する必要があります。デフォルトフォーマットには srcaddr と dstaddr のみが含まれます。
NATゲートウェイの場合、srcaddrには何が表示される?
NATゲートウェイを経由するトラフィックの場合、
srcaddr にはNATゲートウェイのプライベートIPアドレスが表示されます。元のクライアントの実際のIPアドレスを知るには、pkt-srcaddr フィールドが必要です。これがNAT環境で pkt-srcaddr が重要になる主な理由です。
Elastic IPアドレスの場合はどうなる?
Elastic IPは通常プライマリIPにマッピングされるため、
dstaddr にはそのプライマリIPが表示されます。ただし、フローログはパブリックIPではなくプライベートIPで記録される点に注意してください。Elastic IPのパブリックアドレス自体はフローログに直接表示されません。
フローログのカスタムフォーマットの設定方法は?
VPCフローログ作成時に「カスタムフォーマット」を選択し、必要なフィールドを指定します。例えば:
AWS CLI の場合:
${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${pkt-srcaddr} ${pkt-dstaddr} ${srcport} ${dstport} ${protocol} ${action} ${log-status}AWS CLI の場合:
aws ec2 create-flow-logs --log-format '${srcaddr} ${dstaddr} ${pkt-srcaddr} ${pkt-dstaddr} ${action}' ...