====== 仮想化に関係する Linux のネットワーク関連機能 ======
メモです.そのうちブログのネタに.
===== veth =====
* Virtual Ethernet Device.元々 OpenVZ/Virtuozzo の機能.
* 仮想的なネットワーク I/F のペアを作成し,その間を通信する.
{{:linux:kernel:network:veth.png?300|}}
==== 軽く実験 ====
- 作成 # ip link add type veth
- 確認 # ip link ls veth0
11: veth0: 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: mtu 1500 qdisc noop state DOWN qlen 1000
link/ether aa:bf:82:77:71:48 brd ff:ff:ff:ff:ff:ff
- アドレスを振る # 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: 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: 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
- (続く)
==== 参考 ====
* http://d.hatena.ne.jp/defiant/20100630
* http://d.hatena.ne.jp/defiant/20100702
* http://chamaken.blogspot.jp/2009/06/veth-ping.html
* http://diary.atzm.org/20120416.html
* http://wiki.openvz.org/Veth
* http://d.hatena.ne.jp/enakai00/20110529/1306658627
===== TAP=====
* レイヤ 2 トンネリング
* ユーザ空間のアプリケーションから送信したイーサフレームは OS から見ると外部から TAP デバイスにイーサフレームが到達したように見える
* 外部から受信したイーサフレームは OS のネットワークスタックを通って TAP デバイスに送られ,ユーザ空間のアプリケーションで受信する.
==== 参考 ====
* http://gihyo.jp/admin/serial/01/ibm_kvm/0003
* man にないけどこんなのがあるみたいなので要調査 ip tuntap help
===== macvlan =====
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: 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: 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: 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: 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 を付与したインターフェースの間の通信はできません.
===== macvtap =====
==== Tap ====
こんな感じで使うのかな.
* Linux (kernel) がプロセスと通信を行う.
* プログラムから仮想的なネットワークインターフェースを作成
* 作成したインターフェースをブリッジに接続
* プログラムからはファイルディスクリプタ経由で読み書き
==== Macvtap ====