コンテンツにスキップ

NAT_RESTORE_TABLE / COUNTERS_NAT テーブル

概要

NAT 機能が管理する実行時データベースには 2 種類のテーブル群が存在する。

  1. STATE_DB:NAT_RESTORE_TABLENAT docker の warm reboot 復元スクリプト (restore_nat_entries.py) が conntrack エントリを kernel に書き戻した後にセットするフラグ。natsyncd がこのフラグを確認してから reconciliation を開始する1
  2. COUNTERS_DB:COUNTERS_NAT*orchagent/NatOrchSAI から定期取得するパケット・バイト数カウンタ、およびエントリ数・タイムアウトなどのグローバル統計2

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

flowchart LR
  CDB[("CONFIG_DB<br/>NAT_GLOBAL")]
  DM["natmgrd"]
  CDB --> DM
  APPDB[("APP_DB<br/>NAT_TABLE")]
  DM --> APPDB
  ORCH["orchagent / NatOrch"]
  APPDB --> ORCH
  SAI["SAI<br/>sai_nat_api"]
  ORCH --> SAI
  STATEDB[("STATE_DB<br/>NAT_RESTORE_TABLE")]
  RESTORE["restore_nat_entries.py"] --> STATEDB
  NATSYNC["natsyncd"] -- "hget Flags.restored" --> STATEDB
  COUNTERS[("COUNTERS_DB<br/>COUNTERS_NAT*")]
  ORCH -- "5s poll" --> SAI
  SAI -- "hit/bytes" --> ORCH
  ORCH --> COUNTERS

凡例

STATE_DB/COUNTERS_DB の書き込み経路を追加した図。通常の CONFIG → SAI パスは左側を参照。

key 構造

STATE_DB:NAT_RESTORE_TABLE|Flags

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

主要フィールド

STATE_DB:NAT_RESTORE_TABLE

フィールド 書き込みタイミング
restored 文字列 "true" warm reboot 後、restore_nat_entries.py が conntrack 復元完了時

warm reboot なし (通常起動) では NAT_RESTORE_TABLE|Flags書き込まれないnatsyncdhget("Flags", "restored", value) が空文字列を返す場合に reconciliation なしで進む。

COUNTERS_DB:COUNTERS_NAT

キー形式 フィールド 初期値 説明
<external_ip> NAT_TRANSLATIONS_PKTS uint64 (文字列) "0" SAI から取得したパケット数
<external_ip> NAT_TRANSLATIONS_BYTES uint64 (文字列) "0" SAI から取得したバイト数

初期値 "0" は SNAT/DNAT エントリが SAI に登録された直後に updateNatCounters(ipAddr, 0, 0) で書き込まれる (natorch.cpp:789)。

COUNTERS_DB:COUNTERS_NAPT

キー形式 フィールド 初期値
<proto>:<ip>:<port> (例: TCP:10.0.0.1:1024) NAT_TRANSLATIONS_PKTS uint64 (文字列) "0"
同上 NAT_TRANSLATIONS_BYTES uint64 (文字列) "0"

COUNTERS_DB:COUNTERS_TWICE_NAT

キー形式 フィールド 説明
<src_ip>:<dst_ip> NAT_TRANSLATIONS_PKTS uint64 (文字列) Twice NAT ペアのパケット数
同上 NAT_TRANSLATIONS_BYTES uint64 (文字列) Twice NAT ペアのバイト数

COUNTERS_DB:COUNTERS_TWICE_NAPT

キー形式 フィールド 説明
<proto>:<src_ip>:<src_port>:<dst_ip>:<dst_port> NAT_TRANSLATIONS_PKTS uint64 (文字列) Twice NAPT のパケット数
同上 NAT_TRANSLATIONS_BYTES uint64 (文字列) Twice NAPT のバイト数

COUNTERS_DB:COUNTERS_GLOBAL_NAT

キー: "Values" (固定)

フィールド 初期値 更新タイミング 説明
MAX_NAT_ENTRIES uint32 (文字列) SAI query 値 (非対応時 "0") NatOrch 起動時のみ プラットフォームが許容する最大 SNAT エントリ数
TIMEOUT uint32 (文字列) "600" NatOrch 起動時のみ 非 TCP/UDP NAT タイムアウト秒
UDP_TIMEOUT uint32 (文字列) "300" NatOrch 起動時のみ UDP NAT タイムアウト秒
TCP_TIMEOUT uint32 (文字列) "86400" NatOrch 起動時のみ TCP NAT タイムアウト秒
SNAT_ENTRIES int (文字列) "0" SNAT エントリ追加/削除時 現在の SNAT エントリ総数
DNAT_ENTRIES int (文字列) "0" DNAT エントリ追加/削除時 現在の DNAT エントリ総数

制約

  • NAT_RESTORE_TABLE は warm reboot / NAT warm restart が有効な場合のみ使用される。通常起動では存在しない。
  • COUNTERS_GLOBAL_NAT|Values.MAX_NAT_ENTRIES = 0 の場合、gIsNatSupported=false となり NAT 機能が完全に無効化される。
  • COUNTERS テーブルは NAT_HITBIT_N_CNTRS_QUERY_PERIOD=5 秒周期で更新される。リアルタイム値ではない。

購読者

  • natsyncd: STATE_DB:NAT_RESTORE_TABLE|Flags.restored を warm start 中に参照し、"true" になってから APPL_DB との reconciliation を開始する。
  • orchagent / NatOrch: SAI NAT カウンタを 5 秒周期でポーリングし COUNTERS_DB:COUNTERS_NAT* を更新する。show nat statistics はこのデータを表示する。

関連 CONFIG_DB / YANG / CLI

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

関連リファレンス

引用元

関連 Topics

運用ヒント

確認コマンド

# NAT カウンタ統計
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>'

# warm reboot 復元フラグ確認
sonic-db-cli STATE_DB hgetall 'NAT_RESTORE_TABLE|Flags'

warm reboot 時の動作

  1. restore_nat_entries.py/var/warmboot/nat/nat_entries.dump を読み込み kernel conntrack に復元
  2. 復元完了後、STATE_DB:NAT_RESTORE_TABLE|Flags.restored = "true" をセット
  3. natsyncd がフラグを確認し、APPL_DB と conntrack の差分 reconciliation を実行

よくある誤操作

  • MAX_NAT_ENTRIES=0 の場合は NAT が機能しない。gIsNatSupported フラグが false になっておりプラットフォームが NAT をサポートしていない。

例外条件・特殊挙動

  • MAX_NAT_ENTRIES=0 → NAT 無効化: NatOrch コンストラクタで SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY の取得に失敗または 0 を返すと gIsNatSupported=false が設定される。enableNatFeature() 冒頭で gIsNatSupported==falseSWSS_LOG_NOTICE + return となり CONFIG_DB の admin_mode=enabled が無視される (natorch.cpp:100-122, 2541-2544)。
  • カウンタ更新タイミングの非同期性: COUNTERS_NAT の値は最大 5 秒遅延する。show nat statistics の値はリアルタイムではない。
  • Static エントリのカウンタ: entry_type="static" かつ addedToHw=true の場合、hit bit が定期的に SAI から取得され COUNTERS_NAT に反映される。ただし Static エントリはエージアウト対象外 (checkIfNatEntryIsActive は static を常に active=1 として扱う, natorch.cpp:4160-4163)。
  • NAT_RESTORE_TABLE の不在が正常: 通常起動では NAT_RESTORE_TABLE|Flags は存在しない。natsyncdhget は空文字列を返し、reconciliation なしで通常動作に移行する。

値依存挙動マトリクス

フィールド 挙動
STATE_DB:NAT_RESTORE_TABLE\|Flags.restored (存在しない) natsyncd が reconciliation なしで通常動作
STATE_DB:NAT_RESTORE_TABLE\|Flags.restored "true" natsyncd が APPL_DB ↔ conntrack の差分 reconciliation を実行
COUNTERS_GLOBAL_NAT\|Values.MAX_NAT_ENTRIES "0" NAT 機能が gIsNatSupported=false により無効化される
COUNTERS_GLOBAL_NAT\|Values.MAX_NAT_ENTRIES "N" (N>0) NAT エントリが最大 N 件まで SAI に登録可能
COUNTERS_GLOBAL_NAT\|Values.SNAT_ENTRIES "N" 現在アクティブな SNAT エントリ数 (SAI 登録済み)
COUNTERS_GLOBAL_NAT\|Values.DNAT_ENTRIES "N" 現在アクティブな DNAT エントリ数 (SAI 登録済み)

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

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

フィールド テーブル 初期値 ソース
NAT_TRANSLATIONS_PKTS COUNTERS_NAT / COUNTERS_NAPT 各エントリ "0" natorch.cpp:789 (updateNatCounters(ipAddr, 0, 0))
NAT_TRANSLATIONS_BYTES COUNTERS_NAT / COUNTERS_NAPT 各エントリ "0" natorch.cpp:789
MAX_NAT_ENTRIES COUNTERS_GLOBAL_NAT\|Values SAI 問い合わせ値 (失敗時 "0") natorch.cpp:127
TIMEOUT COUNTERS_GLOBAL_NAT\|Values "600" natorch.cpp:128 (= NAT_TIMEOUT_DEFAULT)
UDP_TIMEOUT COUNTERS_GLOBAL_NAT\|Values "300" natorch.cpp:129 (= NAT_UDP_TIMEOUT_DEFAULT)
TCP_TIMEOUT COUNTERS_GLOBAL_NAT\|Values "86400" natorch.cpp:130 (= NAT_TCP_TIMEOUT_DEFAULT)
SNAT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:76,4574 (totalSnatEntries=0 初期化)
DNAT_ENTRIES COUNTERS_GLOBAL_NAT\|Values "0" natorch.cpp:76,4585 (totalDnatEntries=0 初期化)
restored STATE_DB:NAT_RESTORE_TABLE\|Flags (warm reboot 時のみ書き込まれる; 通常起動では存在しない) restore_nat_entries.py:51

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

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