読者です 読者をやめる 読者になる 読者になる

MACアドレスからIPを自動設定する

Linux

最近はもっぱらインフラ屋の山本です。

今回のネタは掲題の通り、NICのMACアドレスからIPを自動設定できるかな、
ということでやってみました。ちなみに背景としては、

1.VMの仮想NICのMACアドレスは自己管理していて、KVMだと上3バイトは
      52:54:00 で固定で、下3バイトで管理。
2.IPアドレスは10.0.0.0/8 なので、下3バイトで管理。お、MACと一緒じゃん。
3.じゃ、VMのIP指定はDHCPとかじゃなくてMACアドレスでできるんじゃね?

てな感じです。

材料:

・ /sys/class/net/eth*/address
  Linux で各NICのMACアドレスはこのファイルを cat すれば入手できます
・ /etc/init/networking.conf
  Ubuntu の upstart ではネットワークの初期化はこいつがやります。
  なかでは "ifup -a" してるだけです。

方法:

/etc/init/networking.conf の exec で以下のスクリプトを実行するように変更します。

#!/bin/sh
INTERFACES=`(cd /sys/class/net; ls -d eth*)`
mac_to_ip ()
{
    shift 3
    ip1=`printf '%d' 0x$1`
    ip2=`printf '%d' 0x$2`
    ip3=`printf '%d' 0x$3`
    ip=10.$ip1.$ip2.$ip3
}
for if in $INTERFACES; do
 MAC=`cat /sys/class/net/$if/address | tr : ' '`
    mac_to_ip $MAC
    /sbin/ifconfig $if $ip netmask 255.255.240.0 up
done

以上、簡単3分ハッキングでした。

追記:

なお、"52:54:00" の上位3バイトの代わりにローカルアドレスを使うと、他にも色々な情報をゲストOSに伝達できます。
例えば、

  • マスクビット数を指定したり、
  • Jumbo Frame のため MTU を大きくするように指定したり、
  • インタフェースがデフォルトゲートウェイに繋がっていたり、

といった情報を上位3バイトにコーディングできます。

ゲストOSにはMACで指令、はこれからの時代の新常識ですね(嘘)。DHCP立てて管理するのが面倒なのが本音です。