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 = 5秒1
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|ValuesのTIMEOUT/TCP_TIMEOUT/UDP_TIMEOUTは起動時の初期値のみ書き込まれ、CONFIG_DB 変更では更新されない。
購読者¶
orchagent/NatOrch: SAI NAT カウンタを 5 秒周期でポーリングし各COUNTERS_NAT*テーブルを更新する1。show nat statistics:COUNTERS_NAT・COUNTERS_NAPT・COUNTERS_GLOBAL_NATを読み取り統計を表示する。
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
NAT_GLOBAL、NAT_POOL、NAT_BINDINGS - 関連 CLI:
show nat statistics、show nat translations - 関連 YANG:
sonic-nat
関連リファレンス¶
- CONFIG_DB:
NAT_GLOBAL / NAT_POOL - CONFIG_DB:
NAT_BINDINGS - CONFIG_DB:
NAT_RESTORE_TABLE / STATE_DB - CLI:
config 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|Values の MAX_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=false→enableNatFeature()冒頭で即 return (natorch.cpp:2541-2544)。- TIMEOUT 系フィールドの静止:
COUNTERS_GLOBAL_NAT|ValuesのTIMEOUT/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.cpp 各 addTwice*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|Values の TIMEOUT / TCP_TIMEOUT / UDP_TIMEOUT フィールドは NatOrch 起動時に一度だけ書き込まれ、その後 CONFIG_DB の NAT_GLOBAL.nat_timeout が変更されても更新されない。実際のタイムアウト値は show nat config globalvalues で確認すること。