SNMP_COMMUNITY テーブル¶
概要¶
SNMPv1/v2c コミュニティ文字列を CONFIG_DB に登録するテーブル1。sonic-snmp.yang の SNMP_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 構造¶
name が key。YANG 制約: 長さ 4〜32 文字、SPACE / シングルクォート / @ / , / \ を含む文字列は禁止。
フィールド¶
| フィールド | 型 | 説明 |
|---|---|---|
TYPE |
enum RO / RW |
コミュニティアクセス種別。RO = 読み取り専用、RW = 読み取り/書き込み |
name は key としてのみ存在し、ハッシュフィールドには現れない。
制約¶
nameの長さ: 4〜32 文字 (length "4..32")- 禁止文字: SPACE /
'(single quote) /@/,/\(YANGpattern制約) - CLI 側追加検証:
@と:を含む community 名を拒否(snmp_community_secret_check関数) TYPEは YANG でmandatory宣言なし — CLI 経由では常に指定が必要だが、直接 DB 書き込みでは省略可能
購読者¶
docker-snmpのsnmpd.conf.j2テンプレート:SNMP_COMMUNITY→rocommunity/rwcommunity/rocommunity6/rwcommunity6ディレクティブ生成snmp_yml_to_configdb.py: ブート時に/etc/sonic/snmp.ymlから注入
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
SNMP、SNMP_AGENT_ADDRESS_CONFIG、SNMP_USER - 関連 YANG:
sonic-snmp - 関連 CLI:
config snmp community { add | del | replace }
関連リファレンス¶
- YANG:
sonic-snmp - CLI:
config snmp - 関連ページ:
SNMP、SNMP_AGENT_ADDRESS_CONFIG
引用元¶
運用ヒント¶
典型値¶
- key 形式:
SNMP_COMMUNITY|<name>。 TYPE: ROで読み取り専用コミュニティ。TYPE: RWで読み書き可能コミュニティ。
よくある誤設定¶
public/privateをデフォルトのまま使用すると外部から SNMP アクセスが可能。本番では必ず変更する。- community 名が 4 文字未満だと YANG バリデーションエラー。
確認コマンド¶
値依存挙動マトリクス¶
| フィールド | 値 | 挙動 |
|---|---|---|
TYPE |
RO |
snmpd.conf に rocommunity <name> / rocommunity6 <name> が生成される。読み取り専用アクセスのみ許可。 |
TYPE |
RW |
snmpd.conf に rwcommunity <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コンテナ再起動 orsystemctl 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の場合rocommunityとrocommunity6の両行が生成される。IPv4 と IPv6 を個別に制御する手段は本テーブルにはない。
暗黙デフォルト・コード由来挙動 (Phase A)¶
TYPE フィールド — YANG mandatory なし、実装は値存在前提¶
- YANG
mandatory宣言なし:sonic-snmp.yangのSNMP_COMMUNITY_LIST.TYPEleaf は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 addはstring_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_rocommunitiesはsnmp_rocommunityのstartswithにも一致する。実際にはstartswith('snmp_rocommunities')条件を先にチェックするため問題なし。
テンプレート生成の前提(IPv4/IPv6 非分離)¶
- IPv4 と IPv6 は分離不可:
TYPE: RO時はrocommunityとrocommunity6が同一コミュニティ名で生成される。IPv4 のみ / IPv6 のみに限定する仕組みは本テーブルにない。ネットワーク分離が必要な場合は snmpd.conf を直接編集する必要があるが、それは CONFIG_DB 管理外となる。
CDB → 実コンテナ動作トレース¶
段階 1: Consumer 登録¶
- docker-snmp / snmpd.conf.j2: コンテナ起動時にテンプレートエンジンが
SNMP_COMMUNITYテーブル全体を読み取る(イベントドリブンではなくバッチ生成)。
段階 2: CFG → APPL 翻訳¶
snmpd.conf.j2がSNMP_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.pyがset_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.py に SNMP_COMMUNITY 生成なし
REST / gNMI¶
REST/gNMI 書き込み経路なし(OpenConfig SNMP モデルは本テーブルをサポートしていない)
db_migrator¶
db_migrator.py での SNMP_COMMUNITY マイグレーションなし
ビルド時デフォルト (init_cfg / j2 テンプレート)¶
なし(init_cfg.json に SNMP_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 |
-
YANG 定義:
sonic-snmp.yangcontainerSNMP_COMMUNITY/ listSNMP_COMMUNITY_LIST. https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/src/sonic-yang-models/yang-models/sonic-snmp.yang ↩