Linux bridge、Tapインタフェースとは

VMやコンテナ等、仮想化関連を度々扱っています。仮想ネットワーク周りでtapインタフェースの概念を確認していたのですが、以前にも同じことを調べたのを忘れていたので、備忘録として改めて整理しておきます。

基本的に以下Blog記事の簡単な訳となります。
[Linux Bridge and Virtual Networking | http://www.innervoice.in/blogs/2013/12/02/linux-bridge-virtual-networking/]
[Tap Interfaces and Linux Bridge | http://www.innervoice.in/blogs/2013/12/08/tap-interfaces-linux-bridge/]

Linux bridge

ブリッジと呼ばれているが、正確には仮想スイッチであり、2.2カーネル以降でカーネルモジュールとして提供され、brctlコマンドによって管理される。

物理ネットワークと仮想ネットワーク

ネットワーク上に流れるデータトラフィックは、物理マシン上の物理イーサネットポートによって処理される。それは仮想マシンでも同様であり、トラフィックは仮想イーサネットポートによって処理される必要がある。仮想化の目的は物理エンティティをソフトウェアでエミュレートすることであり、"仮想マシンの仮想イーサネットポートが仮想スイッチへ接続される"状態を構築することをサポートしなければならない。

スイッチポート

Linux bridgeはLinuxカーネルに組み込まれたスイッチであり、物理スイッチと同様に入出力されるトラフィックを運ぶポートやインタフェースが必要となる。Linux bridgeは物理ポートと仮想ポートのどちらもサポートしていて、ブリッジに追加することができる。仮想ポートはソフトウェアエンティティであり、イーサネットフレームをその先の処理のために仮想スイッチへ転送するために利用される。イーサネットトラフィックでは、このLinux仮想ポートをtapインタフェースと呼ぶ。tapインタフェースによるアプローチによって、Linux bridgeは仮想世界から物理世界へパケットを転送することが可能となる。

tapインタフェースはなぜ必要か

物理マシンの場合と同様、仮想マシンのネットワークポートはイーサネットフレームのみを処理できる。非仮想化環境では、物理ネットワークインタフェースはイーサネットフレームを受信し、処理する。それは受信したフレームからイーサネット関連のヘッダを取り除き、ペイロード(IPパケット)を先のOSへ向けて転送することである。しかし仮想化環境では、仮想ネットワークインタフェースはイーサネットフレームを期待しているために、物理ネットワークインタフェースで処理されたペイロードを受け渡されても正しく動作しない。tapインタフェースは特別なソフトウェアエンティティであり、Linux bridgeにイーサネットフレームをそのまま転送するように指示をする。つまり、tapインタフェースに接続された仮想マシンは生のイーサネットフレームを受信できるようになる。それによって、仮想マシンはネットワークの視点からは物理マシンであるかのように動作することが可能となる。

仮想RJ45ケーブルも同様に存在するのか

簡単に言うと無いが、仮想マシン仮想マシンイーサネットポートをLinux bridgeのtapインタフェースへ接続する必要はある。この接続はプログラム的に行われ、libvirtのようなアプリケーションがtapインタフェースの利用するファイルディスクリプタを作成する。Linux bridgeがイーサネットフレームをtapインタフェースへ送信するとき、正確にはファイルディスクリプタへバイトを送信している。QEMUのようなエミュレータでは、このファイルディスクリプタからバイトを読み込み、仮想マシンの仮想ネットワークインタフェースを通して内部のゲストOSへ渡している。