NAT_RESTORE_TABLE / COUNTERS_NAT テーブル¶
概要¶
NAT 機能が管理する実行時データベースには 2 種類のテーブル群が存在する。
STATE_DB:NAT_RESTORE_TABLE— NAT docker の warm reboot 復元スクリプト (restore_nat_entries.py) が conntrack エントリを kernel に書き戻した後にセットするフラグ。natsyncdがこのフラグを確認してから reconciliation を開始する1。COUNTERS_DB:COUNTERS_NAT*—orchagent/NatOrchが SAI から定期取得するパケット・バイト数カウンタ、およびエントリ数・タイムアウトなどのグローバル統計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 は書き込まれない。natsyncd は hget("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_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 - CLI:
config 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 時の動作¶
restore_nat_entries.pyが/var/warmboot/nat/nat_entries.dumpを読み込み kernel conntrack に復元- 復元完了後、
STATE_DB:NAT_RESTORE_TABLE|Flags.restored = "true"をセット 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==false→SWSS_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は存在しない。natsyncdのhgetは空文字列を返し、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|Values の TIMEOUT/TCP_TIMEOUT/UDP_TIMEOUT フィールドは NatOrch 起動時に一度だけ書き込まれ、その後 CONFIG_DB の NAT_GLOBAL.nat_timeout が変更されても更新されない。show nat statistics の timeout 表示は起動時の初期値を反映したものになる可能性がある。実際のタイムアウト値は show nat config globalvalues で確認すること。
-
warm reboot 復元フラグ:
restore_nat_entries.py. https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/dockers/docker-nat/restore_nat_entries.py ↩ -
NAT カウンタ実装:
natorch.cpp. https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/orchagent/natorch.cpp ↩