コンテンツにスキップ

APPL_DB NAT テーブル群

概要

NAT_TABLENAPT_TABLENAT_TWICE_TABLENAPT_TWICE_TABLENAT_GLOBAL_TABLENAT_DNAT_POOL_TABLEAPPL_DB 上の NAT 関連テーブル群1natmgrdCONFIG_DB の static NAT/NAPT 設定を変換してこれらへ書き込み、natsyncd が kernel conntrack から dynamic エントリを書き込む。orchagent / NatOrch が消費して SAI sai_nat_api 経由でハードウェアへ降ろす2

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

flowchart LR
  CDB[("CONFIG_DB<br/>STATIC_NAT / NAT_GLOBAL")]
  NatMgr["natmgrd"]
  CDB --> NatMgr
  CONN["kernel conntrack"]
  NatSync["natsyncd"]
  CONN --> NatSync
  APPDB[("APPL_DB<br/>NAT_TABLE / NAPT_TABLE<br/>NAT_TWICE_TABLE / NAT_GLOBAL_TABLE")]
  NatMgr --> APPDB
  NatSync --> APPDB
  Orch["orchagent / NatOrch"]
  APPDB --> Orch
  SAI["SAI<br/>sai_nat_api"]
  Orch --> SAI

凡例

CONFIG_DB から SAI までの典型経路。詳細は本ページ本文を参照。

key 構造

NAT_TABLE|<global_ip>
NAPT_TABLE|<proto>|<global_ip>|<global_port>
NAT_TWICE_TABLE|<src_ip>|<dst_ip>
NAPT_TWICE_TABLE|<proto>|<src_ip>|<src_port>|<dst_ip>|<dst_port>
NAT_GLOBAL_TABLE|Values
NAT_DNAT_POOL_TABLE|<dnat_ip>

key セグメント数が規定値以外の場合は NatOrchSWSS_LOG_ERROR + erase して処理をスキップする。

主要フィールド

NAT_TABLE

フィールド 必須 説明
translated_ip IPv4 address yes 変換後 IP アドレス
nat_type enum snat / dnat yes NAT 種別
entry_type enum static / dynamic yes static (natmgrd 由来) / dynamic (natsyncd 由来)

key は <global_ip> の単一セグメント。entry_type / nat_type は省略不可 — 欠落時 assert abort (natorch.cpp:2659)。

NAPT_TABLE

フィールド 必須 説明
translated_ip IPv4 address yes 変換後 IP
translated_l4_port uint16 yes 変換後 L4 ポート
nat_type enum snat / dnat yes NAT 種別
entry_type enum static / dynamic yes エントリ種別

key は <proto>:<global_ip>:<global_port> の 3 セグメント。proto は TCP または UDP

NAT_TWICE_TABLE

フィールド 必須 説明
translated_src_ip IPv4 address yes 変換後 src IP
translated_dst_ip IPv4 address yes 変換後 dst IP
entry_type enum static / dynamic yes エントリ種別

key は <src_ip>:<dst_ip> の 2 セグメント。Twice NAT (SNAT+DNAT 同時) に使用。

NAPT_TWICE_TABLE

フィールド 必須 説明
translated_src_ip IPv4 address yes 変換後 src IP
translated_src_l4_port uint16 yes 変換後 src ポート
translated_dst_ip IPv4 address yes 変換後 dst IP
translated_dst_l4_port uint16 yes 変換後 dst ポート
entry_type enum static / dynamic yes エントリ種別

key は <proto>:<src_ip>:<src_port>:<dst_ip>:<dst_port> の 5 セグメント。

NAT_GLOBAL_TABLE

フィールド デフォルト 説明
admin_mode enum enabled / disabled "disabled" NAT 機能の有効 / 無効
nat_timeout int (秒) 600 非 TCP/UDP NAT セッション timeout
nat_tcp_timeout int (秒) 86400 TCP NAT セッション timeout
nat_udp_timeout int (秒) 300 UDP NAT セッション timeout

key は固定文字列 "Values"。他のキーは NatOrch が ERROR + erase (natorch.cpp:2924-2928)。admin_mode"enabled" / "disabled" 以外は assert abort (natorch.cpp:2938)。

NAT_DNAT_POOL_TABLE

フィールドなし (NULL: NULL)。key の IP アドレスが DNAT pool に登録されたことを示すフラグテーブル。1 セグメント以外のキーは ERROR + erase (natorch.cpp:2983-2987)。

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

APPL_DB NAT テーブル群は YANG の管轄外 (YANG は CONFIG_DB 側を定義) のため、デフォルト値はコード実装のみから確認する。

NAT_GLOBAL_TABLE — コード由来デフォルト

フィールド デフォルト値 定数 / 設定元 ソース
admin_mode "disabled" NatOrch::admin_mode 初期値 natorch.cpp:64
nat_timeout 600 NAT_TIMEOUT_DEFAULT natmgr.h:64 / natorch.cpp:67
nat_tcp_timeout 86400 NAT_TCP_TIMEOUT_DEFAULT natmgr.h:69 / natorch.cpp:70
nat_udp_timeout 300 NAT_UDP_TIMEOUT_DEFAULT natmgr.h:73 / natorch.cpp:73

NatOrch コンストラクタでメンバ変数を上記値で初期化。natmgr.cpp 側でも同値の定数を使用し、isNatEnabled() == false 時は APPL_DB 書き込みをスキップ (natmgr.cpp:7282-7313)。

NAT_TABLE / NAPT_TABLE / NAT_TWICE_TABLE / NAPT_TWICE_TABLE — assert 必須フィールド

これらのテーブルに「省略時デフォルト」は存在しない。entry_type が欠落すると NatOrchassert が abort を引き起こす。

// natorch.cpp:2659 (NAT_TABLE)
assert(type == "dynamic" || type == "static");
entry.entry_type = type;

static エントリは natmgrd / natmgr.cpp が書き込む (SOURCE: natmgr.cpp:2040-2053)。dynamic エントリは natsyncd / natsync.cpp が kernel conntrack から書き込む (SOURCE: natsync.cpp:380、391)。

NAT_DNAT_POOL_TABLE — フィールドなし

フィールドデフォルト概念なし。IP の存在 (SET) / 不在 (DEL) のみ。

entry_type による writer 分類

entry_type 書き込み元 ファイル
"static" natmgrd (NatMgr) sonic-swss/cfgmgr/natmgr.cpp
"dynamic" natsyncd (NatSync) sonic-swss/natsyncd/natsync.cpp

タイムアウトの伝播条件 (NAT_GLOBAL_TABLE)

natmgr.cpp:7282-7313: nat_timeout / nat_tcp_timeout / nat_udp_timeout の変更は isNatEnabled() == true の場合のみ APPL_DB に書き込まれる。admin_mode = disabled 状態でのタイムアウト変更は APPL_DB に届かない。

enableNatFeature() (natmgr.cpp:5688-5704) は非デフォルト値のみ書き込む — デフォルト値と同値の変更は APPL_DB に送信されない。

プラットフォーム依存 silent drop (admin_mode=enabled 無効化)

main.cpp:936-948: SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY == 0 のプラットフォームでは gIsNatSupported = falsenatorch.cpp:2541-2544: enableNatFeature() 冒頭で gIsNatSupported == false → NOTICE ログ + return。 APPL_DB に admin_mode=enabled が書かれていても SAI 操作は行われない。

static エントリの両方向同時追加

natmgr.cpp:2052-2053: addStaticSingleNatEntry() は DNAT エントリと SNAT エントリを 両方同時に NAT_TABLE に書き込む。

m_appNatTableProducer.set(appKeyDnat, fvVectorDnat);   // nat_type: dnat
m_appNatTableProducer.set(appKeySnat, fvVectorSnat);   // nat_type: snat

CONFIG_DB の STATIC_NAT|<global_ip> 1 件 → APPL_DB NAT_TABLE|<global_ip>NAT_TABLE|<local_ip> の 2 件が生成される。

制約

  • NAT_TABLE key: 1 セグメント (<ip>)。他は ERROR + erase。
  • NAPT_TABLE key: 3 セグメント (<proto>:<ip>:<port>)。他は ERROR + erase。
  • NAT_TWICE_TABLE key: 2 セグメント (<src_ip>:<dst_ip>)。他は ERROR + erase。
  • NAPT_TWICE_TABLE key: 5 セグメント。他は ERROR + erase。
  • NAT_GLOBAL_TABLE key: "Values" 固定。他は ERROR + erase。
  • NAT_DNAT_POOL_TABLE key: 1 セグメント (<ip>)。他は ERROR + erase。
  • entry_type"static" / "dynamic" のみ (assert abort)。
  • admin_mode"enabled" / "disabled" のみ (assert abort)。

購読者 (Consumer)

  • orchagent / NatOrch: doNatTableTask() / doNaptTableTask() / doTwiceNatTableTask() / doTwiceNaptTableTask() / doNatGlobalTableTask() / doDnatPoolTableTask() でそれぞれ消費し、sai_nat_api 経由でハードウェアに NAT エントリを登録する。

書き込み元

  • natmgrd / NatMgr: CONFIG_DB の STATIC_NAT / STATIC_NAPT / NAT_GLOBAL / NAT_POOL を読み、static エントリを APPL_DB に書く。
  • natsyncd / NatSync: kernel netlink (conntrack) を購読し、dynamic NAT/NAPT セッションを APPL_DB に書く。

関連 CONFIG_DB / YANG / CLI

  • 関連 CONFIG_DB: STATIC_NATSTATIC_NAPTNAT_GLOBALNAT_POOLNAT_BINDINGS
  • 関連 CLI: config natshow nat translations
  • 関連 YANG: sonic-nat

関連リファレンス

引用元

運用ヒント

典型確認コマンド

# APPL_DB の NAT エントリを確認
sonic-db-cli APPL_DB hgetall 'NAT_TABLE|65.55.45.1'
sonic-db-cli APPL_DB hgetall 'NAT_GLOBAL_TABLE|Values'
sonic-db-cli APPL_DB keys 'NAT_DNAT_POOL_TABLE|*'

# show コマンド
show nat translations
show nat config

よくある落とし穴

  • NAT_GLOBAL_TABLE.admin_mode の assert 条件: "enabled" / "disabled" 以外の値を直接 APPL_DB に書くと orchagent が abort する。CLI / natmgrd を通じた書き込みは安全。
  • static エントリは DNAT + SNAT の 2 件 が同時に書かれる。show nat translations で "両方向" として見える。
  • dynamic エントリ (entry_type: dynamic) は conntrack エージングで自動削除される。手動 DEL は不要。
  • DNAT pool に IP が登録されないと dynamic DNAT が動作しない (NAT_DNAT_POOL_TABLE が先に書かれる)。

関連 Topics


  1. テーブル名定数: sonic-swss-common/common/schema.h L101-107. https://github.com/sonic-net/sonic-swss-common/blob/master/common/schema.h 

  2. NatOrch 実装: sonic-swss/orchagent/natorch.cpp. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/natorch.cpp