web-dev-qa-db-ja.com

解析可能な方法でCiscoルーターから情報を取得する

CiscoルーターからSSH経由で構成ファイルをプルして解析するスクリプトを作成しようとしています。これにより、事前定義された標準を満たしていることを確認できます(たとえば、パスワードを「Cisco」にしないでください)。

ルーターへの接続とプログラムによるコマンドの実行は簡単です。私が遭遇する障壁は、show running configを実行すると、グローバル構成設定と特定のインターフェイスの設定が返されることです。

私の目標は、インターフェースの設定をグローバル設定とは異なる方法で処理することでした。たとえば、無効になっているインターフェイスの不適切な設定は無視できます。

グローバル設定を取得するための個別のコマンドとインターフェイス定義を取得するための個別のコマンド(例:show global settingsおよびshow interface settingsタイプのコマンド)はありますか?あるいは、解析を容易にするこの情報を取得するためのより良い方法はありますか?

5
ahjohnston25

自動化されたCisco IOS config解析

または、解析を容易にするこの情報を取得できるより良い方法はありますか?

IOS configsの階層のレイヤーのため、ルーター/スイッチ構成の解析は非常に複雑です。可能な場合は、解析に特化したツールを使用してください。そのようなツールの1つは ciscoconfparse (ドキュメントは here )です 注1ciscoconfparse 一連の単体テストがあり、ツールのバージョン間で解析の一貫性が保たれていることを確認します。

設定が正確な形式であると仮定してCiscoが使用IOS show running-configまたはshow startup-configciscoconfparse インターフェイスレベルの設定を自動的に検出します。これは、インターフェイスとグローバル設定の標準化を自動化できることを意味します...これは スイッチインターフェイス設定の監査の例です ドキュメントにあります。 ciscoconfparse たくさんあります。その機能の;ドキュメントを読むのに時間をかける必要があります.

また、多くの特定の値の解析を行う特殊なメソッドもいくつかあります。これらのメソッドは現在ベータ版であり、ソースコードでは のみ表示されます ...たとえば、スイッチ構成がc6509.confとして保存されているとします。

!
interface GigabitEthernet2/8
 ip address 192.0.2.1 255.255.255.252
 mtu 9000
 carrier-delay msec 50
!

スクリプトまたは pythonインタプリタ )を使用して、ネイティブpython表現...でIPアドレスとcarrier-delayを取得できます。

[mpenning@tsunami ~]$ python
Python 2.7.3 (default, Jan  2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from ciscoconfparse import CiscoConfParse
>>> config = CiscoConfParse('c6509.conf', factory=True)
>>>
>>> intfs = config.find_objects('interface GigabitEthernet2/8', exactmatch=True)
>>> intfs
[<IOSIntfLine # 1 'GigabitEthernet2/8' info: '192.0.2.1/30'>]
>>>
>>> intfs[0].ip_addr
'192.0.2.1'
>>>
>>> intfs[0].has_manual_carrierdelay
True
>>>
>>> intfs[0].manual_carrierdelay
0.05
>>>
>>> intfs[0].manual_mtu
9000
>>>

ベータ機能が必要な場合は、上記のようにfactory=Trueを使用して構成を解析する必要があります...


ネイティブCisco IOS解析機能

私の目標は、グローバル設定とは異なる方法でインターフェイスの設定を処理することでした。たとえば、無効になっているインターフェイスの不適切な設定は無視できます。

グローバル設定を取得するための個別のコマンドとインターフェイス定義を取得するための個別のコマンドがありますか(たとえば、show globalsettingsとshowinterface settings type ofコマンド)?

IOSを使用すると、個々のインターフェイスレベルの構成を表示できますが、数百のインターフェイスが存在する可能性がある場合は非常に面倒です...すべてのインターフェイスに対してこのコマンドを実行するとします...

CORE01.PUB.DAL02#sh runn int gi1/2
Building configuration...

Current configuration : 242 bytes
!
interface GigabitEthernet1/2
 description Link to Edge01.pub.dal02
 ip address 192.0.2.46 255.255.255.252
 ip ospf network point-to-point
 media-type rj45
end

CORE01.PUB.DAL02#

実行しているイメージに応じて、Cisco IOSは他のいくつかのグローバル構成セクションを許可します...これは12.4を実行しているルーターからのものです...

Edge01.PUB.DEN#sh running-config ?
  brief       configuration without certificate data
  class-map   Show class-map information
  full        full configuration
  interface   Show interface configuration
  linenum     Display line numbers in output
  map-class   Show map class information
  policy-map  Show policy-map information
  view        View options
  |           Output modifiers
  <cr>

Edge01.PUB.DEN#

IOS正規表現をCLIから使用して、グローバル構成の一部を取得することもできます...たとえば...

Edge01.PUB.DEN#show runn | include ^enable
enable secret 5 $1$mOmQ$sORLRqZQZ/cr7KSyrXUPZ.
Edge01.PUB.DEN#

参考までに、これは「Cisco」の有効化パスワードのMD5ハッシュであり、本番環境で見つかった場合にフラグを立てます。


このコメントへの返信

インターフェイス定義がいつ終了するかを定義する良い方法はありますか?すべてのインターフェイス行が1つのスペースでインデントされているようですが、それが構成全体で標準であるかどうかはわかりません

はい、シスコIOSは、子がインターフェイス設定ステートメント、IP拡張ACL回線などであるかどうかに関係なく、常に余分なスペースで子設定要素をインデントします。


End Notes

注1Stack Exchange免責事項 :著者です。

3
Mike Pennington

フォーマットにはコンテキストがあるため、コンテキストに応じて解析することを検討してください。そのためには、さらにコードを書く必要があるかもしれません。グローバル状態やインターフェースなどのオブジェクトモデルを構築するコードのモデルの使用を検討してください。

運用上、無効になっているインターフェイスから非準拠の設定を削除することは、誰かがそれらを有効にする場合に備えて良い考えです。

1
Falcon Momot