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