隣接機器に何が接続されているのか不明なことがある。いやマジで。
macアドレスのメーカ名を自動置換するプログラムを書いていたら面白いモジュールを見つけた。
manuf というもの。
テキストファイルのマックアドレスをベンダー名に置換するサンプルプログラム。
例えば、show mac address-table 表示結果など。
manfu
python-manufは、MACアドレスを分析・解析するためのPythonパッケージです。具体的には、以下のようなことができます。
- MACアドレスの解析:MACアドレスを入力すると、そのアドレスに対応するベンダー情報を取得することができます。例えば、”00:11:22:33:44:55″というMACアドレスを解析すると、”Cisco Systems, Inc.”というベンダー情報が取得できます。
- ベンダー情報の取得:ベンダー情報を入力すると、そのベンダーがどのようなMACアドレスを使用するかを取得することができます。例えば、”Cisco Systems, Inc.”というベンダー情報を入力すると、”00:01:42″〜”00:01:73″の範囲のMACアドレスを使用することがわかります。
- ファイルからの解析:ファイルに含まれるMACアドレスを解析することができます。例えば、ログファイルに含まれるMACアドレスを解析することで、どのような機器がどのような時間にアクセスしたかを分析することができます。
python-manufは、MACアドレスから製造元を特定するためのPythonライブラリであり、更新情報はIEEEが提供するMA-Lデータベースを元にしています。
IEEEは、MA-Lデータベースを毎週更新しており、python-manufの更新もその頻度で行われます。つまり、python-manufの更新頻度は1週間に1回程度となります。
データサイズについては、python-manufのGitHubページで配布されているデータファイルは、約6.5MB程度のサイズとなっています。ただし、MA-Lデータベースのアップデートによってデータサイズは変動する可能性があります。
また、python-manufはオープンソースプロジェクトであり、ユーザーが自分でMA-Lデータベースをダウンロードして更新することもできます。この場合、MA-Lデータベースのサイズは約23MB程度であり、ダウンロードする頻度はIEEEの更新頻度に依存します。
参考:ChatGPT(2023/03/05)による回答
get-mac-to-vender.py
import os
import manuf
import re
# スクリプトファイルの場所を取得
script_dir = os.path.dirname(os.path.abspath(__file__))
# カレントディレクトリを移動
os.chdir(script_dir)
#テキストファイル
input_file = "mac_address_table.txt"
output_file = f'vender_{input_file}'
# manufライブラリを使って、MACアドレスをベンダー名に置換するためのオブジェクトを作成
m = manuf.MacParser()
# テキストファイルを読み込み、各行を処理する
with open(input_file, "r") as f:
lines = f.readlines()
# 置換後のMACアドレスを格納するリスト
new_lines = []
# テキストファイルからMACアドレスを抽出する正規表現
# 以下のいずれの形式にもマッチ
# 01:23:45:67:89:AB、
# 01.23.45.67.89.AB、
# 01-23-45-67-89-AB、
# 01 23 45 67 89 AB。
mac_pattern = re.compile(r'([0-9A-Fa-f]{2}[:.-]?){5}([0-9A-Fa-f]{2})')
for line in lines:
# 行からMACアドレスを抽出する
mac = mac_pattern.search(line)
if mac:
# MACアドレスをベンダー名に置換する
vendor = m.get_manuf(mac.group(0))
# 置換後の行を生成する
new_line = mac_pattern.sub(vendor, line)
# 置換後の行をリストに追加する
new_lines.append(new_line)
else:
# MACアドレスが見つからない場合は、そのままの行をリストに追加する
new_lines.append(line)
# 置換後の行をファイルに保存する
with open(output_file, "w") as f:
f.writelines(new_lines)
例1 vender mac_address_table.txt
***************************************************************************
* Nexus 9000v is strictly limited to use for evaluation, demonstration *
* and NX-OS education. Any use or disclosure, in whole or in part of *
* the Nexus 9000v Software or Documentation to any third party for any *
* purposes is expressly prohibited except as otherwise authorized by *
* Cisco in writing. *
***************************************************************************
dist-sw01# show mac address-table
Legend:
* - primary entry, G - Gateway MAC, (R) - Routed MAC, O - Overlay MAC
age - seconds since last seen,+ - primary entry using vPC Peer-Link,
(T) - True, (F) - False, C - ControlPlane MAC, ~ - vsan
VLAN MAC Address Type age Secure NTFY Ports
---------+-----------------+--------+---------+------+----+------------------
G 101 All-HSRP-routers static - F F sup-eth1(R)
G 102 All-HSRP-routers static - F F vPC Peer-Link(R)
G 103 All-HSRP-routers static - F F vPC Peer-Link(R)
G 104 All-HSRP-routers static - F F vPC Peer-Link(R)
G 105 All-HSRP-routers static - F F vPC Peer-Link(R)
G 101 RealtekU static - F F vPC Peer-Link(R)
G 102 RealtekU static - F F vPC Peer-Link(R)
G 103 RealtekU static - F F vPC Peer-Link(R)
G 104 RealtekU static - F F vPC Peer-Link(R)
G 105 RealtekU static - F F vPC Peer-Link(R)
G - RealtekU static - F F sup-eth1(R)
G 101 RealtekU static - F F sup-eth1(R)
G 102 RealtekU static - F F sup-eth1(R)
G 103 RealtekU static - F F sup-eth1(R)
G 104 RealtekU static - F F sup-eth1(R)
G 105 RealtekU static - F F sup-eth1(R)
dist-sw01#
環境がイマイチで、結果が面白くないけど、まぁ一応できた。
例2
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-66-generic x86_64)
cisco@internet-host01:~$ ip neigh
10.10.20.254 dev ens9 lladdr VMware DELAY
cisco@internet-host01:~$ exit
logout
ほか
コマンド取得のプログラムと組み合わせればその場でメーカ確認ができる。
powershellで取得した情報は、日本語文字コードの関係でそもそもファイル読み込みが上手くできなかった。そのうち考える。
コメント