コンテンツにスキップ

SNMP_COMMUNITY テーブル

概要

SNMPv1/v2c コミュニティ文字列を CONFIG_DB に登録するテーブル1sonic-snmp.yangSNMP_COMMUNITY_LIST で定義される。docker-snmp コンテナ起動時に snmpd.conf.j2 テンプレートが本テーブルを読み取り、rocommunity / rwcommunity / rocommunity6 / rwcommunity6 ディレクティブを snmpd.conf に生成する。snmp_yml_to_configdb.py がブート時に /etc/sonic/snmp.yml からもエントリを注入する。

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

flowchart LR
  CDB[("CONFIG_DB<br/>SNMP_COMMUNITY")]
  DM["snmp-config / snmpd.conf.j2"]
  CDB --> DM

凡例

CONFIG_DB から SAI までの典型経路を docs/reference/config-db-orch-map.md から機械生成したミニ図。詳細・例外は本ページ本文と対応表を参照。

key 構造

SNMP_COMMUNITY|<community_name>

name が key。YANG 制約: 長さ 4〜32 文字、SPACE / シングルクォート / @ / , / \ を含む文字列は禁止。

フィールド

フィールド 説明
TYPE enum RO / RW コミュニティアクセス種別。RO = 読み取り専用、RW = 読み取り/書き込み

name は key としてのみ存在し、ハッシュフィールドには現れない。

制約

  • name の長さ: 4〜32 文字 (length "4..32")
  • 禁止文字: SPACE / ' (single quote) / @ / , / \(YANG pattern 制約)
  • CLI 側追加検証: @: を含む community 名を拒否(snmp_community_secret_check 関数)
  • TYPE は YANG で mandatory 宣言なし — CLI 経由では常に指定が必要だが、直接 DB 書き込みでは省略可能

購読者

  • docker-snmpsnmpd.conf.j2 テンプレート: SNMP_COMMUNITYrocommunity/rwcommunity/rocommunity6/rwcommunity6 ディレクティブ生成
  • snmp_yml_to_configdb.py: ブート時に /etc/sonic/snmp.yml から注入

関連 CONFIG_DB / YANG / CLI

関連リファレンス

引用元

運用ヒント

典型値

  • key 形式: SNMP_COMMUNITY|<name>
  • TYPE: RO で読み取り専用コミュニティ。TYPE: RW で読み書き可能コミュニティ。

よくある誤設定

  • public / private をデフォルトのまま使用すると外部から SNMP アクセスが可能。本番では必ず変更する。
  • community 名が 4 文字未満だと YANG バリデーションエラー。

確認コマンド

sonic-db-cli CONFIG_DB keys 'SNMP_COMMUNITY|*'
show snmp community

値依存挙動マトリクス

フィールド 挙動
TYPE RO snmpd.confrocommunity <name> / rocommunity6 <name> が生成される。読み取り専用アクセスのみ許可。
TYPE RW snmpd.confrwcommunity <name> / rwcommunity6 <name> が生成される。読み取り・書き込みアクセスを許可。
TYPE 未設定(省略) テンプレートは TYPE の存在を前提にチェックするため、TYPE がない場合は if SNMP_COMMUNITY[community]['TYPE'] == 'RO' / == 'RW' のどちらにも一致せず、コミュニティ行が生成されない(サイレントスキップ)。
テーブル全体 エントリなし テンプレートの {% if SNMP_COMMUNITY is defined %} が偽となり、コミュニティ行を一切出力しない。結果として全 SNMP v1/v2c アクセスが拒否される。

例外条件・特殊挙動

  • SNMP_COMMUNITY 未定義時 → 全 v1/v2c アクセス拒否: テーブルにエントリが 0 件の場合、snmpd.conf.j2{% if SNMP_COMMUNITY is defined %} チェックが偽となり、コミュニティ設定行を出力しない。snmpd は community なしで起動し、全 SNMPv1/v2c アクセスを拒否する。
  • TYPE 省略時のサイレントスキップ: TYPE フィールドが欠如しているエントリは、RO / RW どちらにも一致しないため、snmpd.conf 行が生成されない。エラーログは出力されない。
  • 設定変更の反映は snmpd 再起動時のみ: CONFIG_DB への書き込み後、docker-snmp コンテナ再起動 or systemctl restart snmp.service まで snmpd.conf への反映は行われない。CLI (config snmp community add) は変更後に自動で systemctl restart snmp.service を発行する。
  • snmp_yml_to_configdb.py の冪等性: snmp_yml_to_configdb.py はブート時に /etc/sonic/snmp.yml から SNMP_COMMUNITY を注入するが、既存エントリ (snmp_config_db_communities) と重複する community は書き込まずスキップする。
  • IPv4 / IPv6 両方自動バインド: TYPE: RO の場合 rocommunityrocommunity6 の両行が生成される。IPv4 と IPv6 を個別に制御する手段は本テーブルにはない。

暗黙デフォルト・コード由来挙動 (Phase A)

TYPE フィールド — YANG mandatory なし、実装は値存在前提

  • YANG mandatory 宣言なし: sonic-snmp.yangSNMP_COMMUNITY_LIST.TYPE leaf は mandatory true を持たない。CLI では引数 <RO|RW> を必須として扱うが、direct DB 書き込み(sonic-db-cli や JSON 投入)では TYPE を省略したエントリを書き込める。
  • TYPE 省略 → サイレントスキップ(コミュニティ行不生成): snmpd.conf.j2 テンプレートは == 'RO' / == 'RW' の明示比較のみ行い、TYPE フィールドの存在チェックを行わない。TYPE がない場合は KeyError または比較不成立でコミュニティ行を生成しない。SNMP access は実質的に機能しなくなる(エラーログなし)。
  • CLI は TYPE を自動大文字化: config snmp community addstring_type = string_type.upper() で入力を大文字化してから set_entry を呼ぶ。直接 DB に TYPE: ro(小文字)を書き込んだ場合、テンプレートの == 'RO' 比較に不一致となりスキップされる。

name (key) — YANG 制約と CLI 制約の乖離

  • YANG 制約: 長さ 4〜32 文字、禁止パターン [^ @,\\']*(SPACE / ' / @ / , / \ を禁止)。YANG バリデーターが有効な場合のみ適用される。
  • CLI 追加検証(ADHOC_VALIDATION 有効時のみ): snmp_community_secret_check@: を禁止する(32 文字超過も拒否)。YANG は : を明示禁止しておらず、CLI のみの制約。
  • YANG と CLI の禁止文字集合が異なる: YANG では ,\ を禁止しているが CLI は禁止しない。CLI では : を禁止しているが YANG は禁止しない。direct DB 書き込みでは YANG バリデーションのみが適用される。
  • 大文字小文字感知: community 名はそのまま FRR/snmpd の community-string として使用される。key の大文字/小文字は区別される。

ブート時注入(snmp_yml_to_configdb.py)のデフォルト挙動

  • snmp.yml が存在しない場合: sys.exit(1) で終了。SNMP_COMMUNITY への書き込みは発生しない。テーブルは空のまま。
  • snmp_rocommunity / snmp_rwcommunity が snmp.yml に未定義の場合: ループ条件 if comm_type in yaml_snmp_info.keys() で分岐するため、未定義キーはスキップされ対応 community は書き込まれない。
  • 既存 DB エントリとの重複時: if community not in snmp_config_db_communities チェックにより、すでに DB に存在する community は上書きしない(冪等性)。TYPE の変更も行われない。
  • snmp_rocommunities(複数形)と snmp_rocommunity(単数形)の評価順: full_snmp_comm_list = ['snmp_rocommunity', 'snmp_rocommunities', 'snmp_rwcommunity', 'snmp_rwcommunities'] の順でループするが、コードは startswith で分岐するため snmp_rocommunitiessnmp_rocommunitystartswith にも一致する。実際には startswith('snmp_rocommunities') 条件を先にチェックするため問題なし。

テンプレート生成の前提(IPv4/IPv6 非分離)

  • IPv4 と IPv6 は分離不可: TYPE: RO 時は rocommunityrocommunity6 が同一コミュニティ名で生成される。IPv4 のみ / IPv6 のみに限定する仕組みは本テーブルにない。ネットワーク分離が必要な場合は snmpd.conf を直接編集する必要があるが、それは CONFIG_DB 管理外となる。

CDB → 実コンテナ動作トレース

段階 1: Consumer 登録

  • docker-snmp / snmpd.conf.j2: コンテナ起動時にテンプレートエンジンが SNMP_COMMUNITY テーブル全体を読み取る(イベントドリブンではなくバッチ生成)。

段階 2: CFG → APPL 翻訳

  • snmpd.conf.j2SNMP_COMMUNITY エントリを rocommunity / rwcommunity / rocommunity6 / rwcommunity6 に変換し /etc/snmp/snmpd.conf を生成する。
  • APP_DB への書き込みなし。

段階 3: APPL → SAI

  • SAI 経由なし。snmpd が MIB ツリーを通じてスイッチ統計を提供。

段階 4: タイミングと副作用

  • 適用タイミング: docker-snmp コンテナ再起動 / systemctl restart snmp.service 時のみ。実行中の snmpd プロセスはホットリロード不可。
  • 副作用: community 変更中は古い community での SNMP アクセスが継続される(snmpd 再起動まで)。再起動後は旧 community が無効化される。NMS 側の設定変更も必要。

書き込み入り口 (Direction A)

SNMP_COMMUNITY テーブルへの書き込みが発生するコード経路を網羅的に調査した結果。

CLI

  • config snmp community add <name> <RO|RW>config/main.pyset_entry('SNMP_COMMUNITY', community, {'TYPE': string_type}) を呼ぶ (sonic-utilities/config/main.py:4391)
  • config snmp community del <name>set_entry('SNMP_COMMUNITY', community, None) (sonic-utilities/config/main.py:4419)
  • config snmp community replace <current> <new> — 旧 community 削除 + 新 community 追加 (sonic-utilities/config/main.py:4452-4454)

minigraph / sonic-cfggen

minigraph.pySNMP_COMMUNITY 生成なし

REST / gNMI

REST/gNMI 書き込み経路なし(OpenConfig SNMP モデルは本テーブルをサポートしていない)

db_migrator

db_migrator.py での SNMP_COMMUNITY マイグレーションなし

ビルド時デフォルト (init_cfg / j2 テンプレート)

なし(init_cfg.jsonSNMP_COMMUNITY エントリなし)

ランタイム注入(デーモン自動書き込み)

  • snmp_yml_to_configdb.py: ブート時に /etc/sonic/snmp.yml から snmp_rocommunity / snmp_rocommunities / snmp_rwcommunity / snmp_rwcommunities を読み取り SNMP_COMMUNITY に注入(sonic-buildimage/dockers/docker-snmp/snmp_yml_to_configdb.py

派生・条件付き登録 (Phase 6/7)

Phase 6: 値による他フィールド自動派生

条件 派生先 evidence
派生なし(SNMP_COMMUNITY は CLI / snmp_yml_to_configdb.py でのみ書き込まれる) テンプレートは読み取り専用消費

Phase 7: 条件付き module/manager 登録

条件 登録 module evidence
docker-snmp コンテナ稼働時 snmpd.conf.j2 が SNMP_COMMUNITY を消費してコミュニティ行を生成 snmpd.conf.j2 L48-64
snmp.yml が存在する場合 snmp_yml_to_configdb.py がブート時に SNMP_COMMUNITY へ注入 snmp_yml_to_configdb.py L25-49

Phase 8: Handler メソッド内分岐

Handler 分岐条件 効果 evidence
snmpd.conf.j2 SNMP_COMMUNITY is defined コミュニティループを実行 snmpd.conf.j2 L48, L57
snmpd.conf.j2 SNMP_COMMUNITY[community]['TYPE'] == 'RO' rocommunity / rocommunity6 行を生成 snmpd.conf.j2 L50-52
snmpd.conf.j2 SNMP_COMMUNITY[community]['TYPE'] == 'RW' rwcommunity / rwcommunity6 行を生成 snmpd.conf.j2 L59-61
snmp_yml_to_configdb.py community not in snmp_config_db_communities 新規 community のみ書き込み(冪等) snmp_yml_to_configdb.py L36-49