Ciscoデバイスからsnmp mac-notificationラダーをキャッチします

質問の見かけ上の単純さにもかかわらず、長い時間をかけて少しずつ退屈な情報を少しずつ収集する必要がありました。 この出版物では、私の経験を共有したいと思います。

したがって、 mac通知は、このデバイスがオンまたはオフになったときに、スイッチポート上のデバイスのmacアドレスに関するサーバー情報を送信するsnmp通知です。 非常に便利なことで、SNMPを介してネットワーク監視の機能を拡張します。

設定しましょう


スイッチの設定にはそれほど時間はかかりません。

!   !   snmp snmp-server community _ RO ! mac  snmp-server enable traps mac-notification change move threshold !,    snmp-server host IP-_ _ mac-notification snmp !   mac address-table notification change mac address-table notification change interval 15 mac address-table notification change history-size 100 !              int range fa0/1-24 snmp trap mac-notification change added snmp trap mac-notification change removed 

デバッグモードで設定の正確さを確認できます。

 debug snmp packets ter mon 

すべてが正しく設定されていれば、次のようなものが表示されます。

 Nov 11 16:28:51.685: SNMP: Queuing packet to xxx.xxx.xxx.xxx Nov 11 16:28:51.685: SNMP: V1 Trap, ent cmnMIBNotificationPrefix, addr 10.0.28.18, gentrap 6, spectrap 1 cmnHistMacChangedMsg.37 = 01 00       00 14 00 cmnHistTimestamp.37 = 113588548 Nov 11 16:28:51.937: SNMP: Packet sent via UDP to xxx.xxx.xxx.xxx 

11オクテットの16進数文字列を渡すcmnHistMacChangedMsgオブジェクトを詳しく見てみましょう(最後の2つのゼロは常にレコードの終わりです)。 最初のオクテットは状態(01-デバイスが追加され、02-デバイスはオフ)、次の2オクテットはVLAN番号、6オクテットはMACアドレス(この場合はxxxxx.xxxx.xxxx)、および2オクテット(00 14)で占められます-ポート番号。
私は次のことに注意を払いたい: ドキュメントによると、cmnHistMacChangedMsgオブジェクトは1つのラダーで複数のMACアドレスを送信できます。 この場合、レコードは分離せずに連続して送信され、ゼロのペアもメッセージの最後に追加されます。

サーバー構成は、いくつかの段階で構成されています。

構成する前に、tcpdump udp | grep IP_switch_addressコマンドを使用して、udpパケットがサーバーに到達するかどうかを確認することを強くお勧めします。
  1. SNMPサーバーと標準MIBをインストールします。

     sudo apt-get install snmpd snmp snmptt snmp-mibs-downloader 

  2. 必要なMIBファイルのインストール
    デフォルトでは、SNMPサーバーはCiscoのmac-notificationオブジェクトを認識しません。 サーバーがそのようなはしごを認識できるようにするには、 ftpから.mibファイルをダウンロードし、/ var / lib / mibsに配置する必要があります。
    次のファイルをダウンロードする必要があります。

     CISCO-MAC-NOTIFICATION-MIB CISCO-QOS-PIB-MIB CISCO-SMI CISCO-TC CISCO-VTP-MIB 
    新しいMIBが正常にインストールされた場合、コマンドに
     snmptranslate -m CISCO-MAC-NOTIFICATION-MIB .1.3.6.1.4.1.9.9.215 
    サーバーが応答します
     CISCO-MAC-NOTIFICATION-MIB::ciscoMacNotificationMIB 

  3. 構成ファイルの構成

    / etc / default / snmpd:
    SNMPDRUN =はい
    SNMPDOPTS = '-Lsd -Lf / dev / null -u snmp -g snmp -I -smux、mteTrigger、mteTriggerConf -p /var/run/snmpd.pid'
    TRAPDRUN =はい
    TRAPDOPTS = '-On -Lsd -p /var/run/snmptrapd.pid'

    /etc/snmp/snmptrapd.conf:
    #デフォルトでは、すべてのトラップをsnmpttデーモンにリダイレクトします
    traphandleデフォルトsnmptt
    #すべてのラダーを許可
    disableAuthorizationはい

    /etc/snmp/snmptt.conf:
    #目的のOIDを検索
    イベントCISCO-MAC-NOTIFICATION-MIB :: cmnMacChangedNotification .1.3.6.1.4.1.9.9.215.2.0.1 "ステータスイベント"通常
    シスコのフォーマット
    #スクリプトへのリダイレクト:最初のパラメーターは$ aA-Ipデバイスアドレス、2番目のパラメーターは$ 1-OID cmnHistMacChangedMsg、
    #猫には、ステータス、MACアドレス、VLAN、デバイスインターフェイスに関する情報があります。
    #注意!!シスコは、1つのラダーで複数のcmnHistMacChangedMsgエントリを転送できます。
    EXEC php /opt/script.php $ aA $ 1
    SDESC
    EDESC

    /etc/snmp/snmptt.ini:

    #SNMPTT v1.4構成ファイル

    #Linux / Unix


    [全般]
    #$ H変数のこのシステムの名前。 空白の場合、システム名はコンピューターの
    #Sys :: Hostname経由のホスト名。
    snmptt_system_name =

    #「スタンドアロン」または「デーモン」に設定
    #スタンドアロン:snmptrapd.confから呼び出されたsnmptt
    #デーモン:snmptrapd.confはsnmptthandlerを呼び出します
    #Windowsでは無視されます。 ドキュメントを参照
    モード=スタンドアロン

    #1に設定すると、同じトラップに対して複数のトラップ定義を実行できます。
    #0に設定すると、最初の一致後に停止します。
    #このオプションは通常1に設定する必要があります。「SNMPTT.CONF設定」セクションを参照してください。
    #詳細については、SNMPTTのドキュメントの「メモ」を参照してください。
    #注:ワイルドカードの一致は、完全に一致するものがない場合にのみ一致します。 これには
    #NODESリストを考慮します。 したがって、一致するトラップがある場合、しかし
    #NODESリストは一致と見なされないようにするため、ワイルドカードエントリは
    #他に完全に一致するものがない場合にのみ使用してください。
    multiple_event = 1

    #SNMPTRAPDは、トラップを送信するデバイスのIPアドレスと、
    #実際のSNMPエージェント。 トラップが別のアドレスに代わって送信された場合、これらのアドレスは異なる可能性があります
    #デバイス(リレー、プロキシなど)。
    #DNSが有効な場合、DNSルックアップを使用してエージェントのIPアドレスがホスト名に変換されます
    #(OSの構成方法に応じて、ローカルホストファイルが含まれます)。 この名前
    #は、NODESエントリの一致、ログに記録されたトラップのホスト名フィールド(ファイル/データベース)、
    #および$ A変数。 NODES行のホスト名が解決され、IPアドレス
    #は比較に使用されます。
    #0に設定してDNS解決を無効にする
    #DNS解決を有効にするには1に設定
    dns_enable = 0

    #FQDN(完全修飾ドメイン名)の使用を有効にするには、0に設定します。 ホスト名が
    #ドメイン名を含むSNMPTTに渡されますが、ドメイン名によって変更されることはありません
    #SNMPTT。 これはresolve_value_ip_addressesにも影響します。
    #1に設定すると、SNMPTTは渡されたホスト名からドメイン名を削除します。 のために
    #例、server01.domain.comはserver01に変更されます
    #SNMPTTに渡されたホスト名からドメイン名を削除するには、2に設定します
    #strip_domain_listのドメインのリストに基づく
    strip_domain = 0

    #strip_domainが2に設定されている場合に削除されるドメイン名のリスト。
    #リストには1つ以上のドメインを含めることができます。 たとえば、ホストのFQDNが
    #server01.city.domain.comで、リストにdomain.comが含まれる場合、「ホスト」は
    #server01.cityとして設定。
    strip_domain_list = << END
    domain.com
    終了

    #変数バインディングのVALUEに含まれるIPアドレスの処理方法を構成します。
    #これは、$ n、$ + n、$ -n、$ vn、$ + *、$-*の値にのみ適用されます。
    #IPアドレスのホスト名への解決を無効にするには0に設定します
    #IPアドレスのホスト名への解決を有効にするには1に設定します
    #注:net_snmp_perl_enable *を有効にする必要があります*。 strip_domain設定は、
    #解決されたホスト名の形式。 DNSを有効にする必要があります(dns_enable)
    resolve_value_ip_addresses = 0

    #1に設定すると、UCD-SNMP / NET-SNMPパッケージのPerlモジュールの使用が有効になります。
    #これは、$ v変数置換が機能するために必要であり、他のいくつかのオプションにも必要です。
    #この.iniファイルで有効になっているもの。
    #UCD-SNMP / NET-SNMPパッケージからのPerlモジュールの使用を無効にするには、0に設定します。
    #注:スタンドアロンモードでこれを有効にすると、SNMPTTの実行が非常に遅くなる可能性があります。
    #起動時のMIBのロード。
    net_snmp_perl_enable = 0

    #1に設定すると、net_snmp_perl_enableがOIDおよびENUM変換のキャッシュを有効にします
    #有効。 これを有効にすると、翻訳が高速になります。
    #0に設定すると、キャッシュが無効になります。
    #注:Net-SNMPのMIBファイルを更新した後、SNMPTTを再起動します。そうしないと、キャッシュが
    #不正確なデータが含まれています。 デフォルトは1です。
    net_snmp_perl_cache_enable = 1

    #これにより、UCD-SNMP / NET-SNMP Perlモジュールが使用するbest_guessパラメーターが設定されます。
    #シンボリック名をOIDに、またはその逆に変換します。
    #UCD-SNMP、Net-SNMP 5.0.8以前のバージョンでは、この値を0に設定します。
    #Net-SNMP 5.0.9、またはパッチ722075が適用されたNet-SNMPの場合、この値を2に設定します。
    #値2は、Net-SNMPコマンドラインユーティリティの-IRと同等です。
    #UCD-SNMPおよびNet-SNMP 5.0.8以前では、特定の形式の翻訳ができない場合があります
    #RFC1213-MIB :: sysDescrなどの記号名。 Net-SNMP 5.0.9またはパッチ722075では、
    #翻訳されるすべての可能性。 詳細については、READMEのFAQセクションを参照してください。
    net_snmp_perl_best_guess = 0

    #ログファイルへの出力時に、受信したトラップのOIDを処理する方法を構成します/
    #データベース。 $ O変数には適用されません。
    #0に設定すると、デフォルトの数値OIDが使用されます
    #1に設定すると、トラップOIDが短いテキスト(記号形式)に変換されます(例:linkUp)
    #2に設定して、トラップOIDをモジュール名の短いテキストに変換します(例:IF-MIB :: linkUp)
    #トラップOIDをロングテキストに変換するには3に設定します(例:iso ... snmpTraps.linkUp)
    #トラップOIDをモジュール名付きのロングテキストに変換するには、4に設定します(例:
    #IF-MIB :: iso ... snmpTraps.linkUp)
    #注:-長い形式の出力は、Net-SNMPのバージョンによって異なります
    #使用しています。
    #-net_snmp_perl_enable *有効にする必要があります*
    #-データベースロギングを使用する場合、trapoid列が
    #行全体
    translate_log_trap_oid = 0

    #変数バインディングのVALUEに含まれるOIDの処理方法を構成します。
    #これは、$ n、$ + n、$ -n、$ vn、$ + *、$-*の値にのみ適用されます。 置換用
    #変数NAMES($ + nなど)を含む場合、変数VALUEのみが影響を受けます。
    #0に設定すると、OID値のテキストへの変換が無効になります(記号形式)
    #OID値を短いテキスト(記号形式)に変換するには1に設定します(例:BuildingAlarm)
    #OID値をモジュール名付きの短いテキストに変換するには、2に設定します(例:UPS-MIB :: BuildingAlarm)
    #OID値を長いテキストに変換するには3に設定します(例:iso ... upsAlarm.BuildingAlarm)
    #4に設定すると、OID値がモジュール名付きのロングテキストに変換されます(例:
    #UPS-MIB :: iso ... upsAlarm.BuildingAlarm)
    #たとえば、「UPSアラーム(.1.3.6.1.4.1.534.1.7.12)がクリアされました」という値が含まれている場合、
    #「UPSアラーム(UPS-MIB :: BuildingAlarm)がクリアされました」に変換できます。
    #注:net_snmp_perl_enable *を有効にする必要があります*
    translate_value_oids = 1

    #シンボリックエンタープライズOIDを$ Eで表示する方法を設定します。
    #1、2、3、または4に設​​定します。translate_value_oidsオプション1、2、3、および4を参照してください。
    #注:net_snmp_perl_enable *を有効にする必要があります*
    translate_enterprise_oid_format = 1

    #$ OのシンボリックトラップOIDの表示方法を設定します。
    #1、2、3、または4に設​​定します。translate_value_oidsオプション1、2、3、および4を参照してください。
    #注:net_snmp_perl_enable *を有効にする必要があります*
    translate_trap_oid_format = 1

    #$ v、$ -n、$ + n、$-*、および$ + *のシンボリックトラップOIDの表示方法を設定します。
    #1、2、3、または4に設​​定します。translate_value_oidsオプション1、2、3、および4を参照してください。
    #注:net_snmp_perl_enable *を有効にする必要があります*
    translate_varname_oid_format = 1

    #0に設定すると、INTEGER値の列挙タグへの変換が無効になります
    #MIBファイル
    #1に設定すると、INTEGER値を
    #MIBファイル
    #例:moverDoorState:ではなくmoverDoorState:2
    #注:net_snmp_perl_enable *を有効にする必要があります*
    translate_integers = 1

    #SNMPTTが使用するMIBS環境変数を設定できます
    #空白のままにするかコメントアウトして、システム環境設定を使用します
    #すべてのMIBを処理するには、ALLに設定します
    #詳細については、snmp.confのマニュアルページを参照
    mibs_environment = ALL

    #ワイルドカードがFORMAT /
    #EXEC行。 デフォルトはスペースです。 値は引用符で囲む必要があります。 1つまたは
    #文字
    wildcard_expansion_separator = ""

    #安全でないREGEXコードの実行を許可するには、1に設定します。
    #安全でないREGEXコードの実行を防ぐには、0に設定します(デフォルト)。
    #安全でないREGEXコードを有効にすると、変数の内挿とeの使用が許可されます
    #キャプチャなどの置換などのステートメントを許可する修飾子
    #as:(1(2)3)(5 $ 1 6)
    #出力:5 2 6
    #または:(1(2)3)( "five" .length($ 1)。 "six")e
    #出力するもの:5 3 6

    #これは、正規表現の内容が
    #(右)は、安全でないコードを含む可能性のあるPerlによって実行(評価)されます*。
    #SNMPTT構成ファイルが安全であることを確認してください!
    allow_unsafe_regex = 0

    #から引用符からバックスラッシュ(エスケープ)を削除するには、1に設定します
    #snmptrapd。 たとえば、\ "に変更されます"
    #0に設定すると無効になります
    remove_backslash_from_quotes = 0

    #1に設定すると、トラップが処理されるたびにNODESファイルがロードされます。
    #snmptt.confファイルのロード時にすべてのNODESファイルをロードするには、0に設定します。
    #NODESファイル(NODESのリストを含むファイル)が使用される場合、1に設定
    #を使用するEVENTが処理されるたびにリストがロードされます
    #NODESファイル。 これにより、SNMPTTの実行中にNODESファイルを変更できます
    #実行中ですが、トラップの数に応じて多くのファイル読み取りが発生する可能性があります
    #受け取りました。 デフォルトは0
    dynamic_nodes = 0

    #このオプションを使用すると、$ D置換変数を使用して、
    #SNMPTT.CONFまたはMIBファイルの説明テキスト。
    #0に設定して、$ D置換変数を無効にします。 $ Dが使用される場合、何もありません
    #が出力されます。
    #1に設定して$ D置換変数を有効にし、
    #SNMPTT .confファイルに保存されている説明。 このオプションを有効にすると
    #SNMPTTが使用するメモリ量を大幅に増やします。
    #2に設定して$ D置換変数を有効にし、
    #MIBファイルの説明。 これにより、UCD-SNMP / NET-SNMP Perlが有効になります
    #モジュールsave_descriptions変数。 このオプションを有効にすると、
    #Net-SNMP SNMP Perlモジュールが使用するメモリ量を増やします。
    #SNMPTTによるメモリ使用量が増加します。
    description_mode = 0

    #1に設定すると、各行の先頭にある空白がMIBから削除されます
    #またはdescription_modeが1または2に設定されている場合のSNMPTT.CONFの説明。
    description_clean = 1

    #警告:実験的。 実稼働環境には推奨されません。
    #スレッドを有効にすると、SNMPTTが予期せず終了する場合があります。
    #Perl 5.6.0以降でスレッド(ithreads)を有効にするには1に設定します。 有効にすると、
    #EXECはスレッドで起動し、SNMPTTが他の処理を続行できるようにします
    #トラップ。 threads_maxも参照してください。
    #スレッド(ithreads)を無効にするには0に設定します。
    #デフォルトは0
    threads_enable = 0

    #警告:実験的。 実稼働環境には推奨されません。
    #スレッドを有効にすると、SNMPTTが予期せず終了する場合があります。
    #このオプションを使用すると、スレッドの最大数を設定できます
    #一度に実行します。 デフォルトは10
    threads_max = 10

    #$ xの日付形式はstrftime()形式です。 定義されていない場合、デフォルト
    #to%a%b%e%Y.
    #date_format =%a%b%e%Y

    #strftime()形式の$ Xの時刻形式。 定義されていない場合、デフォルト
    #to%H:%M:%S.
    #time_format =%H:%M:%S

    #ロギング時の日付/時刻のstrftime()形式の日付時刻形式
    #標準出力、snmpttログファイル(log_file)および不明なログファイル
    #(unknown_trap_log_file)。 デフォルトはlocaltime()です。 SQLについては、
    #date_time_format_sql。
    #例:%a%b%e%Y%H:%M:%S
    date_time_format =%H:%M:%S%Y /%m /%d

    [DaemonMode]
    #デーモンモードで実行するときにsnmpttをバックグラウンドにフォークするには1に設定します
    #Windowsでは無視されます。 ドキュメントを参照
    daemon_fork = 1

    #数値ユーザーID(例:500)またはテキストユーザーID(例:snmptt)に設定
    #snmpttは、デーモンモードで実行するときに変更する必要があります。 空白のままにする
    #無効にします。 使用するユーザーには、すべてのログに対する読み取り/書き込みアクセス権が必要です
    #ファイル、スプールフォルダー、および構成ファイルへの読み取りアクセス。
    #snmpttをルートとして起動する場合にのみこれを使用します。
    #2番目の(子)プロセスがdaemon_uidユーザーとして開始されるため、
    #2つのsnmpttプロセスが実行されます。 最初のプロセスは
    #snmptt(root)を実行したユーザーとして実行を続け、
    #終了する子。 子プロセスが終了すると、親プロセスは削除されます
    #snmptt.pidファイルを閉じて終了します。
    daemon_uid = snmptt

    #デーモンモードで実行中のプロセスIDを保存するファイルの完全パス。
    pid_file = /var/run/snmptt.pid

    #受信したトラップを読み取るディレクトリ。 例:/ var /スプール/ snmptt /
    #末尾のスラッシュを忘れないでください!
    スプールディレクトリ= / var /スプール/ snmptt /

    #スプールファイルの処理間でスリープする時間(秒)
    睡眠= 5

    #1に設定すると、SNMPTTは、トラップがSNMPTTHANDLERによって処理された時間を使用します
    #0に設定すると、SNMPTTがトラップの処理時間を使用します。 注:0を使用すると
    #「スリープ」に使用された秒数だけ時間が経過する
    use_trap_time = 1

    #0に設定すると、SNMPTTが処理を試みた後にスプールされたトラップファイルを消去します
    #トラップがログシステムに正常に記録されなかった場合でも、トラップ。
    #1に設定すると、SNMPTTがスプールされたトラップファイルを正常に消去した後にのみ消去します
    #少なくとも1つのログシステムにログを記録します。
    #2に設定すると、SNMPTTがスプールされたトラップファイルを正常に削除した後にのみ消去します
    #すべての有効なログシステムにログを記録します。 警告:複数のログシステムが存在する場合
    #有効にすると、1つだけが失敗し、他のログシステムは継続的にログに記録されます
    #すべてのログシステムが機能するまで。
    #推奨される設定は1で、1つのログシステムのみが有効になっています。
    keep_unlogged_traps = 1

    #重複トラップが処理される頻度。 すべての着信トラップのMD5ハッシュ
    #はメモリに保存され、重複のチェックに使用されます。 を除くすべての変数
    #uptime変数は、MD5の計算時に使用されます。 この変数が大きいほど、
    #snmpttが必要とするメモリが増えます。
    #注:ほとんどの場合、これを有効にすることをお勧めしますが、場合によっては
    #マイナス効果。 たとえば、ワイヤレスデバイスのトラブルシューティングを行う場合
    #接続が失われ続けるため、これを無効にして、表示されるようにすることができます。
    #すべての関連付けと関連付け解除。
    #5分= 300
    #10分= 600
    #15分= 900
    duplicate_trap_window = 0

    [ロギング]
    #メッセージを標準出力に送信できるようにするには1に設定し、無効にするには0に設定します。
    #通常、このプログラムを別のプログラムにパイピングしない限り無効になります
    stdout_enable = 0

    #* TRAPS *のテキストロギングを有効にするには1に設定します。 必ずlog_fileを指定してください
    #場所
    log_enable = 1

    #ログファイルの場所。 完全なパスとファイル名。 例: '/var/log/snmptt/snmptt.log'
    log_file = /tmp/my_traps.tmp

    #1に設定すると、* SNMPTTシステムエラー*のテキストロギングが有効になります。 確認してください
    #log_system_fileの場所を指定
    log_system_enable = 0

    #ログファイルの場所。 完全なパスとファイル名。
    #例: '/var/log/snmptt/snmpttsystem.log'
    log_system_file = /var/log/snmptt/snmpttsystem.log

    #1に設定して、未知のトラップのログを有効にします。 通常、これはオフにしておく必要があります
    #ファイルが急速に大きくなる可能性があるため。 主にトラブルシューティングに使用されます。 もし
    #snmptt.confでトラップを定義しましたが、実行されていません。これを有効にします
    #不正なエントリが原因で未知のトラップと見なされているかどうかを確認するか、
    #snmptt.confファイルから単に欠落しています。
    #未知のトラップは、テキストファイル、SQLテーブル、またはその両方で記録できます。
    #SQLセクションを参照して、不明なトラップを記録するSQLテーブルを定義します。
    unknown_trap_log_enable = 1

    #トラップログファイルの場所が不明です。 完全なパスとファイル名。
    #例: '/var/log/snmptt/snmpttunknown.log'
    #SQLへのログが有効な場合、テキストファイルへのログを無効にするには空白のままにします
    #不明なトラップの場合
    unknown_trap_log_file = /var/log/snmptt/snmpttunknown.log

    #統計がsyslogまたはイベントログに記録される頻度(秒単位)。
    #0に設定すると無効になります
    #1時間= 216000
    #12時間= 2592000
    #24時間= 5184000
    statistics_interval = 0

    #1に設定すると、* TRAPS *のsyslogへのロギングが有効になります。 Sys :: Syslogがない場合
    #モジュールはこれを無効にします。 Windowsユーザーはこれを無効にする必要があります。
    syslog_enable = 1

    #* TRAPS *のロギングに使用するsyslog機能。 例: 'local0'
    syslog_facility = local0

    #トラップの重大度レベルに基づいて* TRAPS *のsyslogレベルを設定します
    #snmptt.confファイルで定義されているとおり。 値は、1行につき1つである必要があります
    #syslog_level_ *およびEND行。大文字と小文字は区別されません。 例:
    #警告
    #クリティカル
    #重複した定義は、より高い重大度の定義を使用します。
    syslog_level_debug = << END
    終了
    syslog_level_info = << END
    終了
    syslog_level_notice = << END
    終了
    syslog_level_warning = << END
    終了
    syslog_level_err = << END
    終了
    syslog_level_crit = << END
    終了
    syslog_level_alert = << END
    終了

    #* TRAPS *のロギングに使用するsyslogデフォルトレベル。 例:警告
    #有効な値:emerg、alert、crit、err、warning、notice、info、debug
    syslog_level =警告

    #1に設定すると、* SNMPTTシステムエラー*のsyslogへのロギングが有効になります。 あなたが持っていない場合
    #Sys :: Syslogモジュールはこれを無効にします。 Windowsユーザーはこれを無効にする必要があります。
    syslog_system_enable = 1

    #* SNMPTTシステムエラー*のロギングに使用するsyslog機能。 例: 'local0'
    syslog_system_facility = local0

    #ロギングに使用するSyslogレベル* SNMPTTシステムエラー* ...例: 'warning'
    #有効な値:emerg、alert、crit、err、warning、notice、info、debug
    syslog_system_level =警告

    [SQL]
    #エンタープライズ列に数値OIDまたはシンボリックOIDが含まれているかどうかを判別します
    #数値OIDには0に設定
    #シンボリックOIDの場合は1に設定
    #translate_enterprise_oid_formatを使用してフォーマットを決定します
    #注:net_snmp_perl_enable *を有効にする必要があります*
    db_translate_enterprise = 0

    #不明なトラップに使用するFORMAT行。 定義されていない場合、デフォルトは$-*です。
    db_unknown_trap_format = '$-*'

    #受信したトラップのテーブルのカスタムSQL列名と値のリスト
    #(以下の* _tableで定義)。 形式は
    #列名
    #値

    #例:

    #binding_count
    #$#
    #uptime2
    #エージェントは$ Tの間稼働しています。
    sql_custom_columns = << END
    終了

    #未知のトラップのテーブルのカスタムSQL列名と値のリスト
    #(以下で定義される* _table_unknown)。 形式については、sql_custom_columnsを参照してください。
    sql_custom_columns_unknown = << END
    終了

    #MySQL:1に設定すると、DBI経由でMySQLデータベースへのロギングが有効になります(Linux / Windows)
    #これにはDBI ::およびDBD :: mysqlが必要です
    mysql_dbi_enable = 0

    #MySQL:データベースサーバーのホスト名(オプション-デフォルトlocalhost)
    mysql_dbi_host = localhost

    #MySQL:データベースサーバーのポート番号(オプション-デフォルト3306)
    mysql_dbi_port = 3306

    #MySQL:使用するデータベース
    mysql_dbi_database = snmptt

    #MySQL:使用するテーブル
    mysql_dbi_table = snmptt

    #MySQL:未知のトラップに使用するテーブル
    #空白のままにして、未知のトラップのMySQLへのロギングを無効にします
    #注:unknown_trap_log_enableを有効にする必要があります。
    mysql_dbi_table_unknown = snmptt_unknown

    #MySQL:統計に使用するテーブル
    #注:statistics_intervalを設定する必要があります。 stat_time_format_sqlも参照してください。
    #mysql_dbi_table_statistics = snmptt_statistics
    mysql_dbi_table_statistics =

    #MySQL:使用するユーザー名
    mysql_dbi_username = snmpttuser

    #MySQL:使用するパスワード
    mysql_dbi_password =パスワード

    #MySQL:INSERTを試みる前にデータベースを「ping」するかどうか
    #接続がまだ有効であることを確認します。 *任意の*エラーが生成される場合
    #「データベースに接続できません」などのpingは、
    #データベース接続を再作成します。
    #0に設定すると無効になります
    #有効にするには1に設定
    #注:これはmysql_ping_intervalには影響しません。
    mysql_ping_on_insert = 1

    #MySQL:データベースを「ping」して、
    #接続はまだ有効です。 *などのpingによって*エラーが発生した場合
    #「データベースに接続できません」、データベースの再作成を試みます
    #接続。 0に設定すると、pingが無効になります。
    #注:これはmysql_ping_on_insertには影響しません。
    #無効= 0
    #5分= 300
    #15分= 900
    #30分= 1800
    mysql_ping_interval = 300

    #PostgreSQL:1に設定すると、DBI経由でPostgreSQLデータベースへのロギングが有効になります(Linux / Windows)
    #これにはDBI ::およびDBD :: PgPPが必要です
    postgresql_dbi_enable = 0

    #DBD :: PgPPモジュールを使用するには0に設定
    #DBD :: Pgモジュールを使用するには1に設定
    postgresql_dbi_module = 0

    #0に設定して、ホストとポートのネットワークサポートを無効にします
    #ホストとポートのネットワークサポートを有効にするには1に設定します
    #1に設定する場合は、PostgreSQLがTCPIP経由の接続を許可するように設定されていることを確認します
    #$ PGDATA / postgresql.confファイルでtcpip_socket = trueで、IPアドレスを追加
    #SNMPTTサーバーから$ PGDATApg_hba.confへ。 の設定ファイルの一般的な場所
    #PostgreSQLのRPMインストールは、/ var / lib / pgsql / dataです。
    postgresql_dbi_hostport_enable = 0

    #PostgreSQL:データベースサーバーのホスト名(オプション-デフォルトのlocalhost)
    postgresql_dbi_host = localhost

    #PostgreSQL:データベースサーバーのポート番号(オプション-デフォルト5432)
    postgresql_dbi_port = 5432

    #PostgreSQL:使用するデータベース
    postgresql_dbi_database = snmptt

    #PostgreSQL:未知のトラップに使用するテーブル
    #空白のままにして、未知のトラップのPostgreSQLへのロギングを無効にします
    #注:unknown_trap_log_enableを有効にする必要があります。
    postgresql_dbi_table_unknown = snmptt_unknown

    #PostgreSQL:統計に使用するテーブル
    #注:statistics_intervalを設定する必要があります。 stat_time_format_sqlも参照してください。
    #postgresql_dbi_table_statistics = snmptt_statistics
    postgresql_dbi_table_statistics =

    #PostgreSQL:使用するテーブル
    postgresql_dbi_table = snmptt

    #PostgreSQL:使用するユーザー名
    postgresql_dbi_username = snmpttuser

    #PostgreSQL:使用するパスワード
    postgresql_dbi_password =パスワード

    #PostgreSQL:INSERTを試みる前にデータベースを「ping」するかどうか
    #接続がまだ有効であることを確認します。 *任意の*エラーが生成される場合
    #「データベースに接続できません」などのpingは、
    #データベース接続を再作成します。
    #0に設定すると無効になります
    #有効にするには1に設定
    #注:これはpostgresqll_ping_intervalには影響しません。
    postgresql_ping_on_insert = 1

    #PostgreSQL:確認するためにデータベースが「ping」される頻度
    #接続はまだ有効です。 *などのpingによって*エラーが発生した場合
    #「データベースに接続できません」、データベースの再作成を試みます
    #接続。 0に設定すると、pingが無効になります。
    #注:これはpostgresql_ping_on_insertには影響しません。
    #無効= 0
    #5分= 300
    #15分= 900
    #30分= 1800
    postgresql_ping_interval = 300

    #ODBC:1に設定すると、DBD :: ODBCを使用してODBC経由でデータベースにログを記録できます。
    #これにはDBI ::とDBD :: ODBCの両方が必要です
    dbd_odbc_enable = 0

    #DBD:ODBC:使用するデータベース
    dbd_odbc_dsn = snmptt

    #DBD:ODBC:使用するテーブル
    dbd_odbc_table = snmptt

    #DBD:ODBC:未知のトラップに使用するテーブル
    #空白のままにして、未知のトラップのDBDへのロギングを無効にします:ODBC
    #注:unknown_trap_log_enableを有効にする必要があります。
    dbd_odbc_table_unknown = snmptt_unknown

    #DBD:ODBC:統計に使用するテーブル
    #注:statistics_intervalを設定する必要があります。 stat_time_format_sqlも参照してください。
    #dbd_odbc_table_statistics = snmptt_statistics
    dbd_odbc_table_statistics =

    #DBD:ODBC:使用するユーザー名
    dbd_odbc_username = snmptt

    #DBD:DBC ::使用するパスワード
    dbd_odbc_password =パスワード

    #DBD:ODBC:INSERTを試みる前にデータベースを「ping」するかどうか
    #接続がまだ有効であることを確認します。 *任意の*エラーが生成される場合
    #「データベースに接続できません」などのpingは、
    #データベース接続を再作成します。
    #0に設定すると無効になります
    #有効にするには1に設定
    #注:これはdbd_odbc_ping_intervalには影響しません。
    dbd_odbc_ping_on_insert = 1

    #DBD:ODBC ::確認のためにデータベースを「ping」する頻度
    #接続はまだ有効です。 *などのpingによって*エラーが発生した場合
    #「データベースに接続できません」、データベースの再作成を試みます
    #接続。 0に設定すると、pingが無効になります。
    #注:これはdbd_odbc_ping_on_insertには影響しません。
    #無効= 0
    #5分= 300
    #15分= 900
    #30分= 1800
    dbd_odbc_ping_interval = 300

    #SQLのtraptime列の日時形式。 デフォルトは
    #localtime()。 SQLで日付/時刻フィールドが使用される場合、これは
    #SQLサーバーでサポートされている標準に従うように変更する。
    #例:MySQL DATETIMEの場合、%Y-%m-%d%H:%M:%Sを使用します
    #date_time_format_sql =

    #SQLのstat_time列の日時形式。 デフォルトは
    #localtime()。 SQLで日付/時刻フィールドが使用される場合、これは
    #SQLサーバーでサポートされている標準に従うように変更する。
    #例:MySQL DATETIMEの場合、%Y-%m-%d%H:%M:%Sを使用します
    #stat_time_format_sql =

    [実行]

    #EXECステートメントの実行を許可するには、1に設定します。 あなたがいない限り、通常はオンのままにしてください
    #すべてのEXECコマンドを一時的に無効にしたい
    exec_enable = 1

    #PREEXECステートメントの実行を許可するには、1に設定します。 あなたがいない限り、通常はオンのままにしてください
    #すべてのPREEXECコマンドを一時的に無効にしたい
    pre_exec_enable = 1

    #定義されている場合、次のコマンドがすべての未知のトラップに対して実行されます。 に渡された
    #コマンドは、unknown_trap_log_fileに似た、すべての標準変数とエンタープライズ変数になります
    #改行なし。
    unknown_trap_exec =

    #unknown_trap_execコマンドに渡されるFORMAT行。 定義されていない場合、それ
    #デフォルトは、unknown_trap_exec設定で説明されているものになります。 次の
    #は、unknown_trap_exec設定で説明されているデフォルトに*似た*
    #(すべて1行で):
    #$ x !!! $ X:値Aから受信した不明なトラップ($ o):値0:$ A値1:$ aR
    #値2:$ T値3:$ o値4:$ aA値5:$ C値6:$ e Ent値:$ + *
    unknown_trap_exec_format =

    #1に設定してワイルドカードをエスケープします(*および?)EXECでは、PREEXECおよびunknown_trap_exec
    #コマンド。 これを有効にして、シェルがワイルドカードを展開しないようにします
    #文字。 デフォルトは1です。
    exec_escape = 1

    [デバッグ]
    #0-メッセージを出力しません
    #1-基本的なメッセージを出力する
    #2-すべてのメッセージを出力
    デバッグ= 2

    #デバッグファイル-SNMPTT
    #デバッグ出力ファイルの場所。 空白のままにすると、デフォルトでSTDOUTになります(
    #スタンドアロンモード、またはフォークなしのデーモンモード)
    DEBUGGING_FILE = /tmp/snmptt.debug
    #DEBUGGING_FILE = /var/log/snmptt/snmptt.debug

    #デバッグファイル-SNMPTTHANDLER
    #デバッグ出力ファイルの場所。 空白のままにすると、デフォルトでSTDOUTになります
    DEBUGGING_FILE_HANDLER =
    #DEBUGGING_FILE_HANDLER = /var/log/snmptt/snmptthandler.debug

    [TrapFiles]
    #snmptt.confファイルのリスト(これはsnmptrapd.confファイルではありません)。 完全なパス
    #およびファイル名。 例: '/etc/snmp/snmptt.conf'
    snmptt_conf_files = << END
    /etc/snmp/snmptt.conf
    終了

    したがって、snmpdデーモンはudp 162をリッスンし、メッセージをsnmpttにリダイレクトし、トラップを処理してphpスクリプトを実行します。 snmptt.ini構成では、デバッグモードが有効になっているため、着信トラップはすべて/tmp/snmptt.debugに書き込まれます。

  4. 実際、処理スクリプト自体(phpとmysqlはサーバーに既にインストールおよび構成されていると思います):
    /opt/script.php
     #!/usr/bin/php -q <?php // argv  ,    //$argv[0]       //. /etc/snmp/snmptt.conf . -ip,-Mac-Notification. //ip- $ip=$argv[1]; // mac-notification   mac_msg for($i=2;$i<=count($argv)-2;$i++) { $mac_msg .= $argv[$i]; } //  mac_msg   mac-notification $mac_notification = str_split($mac_msg,22); //   /*  CREATE TABLE IF NOT EXISTS `mac_notification` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_create` datetime NOT NULL, `status` varchar(20) NOT NULL, `vlan` varchar(250) NOT NULL, `mac` varchar(20) NOT NULL, `interface` int(11) NOT NULL, `ip` varchar(250) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf32 ; */ $CONF_DB = array ( 'host' => 'localhost', 'username' => 'USERNAME', 'password' => 'PASSWORD', 'db_name' => 'mac' ); $dbConnection = new PDO( 'mysql:host='.$CONF_DB['host'].';dbname='.$CONF_DB['db_name'], $CONF_DB['username'], $CONF_DB['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") ); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); foreach($mac_notification as $value) { //  mac-notification $status=substr($value,0,2); $vlan=hexdec(substr($value,2,4)); $mac=substr($value,6,12); $mac = mb_strtolower(substr_replace($mac,".",4).substr_replace(substr($mac,4,8),".",4).substr($mac,8,12)); $interface=hexdec(substr($value,20,2)); $stmt = $dbConnection->prepare('INSERT INTO mac_notification (date_create,status,mac,interface,ip,vlan) VALUES (now(), :status, :mac, :interface, :ip, :vlan)'); $stmt->execute(array(':status'=>$status,':mac'=>$mac,':interface'=>$interface,':ip'=>$ip,':vlan'=>$vlan)); } ?> 




— snmp . Cisco ftp .

, .

Source: https://habr.com/ru/post/J243035/


All Articles