KVMでブリッジネットワークを構築する方法【初心者向け完全ガイド】
これまでの連載で、KVMの基礎知識はかなり身についていることと思います。基本的な入門編、中級者向けのセットアップと使い方、ネットワークとストレージの設定、そしてVirtualBoxとの共存設定など、いくつものチュートリアルを扱ってきました。次の論理的なステップは「ブリッジネットワーキング」です。これを習得すれば、仮想マシンに外部から利用可能なIPアドレスを割り当てられるようになり、ポートフォワーディングなども自由に行えるようになります。
今回ご紹介する内容は、世の中の多くのチュートリアルとは少し異なります。他の記事でよく見かける「力技」的なアプローチをあえて回避し、仮想マシンを外部ネットワークに公開するための2つの方法をお見せします。そのうちの1つは一種の「ハック」ですが、これが実に巧妙なのです。おそらくどこでも見たことのない手法でしょう。最後に、制限事項や起こりうる問題点についても触れていきます。
※画像はWikipediaより引用(CC BY-SA 3.0ライセンス)。インデックス用ティーザー画像も同条件です。
事前準備:現状の整理
まずは現実的な視点から始めましょう。ブリッジネットワーキングはやや扱いが難しく、Linuxのコマンドライン操作に対する一定の理解が必要です。しかし、場合によってはブリッジングが不可欠になることもあります。例えば、仮想マシン内で何らかのサーバーを運用したい場合、外部IPアドレスを割り当てて、他のホストから直接通信できるようにしたいはずです。
具体例を挙げます。ルーターが10.0.0.Xの範囲でアドレスを配布している環境を考えてみましょう。物理ホストは10.0.0.4を使用していますが、仮想マシンは192.168.2.133で動作しています。パケットの送受信に関するシステムの解釈を変更しない限り、10.0.0ネットワーク上のクライアントと192.168.2ネットワーク上のクライアントは互いに通信できません。
この問題はブリッジングによって解決できます。ブリッジを構成することで、仮想マシンをルーターに直接接続し、外部IPアドレスを取得できるようになります。ここでいう「外部」とは、物理ホストが使用しているネットワーク範囲のことであり、必ずしもグローバルIPを意味するわけではありません。
デフォルトでは、KVMは独自のブリッジとして192.168.122.1を作成します。このデバイスは仮想マシンにとっての仮想ルーターとして機能し、この範囲のIPアドレスを配布します。しかしここで目指すのは、仮想マシンに外部のアドレスをリースさせることです。本チュートリアルでは192.168.2の範囲を使用します。
2つの代替ソリューション
目標を達成するには、大きく分けて2つの方法があります。
方法1:ブリッジを明示的に作成する
物理デバイスeth1と、vnet0という仮想デバイスの2つをブリッジで接続します。ブリッジが正しく動作することを確認した後、その設定をディスク上のネットワーク設定ファイルに永続化します。仮想マシンはルーターから直接IPアドレスをリースすることになります。これはVirtualBoxで行った手順と似ています。本記事で詳しく解説するのはこちらの方法です。
方法2:アダプターのネイティブ対応を利用する
こちらは動作保証はありませんが、うまくいく可能性があります。ネットワークアダプターが最初からブリッジングに対応していれば、そのまま利用できるかもしれません。必要な作業は、KVMの仮想ブリッジに小さなサブネットを割り当てることだけです。ただし、物理ホストが使用しているアドレスと重複しないよう注意してください。
制限事項と注意点
失敗の要因は数多く存在します。ルーターがブリッジングに対応していない可能性、ネットワークインターフェースが対応していない可能性、リース可能なIPアドレスの枯渇、ファイアウォールによる干渉などが挙げられます。さらにUbuntu特有の問題として、NetworkManagerがブリッジインターフェースを管理している場合、競合や不具合が発生することがあります。
さらに詳しく学びたい方は、以下の公式ドキュメントを参照してください。
- Linux Foundation:Bridge setup on Linux
- Ubuntuコミュニティドキュメント:KVM Networking
さて、これから何をするのか把握できましたね。ブリッジングは決して簡単な作業ではありません。考慮すべき点がいくつもあります。第一に、そもそもあなたのネットワークアダプターはブリッジングに対応していますか? 例えば一部のノートPCでは、無線アダプターがこの動作モードをサポートしていないことがあります。第二に、ネットワーク設定を自分でいじることに抵抗はありませんか? 第三に、そもそも何を実現したいのでしょうか? NATで十分というケースもあるかもしれません。
ネットワークの基本概念
筆者のテスト環境はUbuntuですが、本チュートリアルはできるだけディストリビューションに依存しない形で書きたいと思います。UbuntuのKVMコミュニティドキュメントは優秀ですが、Debian系システムでしか通用しません。そこで少し脱線して、RedHat系およびSUSE系にも共通するネットワークの概念を紹介します。
UbuntuなどのDebian系システムでは、永続的なネットワーク設定は/etc/network/interfacesに保存されます。一方、RedHat系およびSUSE系では、/etc/sysconfig/network以下に個別のファイルとして格納され、通常ifcfg-ethXまたはifcfg-eth-MACアドレス形式のプレフィックスが付きます。「eth」の部分は、ifconfigコマンドで確認した実際のインターフェース名に置き換えてください。
また、brctlユーティリティを使えばコマンドラインから直接ブリッジを作成できます。この場合、設定ファイルへの変更は不要ですが、ネットワークサービスを再起動するたびに設定は失われます。実はこれこそが、システムファイルを編集する前にまずテストを行うための推奨手段なのです。作業前には必ず設定のバックアップを取ることを忘れないでください。ネットワーク設定の詳細については、筆者のLinuxコマンド記事も参考にしてください。
ブリッジの作成
それでは実践に入りましょう。まずはbrctl、ifconfig、dhclientコマンドの組み合わせから始めるのがおすすめです。各コマンドの詳細な使い方については割愛しますが、需要があれば別途チュートリアルを用意します。一般的な手順は以下の通りです(sudoまたはroot権限で実行)。ここではbr0というブリッジ、物理・仮想デバイスとしてeth0/1、そしてスイッチまたはルーターからのDHCPリースを想定しています。
ifconfig eth1 0.0.0.0
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1
dhclient br0
注意点として、仮想アダプターは仮想マシンを作成・起動するまで存在しない場合があります。したがって、今の時点で仮想アダプターを追加する必要はありません。詳細オプションでブリッジネットワーキングを選択すれば、KVMが自動的に処理してくれます。
ブリッジインターフェースがDHCPサーバーから外部アドレスを取得できていれば、正しい方向に進んでいます。家庭環境ではDHCPサーバーはルーターそのものです。ただし、ISPから直接インターネット接続を受けている場合は、ユーザーごとに1つのIPアドレスしか許可されないこともあるため、この方法が使えない可能性があります。
ブリッジインターフェースが起動したら、ネットワーク機能が従来どおり動作していることを確認してください。/etc/resolv.confの編集や、ルーティングテーブルの修正が必要になる場合があります。
うまくいったら、設定をネットワーク設定ファイルに永続化しましょう。筆者の例は汎用的なもので、コミュニティドキュメントに示されているものとほぼ同じです。なお、複数ホップや環状経路を正しく処理するために、ブリッジでスパニングツリープロトコル(STP)を有効化する必要がある場合もあります。
今回のケースでは具体的に、/etc/network/interfacesを編集してbr0を追加します。STPが必要な場合は、bridge_stp off を bridge_stp on に変更してください。ブリッジの状態は btctl show コマンドで確認できます。

おまけにSTPの様子もどうぞ。ちょっと際どい響きがありますね。

仮想マシンの作成
仮想マシンの作成方法自体は以前の記事で学んだ通りなので、新しい話ではありません。最終段階の「詳細オプション」でネットワークアドレスの割り当て方式を変更し、仮想アダプターに他と重複しない一意のMACアドレスが設定されていることを確認してください。


運が良ければ、特別なブリッジ設定すら不要かもしれません。ネットワークアダプターが最初から対応していれば、それで完了です! しかし残念ながら、そう上手くはいかないことが多いでしょう。キーボードを叩く地道な作業がある程度発生すると覚悟しておいてください。
すべてが正しく動作しているかの確認:

pingが通れば、ハックも可能です。VirtualBoxで行った手順とほぼ同一ですね。これでサービスの公開、データ共有など、やりたいことが自由にできるようになりました。楽しんでください。
代替セットアップ(動かないかもしれないが、実に巧妙)
必ずしも幸運に恵まれるとは限りません。NetworkManagerが協力してくれなかったり、セットアップに山ほど問題があったりするかもしれません。そんなときは、独立した仮想ネットワークアダプターを作成し、最初からブリッジングに対応していそうな物理デバイスへルーティングする方法を試してみてください。IPアドレスの競合には十分注意しましょう。
さらに、これがうまくいったなら、非常に「ダーティ」なハックに挑戦できます。物理ネットワークと同じ/24空間を共有する仮想ネットワークを作成するのです。例えば、ルーターが192.168.2.0ネットワーク上にあるなら、192.168.2.160から始まる仮想ネットワークを作り、全体で16アドレス程度のごく狭い範囲だけを割り当てます。そして、ルーターが決してその範囲のアドレスを他のクライアントに配布しないようにしてください。
具体例を挙げます。筆者は192.168.2.160/28というネットワークを作成しました。ルーターがこの範囲のアドレスをリースすることはまずありませんが、念のためDHCPの割り当ても制限しておきます。そして、この仮想ネットワークを物理デバイス――今回は無線アダプターeth1――へルーティングします。
あとは仮想マシンを作成し、先ほどと同じようにeth1へルーティングするだけです。オンラインになった瞬間、美しい連携が生まれます。ホストは.102、仮想NIC virbr1は.161、そして仮想マシンは.168のアドレスを取得しました。
さらに、同じネットワーク上にあるWindows 7の物理マシン(.103)から、Ubuntu Lucidマシン上の仮想アダプター(.161)へpingを打った結果をご覧ください。両方とも無線接続で、同じルーター経由です。このセットアップがいかに賢く美しいかがわかるでしょう。常に動作するとは限りませんが、動いたときはまさに天才的です。
既存の仮想マシンへの適用
すでに存在する仮想マシンの場合も、/etc/libvirt/ 配下の設定を編集することで対応できます。各仮想マシンには個別の.xml設定ファイルがあり、変更を反映するには仮想マシンの再起動(電源オフ→オン)が必要です。記述例は以下の通りです。
<mac address='00:11:22:33:44:55'/>
<source bridge='br0'/>
</interface>
まとめ
KVMのブリッジネットワーキング設定は、正直あまり直感的ではありません。2〜3年前のVirtualBoxと同じくらい、親しみやすさに欠けています。しかし管理不能というわけではなく、本当のボトルネックはむしろネットワークトポロジへの理解度とその機能性にあると言えるでしょう。時間とともに改善されていくはずです。
幸運ならば、ネットワークアダプターが最初からブリッジングに対応しているかもしれません。そうでなければ、ブリッジアダプターを作成し、物理デバイスと仮想デバイスを割り当てる必要があります。その後、DNS、DHCP、ルーティングに関する潜在的な問題を解消します。最終手段として、ネットワーク範囲を「悪用」してサブネットの中にサブネットを作るというダーティなハックも選択肢です。IPアドレスが絶対に重複しないよう注意しながら、仮想アダプターを物理デバイスへルーティングしてください。
本チュートリアルは比較的基本的な内容にひとひねり加えたものですが、まだ網羅できていない課題も数多くあるでしょう。質問、提案、あるいはKVMでの難しいネットワーク構成に関するヒントが必要でしたら、メールでお気軽にお寄せください。新たな問題に対応した続編のハウツー記事を作成するかもしれません。
それでは、また。
-
KVMのストレージ管理を徹底解説!ストレージプールとボリュームの作成チュートリアル
さて、先日、Kernel-based Virtual Machine(KVM)という技術をご紹介しました。KVMは無料かつオープンソースの仮想化ソリューションで、VirtualBoxやVMware製品の代わりとして、あるいはそれらと併用して使うこともできます。前回は基本的な管理操作を扱いましたが、ストレージとネットワークについては別のチュートリアルに回すことにしました。 今回は、KVMにおけるストレージ管理について、より踏み込んだガイドをお届けします。内容はVirtualBoxで行ったものと似ており、仮想ディスクの追加・縮小・拡張などが含まれます。さらに、NFSストレージやNTFSフォーマット
-
VirtualBoxでディスクをクローンする方法【VBoxManage活用チュートリアル】
仮想化を業務でも趣味でも利用している方なら、VirtualBoxという強力かつ多用途な無料ソリューションを目にしたことがあるかもしれません。VirtualBoxは、デスクトップユーザーに対して、あらゆる形でOSを展開できる大きな柔軟性を提供してくれます。さらに、単なる趣味として仮想化を楽しんでいるだけでなく、仮想化を通じて新しいOSを学ぼうとする熱心なソフトウェア愛好家の方であれば、次のような場面に必ず直面することでしょう。それは「大量の仮想マシンを展開する必要がある」というシナリオです。一台ずつインストール作業を行う時間的な余裕はないはずです。実際、大規模に環境を展開する際に手動で一つずつマ