linux:kernel:network:仮想化に関係する_linux_のネットワーク関連機能

仮想化に関係する Linux のネットワーク関連機能

メモです.そのうちブログのネタに.

  • Virtual Ethernet Device.元々 OpenVZ/Virtuozzo の機能.
  • 仮想的なネットワーク I/F のペアを作成し,その間を通信する.

  1. 作成
    # ip link add type veth
  2. 確認
    # ip link ls veth0
    11: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether 52:97:55:24:e0:e3 brd ff:ff:ff:ff:ff:ff
    # ip link ls veth1
    12: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether aa:bf:82:77:71:48 brd ff:ff:ff:ff:ff:ff
  3. アドレスを振る
    # ip link set veth0 up
    # ip link set veth1 up
    # ip addr add 10.100.0.1/24 dev veth0
    # ip addr add 10.100.0.2/24 dev veth0
    # ip addr show
      : (snip)
    11: veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 52:97:55:24:e0:e3 brd ff:ff:ff:ff:ff:ff
        inet 10.100.0.1/24 scope global veth0
        inet 10.100.0.2/24 scope global secondary veth0
        inet6 fe80::5097:55ff:fe24:e0e3/64 scope link 
           valid_lft forever preferred_lft forever
    12: veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether aa:bf:82:77:71:48 brd ff:ff:ff:ff:ff:ff
        inet6 fe80::a8bf:82ff:fe77:7148/64 scope link 
           valid_lft forever preferred_lft forever
  4. (続く)
  • レイヤ 2 トンネリング
  • ユーザ空間のアプリケーションから送信したイーサフレームは OS から見ると外部から TAP デバイスにイーサフレームが到達したように見える
  • 外部から受信したイーサフレームは OS のネットワークスタックを通って TAP デバイスに送られ,ユーザ空間のアプリケーションで受信する.

ipalias を使えば,1 つのインターフェースに複数のアドレスを振ることは可能ですが,元のインターフェースと MAC Address は同じなので,例えば DHCP でもう 1 個アドレスを,ということは出来ません.そこで macvlan ですよ (という用途ではないと思うけど :p )

root@precise:~# ip link add dev macvlan0 link eth0 type macvlan mode bridge
root@precise:~# ip link show

  : (snip)

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:f3:28:a0 brd ff:ff:ff:ff:ff:ff

  : (snip)

4: macvlan0@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN 
    link/ether 66:83:ba:90:95:39 brd ff:ff:ff:ff:ff:ff

別の MAC Address が付与されています.

root@precise:~# dhclient macvlan0
root@precise:~# ip addr show

    : (snip)

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:f3:28:a0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.14/24 brd 192.168.122.255 scope global eth0
    inet6 fe80::5054:ff:fef3:28a0/64 scope link 
       valid_lft forever preferred_lft forever
 
    : (snip)

4: macvlan0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether 66:83:ba:90:95:39 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.152/24 brd 192.168.122.255 scope global macvlan0
    inet6 fe80::6483:baff:fe90:9539/64 scope link 
       valid_lft forever preferred_lft forever

当然別のアドレスを振ることが可能です.

root@precise:~# ping -I macvlan0 192.168.122.14
PING 192.168.122.14 (192.168.122.14) from 192.168.122.152 macvlan0: 56(84) bytes of data.
From 192.168.122.152 icmp_seq=1 Destination Host Unreachable
From 192.168.122.152 icmp_seq=2 Destination Host Unreachable
From 192.168.122.152 icmp_seq=3 Destination Host Unreachable
^C
--- 192.168.122.14 ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4009ms
pipe 3
root@precise:~# ping -I eth0 192.168.122.152
PING 192.168.122.152 (192.168.122.152) from 192.168.122.14 eth0: 56(84) bytes of data.
From 192.168.122.14 icmp_seq=1 Destination Host Unreachable
From 192.168.122.14 icmp_seq=2 Destination Host Unreachable
From 192.168.122.14 icmp_seq=3 Destination Host Unreachable
^C
--- 192.168.122.152 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 3016ms

macvlan インターフェースと,macvlan を付与したインターフェースの間の通信はできません.

こんな感じで使うのかな.

  • Linux (kernel) がプロセスと通信を行う.
  • プログラムから仮想的なネットワークインターフェースを作成
  • 作成したインターフェースをブリッジに接続
  • プログラムからはファイルディスクリプタ経由で読み書き
  • linux/kernel/network/仮想化に関係する_linux_のネットワーク関連機能.txt
  • 最終更新: 2013/09/27 16:42
  • by tenforward