harry’s memorandum

おれおれメモ

ネットワーク上にある仮想マシンを探す方法

仮想マシンがたくさん増えるとその管理も大変になります。仮想化を推し進めればコストダウンになると思いきや、単純にサーバの数が増えるので管理コストが増えしまいます。いいかげんな開発環境によっては勝手にIPを振り仮想マシンをボコボコ起動させる人もいますので、ネットワーク上にある仮想マシンを探すようにしてみました。

準備

  • nmap(なるべく新しいversion)*1
  • ruby
  • nmap-parser

検索方法

nmapを使うだけで検知できます。仮想マシンはMACアドレスのベンダー部が決まっているのでそこから判別しています。これだと少し見難いです。

C:\admin>nmap  -sP  192.168.1.0/24

Starting Nmap 4.76 ( http://nmap.org ) at 2009-02-07 02:44 東京 (標準時)
Host 192.168.1.1 appears to be up.
MAC Address: 00:0D:02:23:7D:91 (NEC AccessTechnica)
Host crimson (192.168.1.3) appears to be up.
Host epitaph (192.168.1.4) appears to be up.
MAC Address: 00:22:19:19:98:F8 (Dell)
Host moonchild (192.168.1.10) appears to be up.
MAC Address: 00:1C:23:FB:7C:74 (Dell)
Host bound (192.168.1.11) appears to be up.
MAC Address: 00:0C:29:98:0D:33 (VMware)

コード

もう少し綺麗に出力したいので、nmap-parserを使った簡単なコードを書いてみました。

  • nmap-parserをインストールします。
C:\admin>gem install nmap-parser
Successfully installed nmap-parser-0.3.1
1 gem installed
Installing ri documentation for nmap-parser-0.3.1...
Installing RDoc documentation for nmap-parser-0.3.1...
  • サンプルコード
#!/usr/bin/ruby
require 'rubygems'
require 'nmap/parser'

array = []
parser = Nmap::Parser.parseread($stdin)
parser.hosts {|host| array << [host.addr, host.mac_addr] }

xen_mac = /^00:16:3E/
vmw_mac = /^00:0C:29/
array.select {|a|
  puts "#{a.join(" ")} xen"    if a[1] =~ xen_mac
  puts "#{a.join(" ")} vmware" if a[1] =~ vmw_mac
}

使用方法ですが上記コードを適当な名前で保存して実行してください。nmap の -oX は結果をXMLで出力します。

C:\admin>nmap -oX - 192.168.1.0/24  | ruby vir_scan.rb
192.168.1.11 00:0C:29:98:0D:33 vmware
192.168.1.12 00:0C:29:4D:B4:61 vmware
192.168.1.31 00:0C:29:57:ED:E6 vmware
192.168.1.41 00:16:3E:67:F3:E7 xen
192.168.1.43 00:16:3E:0C:DC:55 xen
192.168.1.44 00:16:3E:7E:09:A5 xen

nmapには対象ホストのOSを推測する OS fingerprinting 機能があります。 この機能を使えばさらに詳細に調べることができると思います。

*1:centos5.2のNmap4.11ではnmap-parserを使ったコードが失敗してしまった