APPL_DB NAT テーブル群¶
概要¶
NAT_TABLE、NAPT_TABLE、NAT_TWICE_TABLE、NAPT_TWICE_TABLE、NAT_GLOBAL_TABLE、NAT_DNAT_POOL_TABLE は APPL_DB 上の NAT 関連テーブル群1。natmgrd が CONFIG_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 セグメント数が規定値以外の場合は NatOrch が SWSS_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 が欠落すると NatOrch の assert が 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 = false。
natorch.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_TABLEkey: 1 セグメント (<ip>)。他は ERROR + erase。NAPT_TABLEkey: 3 セグメント (<proto>:<ip>:<port>)。他は ERROR + erase。NAT_TWICE_TABLEkey: 2 セグメント (<src_ip>:<dst_ip>)。他は ERROR + erase。NAPT_TWICE_TABLEkey: 5 セグメント。他は ERROR + erase。NAT_GLOBAL_TABLEkey:"Values"固定。他は ERROR + erase。NAT_DNAT_POOL_TABLEkey: 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_NAT、STATIC_NAPT、NAT_GLOBAL、NAT_POOL、NAT_BINDINGS - 関連 CLI:
config nat、show nat translations - 関連 YANG:
sonic-nat
関連リファレンス¶
- CONFIG_DB:
NAT_GLOBAL / NAT_POOL - CONFIG_DB:
STATIC_NAT - CONFIG_DB:
NAT_BINDINGS - YANG:
sonic-nat - CLI:
config 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¶
-
テーブル名定数:
sonic-swss-common/common/schema.hL101-107. https://github.com/sonic-net/sonic-swss-common/blob/master/common/schema.h ↩ -
NatOrch 実装:
sonic-swss/orchagent/natorch.cpp. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/natorch.cpp ↩