NetBSD/xen HowToを始めとして、多くのNetBSD/xen環境構築の説明では実際のNICを使用したBridge接続環境を前提としているようだ。だからといって、いわゆるbridge接続しかできないわけではない。ここでは、Xen稼働サーバ以外の外部サーバに頼らずに稼働できるように、内部のみで完結したネットワーク構造を構築する手順について試した結果を示す。
また、適切な構成を行うことで構築した内部ネットワークをnatを介して外部に接続することも可能とする。
なお、ここに記載することはほとんどがNetBSDの標準機能を利用した結果に過ぎず、特に新しい利用方法というわけではない。何を今更と思われるかもしれないが個人的なメモなので勘弁していただきたい。
ここでは以下の様な構成を前提とする。
HyperVisor | Xen 3.3.0 64bit (pkgsrcよりcompile) |
---|---|
Domain-0 | NetBSD/amd64 5.99.5 (2008/12のcurrent) |
Domain-U | 何でも。NetBSD/amd64,i386,OpenSolaris,Windows他 |
ここではDomain-0としてcurrentのNetBSD/amd64を使用しているが、5.0系列でもよいし、Domain-Uに制限が増えるがNetBSD/i386の32bit+32bit Xenカーネルでも同じ(当然その場合NetBSD 4.0系列でもよい)はず。ただし確認は上記の環境。
ちなみに物理的なHardwareとしては Core2 DUO/3GB memの Lenovo Thinkpad X61を用いている。
物理的であろうが仮想化した論理的であろうが、ネットワークを構築する場合その構成を最初に明確にしておかないと後でスパゲッティになるだけ。ここでは以下の図に示すような単純なネットワーク構成を作成することとする。
論理的なネットワーク図 +-実マシン内------------------------------+ | 172.20.1/24 | | + Domain-0 ---+ | +Domain-U 1-+ | | | | | |-------+ | | | | | +----|xennet0| | | | | | | |-------+ | | | | | | +-----------+ | | | +-------|1 | +Domain-U 2-+ | | | |擬似NIC|----+ |-------+ | | | | |(tap0) | +----|xennet0| | | | | +-------| | |-------+ | | | | | | | +-----------+ | | | DHCP | | | | | サーバ | | : | | | | : : | | | | : | | | | | +Domain-U n-+ | | | | | |-------+ | | | | | +----|xennet0| | | | | | | |-------+ | | | +-------------+ | +-----------+ | | | +-----------------------------------------+ (ちょっと落ち着いてからも少しマシな絵にします)
内部には各Domain-Uのxennetと、Domain-0の内部NIC(擬似Ethernetのtap0)のみが参加する論理的なネットワークを構築する。このネットワークアドレスは便宜上プライベートアドレスの172.20.1.0/24を割り当てる。Domain-0は常に稼働するため、固定でIPアドレス172.20.1.1とする。Domain-0では内部向けに対してのみ、dhcpサーバを提供する。各Domain-Uはこのdhcpサーバから該当ネットワークアドレスの割り当てを受ける。
もちろん実際に割り当てるアドレスは外部NICのアドレスを考慮して別の値で構わない。
実際には各Domain-Uが持つそれぞれのxennetに対しpeerとなるxvifX.XがDomain-0側で生成されるので、そのxvifとtap0を同じbridgeに納めることによって一つの閉じたネットワークを構築する。
Xenでは各Domain-Uの実デバイスはDomain-0で集約して管理することになる。ネットワークに関して標準の設定手順ではNetBSD標準のbridge(4)擬似デバイスを用いて実デバイスを含めてまとめていた。これにより外部のホスト及びDomain-0およびDomain-U間の通信を可能としている。
ローカルネットワークの場合、Domain-0とDomain-Uは通信したいが、外部ホストとは一切通信したくない状態。つまり、bridge(4)に実NICを加えず、代わりに擬似Ethernetであるtap0を追加することにより実現するに過ぎない。
あとはNetBSDの標準的な手法でいくらでも好きなように設定すればいいだけであるが、せっかくだから手順も書き留めておく。
よくあるbridge設定と同じように、bridge0を作成する。
# ifconfig bridge0 create up
起動時から有効にするには /etc/ifconfig.brdige0の内容を以下のようにする。
create up
つまり、bridge0を作成するのみで、物理nicをbrconfig addしない。
起動時にこれでbridge0が作成かつ有効になるので、次にDomain-0と内部ネットワークを接続するために仮想Ethernetデバイスであるtap(4)を作成し、このNICをbridgeに追加する。
# ifconfig tap0 create inet 172.20.1.1 netmask 255.255.255.0 up # brconfig bridge0 add tap0
起動時から有効にするためには、/etc/ifconfig.tap0を作成して以下のようにする。
create inet 172.20.1.1 netmask 255.255.255.0 up !brconfig bridge0 add tap0
起動時には、どうやらifconfig -Cで出力される順に処理されるようなので、ifconfig.bridge0でtap0をaddしようとするとまだtap0が生成されていなくて失敗するため注意。より正しい方法はたぶんここでbrconfigを書かず、ネットワーク起動が完了したのちにbrconfigを実行するように適切な依存関係を設定したrcスクリプトを作成するべきだと思うけど、とりあえずこれで済ませておく。
Domain-Uに対してdhcpでのアドレス割り振りを提供するため、tap0に対してのみdhcpdを起動する。まず適当に/etc/dhcpd.confを作る。
# option domain-name "ネットワークドメイン名" option domain-name-servers "172.20.1.1" default-lease-time 600; max-lease-time 7200; ddns-update-style none; subnet 172.20.1.0 netmask 255.255.255.0 { range 172.20.1.128 172.20.1.254 ; option routers 172.20.1.1; }
Domain-0をDNSサーバを動かしておく場合domain-name-serversで教えたり、option routersはまぁnatする場合とか用。あとは好きなように追加変更。固定IPで内部を作るのであればDHCPサーバはいらない。
dhcpサーバを起動するために/etc/rc.confに以下を追加。
dhcpd=YES dhcpd_flags="tap0"
dhcpサーバを起動。
# /etc/rc.d/dhcpd start
Domain-0で設定が完了していればDomain-Uは単に起動するだけでよい。 xen設定ファイル内にて上記のbridge0に接続するように
vif = [ 'mac=XX:XX:XX:XX:XX:XX, bridge=bridge0' ]
と指定してあるDomain-Uは自動的に172.20.1.0/24のネットワークに参加し、DHCPでアドレスを得ることができる。これはDomain-Uにhvmを使った場合にも有効。
この応用として、実NICと仮想NICであるtap0との間でNAT変換することで半透過的な接続ができるようになる。
接続は一般的なNATと同じで、ipnatを使うかpfのnat機能を使えばよい。実際に通信するNICと内部ネットワークアドレスの間で制御することになる。
なお、単なるbridgeの場合無線NICだと外部にでることができない(無線LANでは通常PROMISCUOUSモードは使用不可能のため)Domain-UがNAT変換により単一のMacアドレスとなるので外部に接続することが可能になる。限られた場面だけだがちょっとだけ便利かもしれない。
ここまでbridge0を前提に進めてきたが、例えば、
のように複数用意し、それぞれ向けにDomain-0でネットワーク管理、必要なサーバ(dhcpやDNSなど)を設定し動作させておけば、Domain-Uの使い道に応じてbridgeを選択することができるようになるだろう。他にも複数のxennnetをゲストに見せることもできるはずなので応用は色々できると思う。