Ubuntu Weekly Recipe

第535回 LXD 3.0のネットワーク設定

この記事を読むのに必要な時間:およそ 7 分

ネットワークインターフェースを追加する

コンテナに複数のネットワークインターフェースを持たせたいことがあるでしょう。LXD 3.0では次の種類(nictype)のネットワークデバイスを追加可能です。

  • physical:ホスト上の物理デバイスをそのままコンテナの中に見せる方式です。指定したデバイスはホスト上からは見えなくなります。性能的な要件から物理NICを特定のコンテナのみで使用したい場合に便利です。
  • bridged:ホスト上の仮想ブリッジに紐付いた仮想ネットワークデバイスを作成する方式です。コンテナに最初から存在するeth0はこの方式を使っています。
  • macvlan:既存のデバイスに対して異なるMACアドレスを割り当てた仮想ネットワークデバイスを作成する方式です。第533回のようにコンテナをホストの外からも見えるようにしたい場合に便利ですが,ホストとコンテナでの通信はできなくなります。
  • p2p:vethペアを作成し片方をコンテナに割り当てる方式です。bridgedと異なり,特定のインターフェースへの紐付けは必須ではありません。より柔軟に複雑なネットワーク環境を構築したい場合に使うようです。
  • sriov:ホスト上の物理デバイスの仮想機能(Virtual Function)をコンテナに専有させる方式です。物理デバイスがSR-IOVに対応している必要があります。

LXDではネットワークインターフェースを次のように追加します。

$ lxc config device add コンテナ名 設定名 nic nictype=種別 オプション

設定名は追加するデバイス設定を一意に決める値です。nicを含む他のデバイス設定と被らない値を指定する必要があります。設定名がそのままコンテナ内部のネットワークインタフェースデバイスの名前になるため,用途にあわせたわかりやすい名前を付けるといいでしょう。もし設定名とデバイス名を一致させたくない場合はオプションにname=デバイス名を指定してください。

オプションはkey=valueの形で指定します。nictypeによって,指定できるオプションが異なるので注意してください。設定可能なkeyと初期値などはLXDのドキュメントに一覧があります

「とりあえずインターフェースを追加したい」ならbridgedかmacvlanを使うことになるでしょう。このうちlxdbr0に対するbridgedはlxc networkコマンドを使います。その手順は後述の「ブリッジインターフェースで固定IPアドレスを設定する」で紹介することにして,ここではmacvlanインターフェースを追加してみましょう。

たとえば「container」コンテナにmacvlanタイプのeth1を追加したい場合は,次のように設定します。

$ lxc config device add container eth1 nic nictype=macvlan parent=enp0s31f6
デバイス eth1 が container に追加されました

ここでparent=に指定しているのは,実際にフレームを送受信するホスト上のネットワークインターフェースです。macvlanではこのインターフェースのサブインターフェースとしてデバイスを作成します※3)⁠nictype=bridgedとして作成するならブリッジインターフェースを指定します。

※3
サブインターフェースと親のインターフェースはMACアドレスが異なります。このためカーネルは物理NIC自身のMACアドレス宛以外のフレームも受け付けるように設定されます。ちなみにVMWareやVirtualBoxといった仮想マシンの管理システムによっては,インスタンスのMACアドレス宛以外のフレームを落とすことがあります。仮想マシン上のLXD環境でmacvlanを使用する場合は,仮想マシンマネージャーの設定にも注意してください。

実際にコンテナの中でip addrを実行するとeth1が作成されていることがわかります。

$ lxc exec container ip addr show eth1
16: eth1@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:16:3e:22:10:68 brd ff:ff:ff:ff:ff:ff link-netnsid 0

enp0s31f6が親デバイスではあるものの,MACアドレスは異なります。このため,たとえばdhclientコマンドを使えば,親デバイスとは異なるIPアドレスが割り振られます。

$ lxc exec container dhclient eth1

ためしにeth1あてに外部からアクセスしつつ,enp0s31f6に対してパケットキャプチャしてみれば,eth1宛のフレームがMACアドレスが異なるはずのenp0s31f6を経由していることがわかるでしょう。うまくアドレスが割り当たっているようであれば,第533回のように起動時にeth1に対してDHCPでアドレスを取得するよう,netplanの設定ファイルを変更しておきましょう。

ちなみにLXDで設定したmacvlanのモードは「bridge」になります。よって特に設定しなくても同じホスト上の同じ物理インターフェースを親に持つコンテナ同士なら通信できるのです。

$ lxc exec container -- ip -d link show eth1
16: eth1@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:16:3e:22:10:68 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 0
    macvlan mode bridge addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

MACアドレスには「00:16:3e」で始まるランダムなアドレスが割り当てられます※4)⁠hwaddr=FOOと設定することで,任意のMACアドレスを設定することも可能です。

※4
「00:16:3e」はCitrixに買収されたXenSourceのOUIです。LXDは意図的にこのOUIを使っているようです

もし追加したインターフェースを削除したい場合は,次のように実行します。

$ lxc config device remove container eth1
デバイス eth1 が container から削除されました

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入