コンテンツにスキップ

COUNTERS_DB NAT カウンタテーブル群

概要

NAT 機能の実行時カウンタは COUNTERS_DB 上の 5 つのテーブルに書き込まれる。orchagent/NatOrch が SAI NAT API から 5 秒周期でパケット数・バイト数を取得し更新する。show nat statistics はこれらのテーブルを読み取る。

テーブル キー形式 用途
COUNTERS_NAT <external_ip> 単体 NAT (SNAT/DNAT) エントリのカウンタ
COUNTERS_NAPT <proto>:<ip>:<port> 単体 NAPT エントリのカウンタ
COUNTERS_TWICE_NAT <src_ip>:<dst_ip> Twice NAT エントリのカウンタ
COUNTERS_TWICE_NAPT <proto>:<src_ip>:<src_port>:<dst_ip>:<dst_port> Twice NAPT エントリのカウンタ
COUNTERS_GLOBAL_NAT Values (固定) グローバル統計・設定サマリ

データフロー (自動生成)

flowchart LR
  SAI["SAI<br/>sai_nat_api"]
  ORCH["orchagent / NatOrch<br/>(5s タイマ)"]
  SAI -- "hit bits + counters" --> ORCH
  COUNTERS_NAT[("COUNTERS_DB<br/>COUNTERS_NAT")]
  COUNTERS_NAPT[("COUNTERS_DB<br/>COUNTERS_NAPT")]
  COUNTERS_TWICE_NAT[("COUNTERS_DB<br/>COUNTERS_TWICE_NAT")]
  COUNTERS_GLOBAL[("COUNTERS_DB<br/>COUNTERS_GLOBAL_NAT")]
  ORCH --> COUNTERS_NAT
  ORCH --> COUNTERS_NAPT
  ORCH --> COUNTERS_TWICE_NAT
  ORCH --> COUNTERS_GLOBAL
  CLI["show nat statistics"]
  COUNTERS_NAT --> CLI
  COUNTERS_NAPT --> CLI
  COUNTERS_TWICE_NAT --> CLI
  COUNTERS_GLOBAL --> CLI

凡例

COUNTERS_TWICE_NAPT は COUNTERS_TWICE_NAT と同構造。図では省略。

key 構造

COUNTERS_DB:COUNTERS_NAT|<external_ip>
COUNTERS_DB:COUNTERS_NAPT|<proto>:<ip>:<port>
COUNTERS_DB:COUNTERS_TWICE_NAT|<src_ip>:<dst_ip>
COUNTERS_DB:COUNTERS_TWICE_NAPT|<proto>:<src_ip>:<src_port>:<dst_ip>:<dst_port>
COUNTERS_DB:COUNTERS_GLOBAL_NAT|Values

主要フィールド

COUNTERS_NAT / COUNTERS_NAPT / COUNTERS_TWICE_NAT / COUNTERS_TWICE_NAPT

全エントリカウンタテーブルは同一フィールド構成を持つ。

フィールド 初期値 説明
NAT_TRANSLATIONS_PKTS uint64 (文字列) "0" SAI から取得したパケット数。エントリ登録直後に 0 で初期化される
NAT_TRANSLATIONS_BYTES uint64 (文字列) "0" SAI から取得したバイト数。エントリ登録直後に 0 で初期化される
  • 書き込み元: NatOrch::updateNatCounters() / updateNaptCounters() / updateTwiceNatCounters() / updateTwiceNaptCounters() (natorch.cpp:4049-4135)
  • 削除: エントリ削除時に deleteNatCounters() 等で対応エントリを削除
  • 更新周期: NAT_HITBIT_N_CNTRS_QUERY_PERIOD = 51

COUNTERS_GLOBAL_NAT|Values

キー: "Values" (固定)

起動時のみ書き込まれるフィールド

NatOrch コンストラクタ初回実行時に一度だけ書き込まれる。その後の CONFIG_DB 変更では更新されない。

フィールド 初期値 説明
MAX_NAT_ENTRIES uint32 (文字列) SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY 取得値 (失敗時 "0") プラットフォームが許容する最大 SNAT エントリ数
TIMEOUT uint32 (文字列) "600" 非 TCP/UDP NAT エントリのアイドルタイムアウト秒
UDP_TIMEOUT uint32 (文字列) "300" UDP NAT エントリのアイドルタイムアウト秒
TCP_TIMEOUT uint32 (文字列) "86400" TCP NAT エントリのアイドルタイムアウト秒 (1 日)

エントリ数フィールド (実行時更新)

フィールド 初期値 更新タイミング
STATIC_NAT_ENTRIES int (文字列) "0" static NAT エントリ追加/削除時
STATIC_NAPT_ENTRIES int (文字列) "0" static NAPT エントリ追加/削除時
STATIC_TWICE_NAT_ENTRIES int (文字列) "0" static Twice NAT エントリ追加/削除時
STATIC_TWICE_NAPT_ENTRIES int (文字列) "0" static Twice NAPT エントリ追加/削除時
DYNAMIC_NAT_ENTRIES int (文字列) "0" dynamic NAT エントリ追加/削除時
DYNAMIC_NAPT_ENTRIES int (文字列) "0" dynamic NAPT エントリ追加/削除時
DYNAMIC_TWICE_NAT_ENTRIES int (文字列) "0" dynamic Twice NAT エントリ追加/削除時
DYNAMIC_TWICE_NAPT_ENTRIES int (文字列) "0" dynamic Twice NAPT エントリ追加/削除時
SNAT_ENTRIES int (文字列) "0" SNAT エントリ (static/dynamic 合算) 追加/削除時
DNAT_ENTRIES int (文字列) "0" DNAT エントリ (static/dynamic 合算) 追加/削除時

制約

  • COUNTERS カウンタは NAT_HITBIT_N_CNTRS_QUERY_PERIOD = 5 秒周期で更新される。リアルタイム値ではない。
  • MAX_NAT_ENTRIES = 0 の場合、gIsNatSupported = false となり NAT 機能全体が無効化される。
  • COUNTERS_GLOBAL_NAT|ValuesTIMEOUT / TCP_TIMEOUT / UDP_TIMEOUT は起動時の初期値のみ書き込まれ、CONFIG_DB 変更では更新されない。

購読者

  • orchagent/NatOrch: SAI NAT カウンタを 5 秒周期でポーリングし各 COUNTERS_NAT* テーブルを更新する1
  • show nat statistics: COUNTERS_NATCOUNTERS_NAPTCOUNTERS_GLOBAL_NAT を読み取り統計を表示する。

関連 CONFIG_DB / YANG / CLI

  • 関連 CONFIG_DB: NAT_GLOBALNAT_POOLNAT_BINDINGS
  • 関連 CLI: show nat statisticsshow nat translations
  • 関連 YANG: sonic-nat

関連リファレンス

引用元

関連 Topics

運用ヒント

確認コマンド

# NAT カウンタ統計 (CLIで確認)
show nat statistics

# COUNTERS_DB を直接参照
sonic-db-cli COUNTERS_DB hgetall 'COUNTERS_GLOBAL_NAT|Values'
sonic-db-cli COUNTERS_DB hgetall 'COUNTERS_NAT|<external_ip>'
sonic-db-cli COUNTERS_DB hgetall 'COUNTERS_NAPT|TCP:10.0.0.1:1024'

# すべての NAT カウンタキーを一覧表示
sonic-db-cli COUNTERS_DB keys 'COUNTERS_NAT*'

MAX_NAT_ENTRIES=0 の対処

COUNTERS_GLOBAL_NAT|ValuesMAX_NAT_ENTRIES"0" の場合、プラットフォームが NAT をハードウェア的にサポートしていない。gIsNatSupported=false が設定され、CONFIG_DB に admin_mode=enabled を設定しても NAT 機能は動作しない。

カウンタリセット

sonic-clear nat statistics でカウンタをリセットできる。内部では FLUSHNATSTATISTICS 通知を APPL_DB に送信し、NatOrch が SAI API でカウンタをクリアする。

例外条件・特殊挙動

  • MAX_NAT_ENTRIES=0 → NAT 無効化: NatOrch コンストラクタで SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY 取得が失敗または 0 → maxAllowedSNatEntries=0 のまま書き込み → gIsNatSupported=falseenableNatFeature() 冒頭で即 return (natorch.cpp:2541-2544)。
  • TIMEOUT 系フィールドの静止: COUNTERS_GLOBAL_NAT|ValuesTIMEOUT / TCP_TIMEOUT / UDP_TIMEOUT は NatOrch 起動時の一度のみ書き込まれる。その後 config nat set timeout <N> 等で CONFIG_DB を変更しても COUNTERS_DB には反映されない。実際の運用タイムアウトは show nat config globalvalues で確認すること。
  • Static エントリのカウンタ更新: entry_type="static" のエントリもカウンタ取得対象。checkIfNatEntryIsActive() が static エントリを常に active=1 として扱うためエージアウトされず、カウンタは継続して更新される (natorch.cpp:4160-4163)。
  • カウンタ更新の非同期性: NAT_TRANSLATIONS_PKTS / NAT_TRANSLATIONS_BYTES は最大 5 秒遅延する。フロー完了直後に参照してもゼロのままの場合がある。

値依存挙動マトリクス

フィールド 挙動
COUNTERS_GLOBAL_NAT\|Values.MAX_NAT_ENTRIES "0" gIsNatSupported=false → NAT 機能全体が無効化される
COUNTERS_GLOBAL_NAT\|Values.MAX_NAT_ENTRIES "N" (N>0) NAT エントリが最大 N 件まで SAI に登録可能
COUNTERS_NAT\|<ip>.NAT_TRANSLATIONS_PKTS "0" エントリ登録直後または統計クリア直後の状態
COUNTERS_NAT\|<ip>.NAT_TRANSLATIONS_PKTS "N" (N>0) フォワードされたパケット数 (最大 5 秒遅延)
COUNTERS_GLOBAL_NAT\|Values.SNAT_ENTRIES "N" 現在 SAI に登録済みの SNAT エントリ数
COUNTERS_GLOBAL_NAT\|Values.DNAT_ENTRIES "N" 現在 SAI に登録済みの DNAT エントリ数

フィールド暗黙デフォルト (Phase A — コード由来)

YANG 定義外の COUNTERS_DB 実行時テーブルのためコード hardcode 値のみ。

フィールド テーブル 初期値 ソース
NAT_TRANSLATIONS_PKTS COUNTERS_NAT / COUNTERS_NAPT 各エントリ "0" natorch.cpp:789,873 (エントリ登録直後の update*Counters(…,0,0) 呼び出し)
NAT_TRANSLATIONS_BYTES COUNTERS_NAT / COUNTERS_NAPT 各エントリ "0" natorch.cpp:789,873
NAT_TRANSLATIONS_PKTS COUNTERS_TWICE_NAT / COUNTERS_TWICE_NAPT 各エントリ "0" natorch.cppaddTwice*Entry 直後の updateTwice*Counters(…,0,0)
NAT_TRANSLATIONS_BYTES COUNTERS_TWICE_NAT / COUNTERS_TWICE_NAPT 各エントリ "0" 同上
MAX_NAT_ENTRIES COUNTERS_GLOBAL_NAT\|Values SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY 値 (失敗時 "0") natorch.cpp:127
TIMEOUT COUNTERS_GLOBAL_NAT\|Values "600" natorch.cpp:128 (コンストラクタ timeout=600)
UDP_TIMEOUT COUNTERS_GLOBAL_NAT\|Values "300" natorch.cpp:129 (コンストラクタ udp_timeout=300)
TCP_TIMEOUT COUNTERS_GLOBAL_NAT\|Values "86400" natorch.cpp:130 (コンストラクタ tcp_timeout=86400)
STATIC_NAT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:4486 (初期 totalStaticNatEntries=0)
STATIC_NAPT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:4497
STATIC_TWICE_NAT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:4508
STATIC_TWICE_NAPT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:4519
DYNAMIC_NAT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:4530
DYNAMIC_NAPT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:4541
DYNAMIC_TWICE_NAT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:4552
DYNAMIC_TWICE_NAPT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:4563
SNAT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:4574 (初期 totalSnatEntries=0)
DNAT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:4585 (初期 totalDnatEntries=0)

COUNTERS_GLOBAL_NAT の TIMEOUT フィールドと CONFIG_DB の乖離

COUNTERS_GLOBAL_NAT|ValuesTIMEOUT / TCP_TIMEOUT / UDP_TIMEOUT フィールドは NatOrch 起動時に一度だけ書き込まれ、その後 CONFIG_DB の NAT_GLOBAL.nat_timeout が変更されても更新されない。実際のタイムアウト値は show nat config globalvalues で確認すること。