macvlanを使ってみる

$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:1d:7d:06:fd:97  
          inet addr:163.215.189.111  Bcast:163.215.189.127  Mask:255.255.255.192
          inet6 addr: fe80::21d:7dff:fe06:fd97/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1225 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1285 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:551246 (551.2 KB)  TX bytes:232794 (232.7 KB)
          Interrupt:42 Base address:0xa000 

ここに、こんなeth0があったとします。

$ sudo ifconfig eth0:0 10.0.0.3 up
$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:1d:7d:06:fd:97  
          inet addr:163.215.189.111  Bcast:163.215.189.127  Mask:255.255.255.192
          inet6 addr: fe80::21d:7dff:fe06:fd97/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1358 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1419 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:573562 (573.5 KB)  TX bytes:243999 (243.9 KB)
          Interrupt:42 Base address:0xa000 
$ ifconfig eth0:0
eth0:0    Link encap:Ethernet  HWaddr 00:1d:7d:06:fd:97  
          inet addr:10.0.0.3  Bcast:10.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          Interrupt:42 Base address:0xa000 

こんな感じにサブインタフェースを作って2個目のIPを振る事は出来ますが、これだとIPは違うけどMACアドレスは同じです。
ここでdhclientをeth0:0に対して走らせても同じMACアドレスじゃ新しいIPはもらえないでしょう。

一方、macvlanを使うと…

$ sudo ip link add dev macvlan0 link eth0 type macvlan
$ sudo ifconfig macvlan0 up
macvlan0  Link encap:Ethernet  HWaddr fe:7b:40:b0:fc:f8  
          inet6 addr: fe80::fc7b:40ff:feb0:fcf8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1780 (1.7 KB)  TX bytes:6383 (6.3 KB)

あら不思議、新しいMACアドレスの付いたインタフェースが作れちゃいました。

$ dmesg|tail -n1
[  316.021862] device eth0 entered promiscuous mode

eth0をpromiscuousモードに切り替える事で、「fe:7b:40:b0:fc:f8」宛のパケットを受け取っているようです。

$ sudo dhclient macvlan0
$ sudo ifconfig macvlan0
macvlan0  Link encap:Ethernet  HWaddr e6:52:55:96:f1:e7  
          inet addr:163.215.189.112  Bcast:163.215.189.127  Mask:255.255.255.192
          inet6 addr: fe80::e452:55ff:fe96:f1e7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:708 (708.0 B)  TX bytes:4026 (4.0 KB)

今度はMACアドレスが異なるので新しいIPをDHCPサーバからもらうことも出来ちゃいますね。
この機能、普通にLinux上で生きていても何の用途も無さそうですが、LXCで使われているようですし、後付で実装されたmacvtapを使えばKVMQEMUからも使えます。