Ruby - MAC アドレスからベンダ名判別!

Updated:


MAC アドレスは、言わずと知れたネットワーク機器が持っている固有の識別子のことです。

MAC アドレスからベンダ名を判別できるのも「言わずもがな」でしょう。

以下、それについての備忘録です。

1. MAC アドレスとは?

ご存じない方のために。

  • MAC アドレスは世界中に存在するネットワークカード(Ethernet カード)が持っている固有の識別子である。
  • MAC アドレスは OSI 参照モデルの「データリンク層(第2層)」に相当する。
  • MAC アドレスは、全部で 48 ビットのアドレスであり、 “08-00-27-C8-81-99” のように 8 ビット(オクテットと呼ぶ)ずつハイフンで区切って表現することが多い。
  • MAC アドレスの前半の 24 ビット(第1・2・3オクテット)は OUI(organizationally unique identifier, ベンダ識別子)と呼ばれ、機器メーカーを表わす情報になっている。
  • MAC アドレスの第4オクテットは機種を表す ID となっている。
  • MAC アドレスの第5・6オクテットはシリアル ID となっている。
  • 各 OUI(ベンダ識別子)では 24 ビット = 16,777,216 個の MAC アドレスしか使用できないことになるが、不足する場合は別の OUI を申請するようだ。
  • ベンダによっては、MAC アドレスを人為的に設定できる機器もある。

2. ベンダ名判別

MAC アドレスの前半 24 ビットを調べれば、どのベンダの機器なのかは分かる。

その一覧は “IEEE-SA - The IEEE Standards Association - Home” によって管理されている。
IEEE-SA - Registration Authority OUI Public Listing” ページ内でも検索が可能であるが、このページ内の “Download a copy” というリンクに一覧のテキストファイル(ファイル名: “oui.txt”)も置かれている。(ちなみに、この “oui.txt” は日々更新されているようだ。)

3. Ruby スクリプト作成

Ruby で “oui.txt” を読み込んで検索する簡単なスクリプトを作成してみた。(参考までに)
最新の “oui.txt” でなくてもよいのなら、あらかじめ “oui.txt” をダウンロードしておいてそのテキストファイルを読み込むようにしてもよい。

File: search_mac.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
require 'open-uri'

class SearchMac
  URL_OUI = "http://standards.ieee.org/develop/regauth/oui/oui.txt"

  def initialize
    @arg = ARGV[0]
  end

  def exec_main
    begin
      open(URL_OUI) do |f|
        f.each do |line|
          if /\s*(.*?)\s*\(hex\)\t*(.*?)\n/ =~ line
            puts "#{$1}: #{$2}" if @arg == $1
          end
        end
      end
    rescue => e
      STDERR.puts "[ERROR][#{self.class.name}.exec_main] #{e}"
      exit 1
    end
  end
end

SearchMac.new.exec_main

4. Ruby スクリプト実行

作成した Ruby スクリプトを実行してみる。(引数に MAC アドレスの前半部分をハイフン付きで指定)

$ ruby search_mac.rb 08-00-27
08-00-27: CADMUS COMPUTER SYSTEMS

参考サイト


以上。





 

Sponsored Link

 

Comments