ネットワーク設定

LXDは以下のネットワークタイプをサポートします。

  • bridge: インスタンスを接続する L2 ブリッジを作成(ローカルの DHCP と DNS を提供可能)。これがデフォルトです。
  • macvlan: インスタンスを親の macvlan インターフェースに接続する際に使用するプリセットの設定を提供。
  • sriov: インスタンスを親の SR-IOV インターフェースに接続する際に使用するプリセットの設定を提供。
  • ovn: OVN SDN (software defined network) システムを使って論理的なネットワークを作成。

希望するタイプは以下のように --type 引数で指定できます。

lxc network create <name> --type=bridge [options...]

--type 引数が指定されない場合は、デフォルトの bridge が使用されます。

設定キーは現状では全てのネットワークタイプでサポートされている以下のネームスペースによって名前空間が分けられています。

  • maas (MAAS ネットワーク識別)
  • user (ユーザーのメタデータに対する自由形式の key/value)

ネットワーク: ブリッジ

LXD でのネットワークの設定タイプの 1 つとして、 LXD はネットワークブリッジの作成と管理をサポートしています。 LXD のブリッジは下層のネイティブな Linux のブリッジと Open vSwitch を利用できます。

LXD のブリッジの作成と管理は lxc network コマンドで行えます。 LXD で作成されたブリッジはデフォルトでは "managed" です。 というのは LXD はさらにローカルの dnsmasq DHCP サーバをセットアップし、希望すれば (これがデフォルトです) ブリッジに対して NAT も行います。

ブリッジが LXD に管理されているときは、 bridge ネームスペースを使って設定値を変更できます。

さらに、 LXD は既存の Linux ブリッジを利用することも出来ます。 この場合、ブリッジは lxc network で作成する必要はなく、インスタンスかプロファイルのデバイス設定で下記のように単に参照できます。

devices:
  eth0:
     name: eth0
     nictype: bridged
     parent: br0
     type: nic

ネットワークの設定プロパティー:

LXD のネットワークの設定項目の完全なリストは以下の通りです。

ブリッジネットワークでは以下の設定キーネームスペースが現状サポートされています。

  • bridge (L2 インタフェースの設定)
  • fan (Ubuntu FAN overlay に特有な設定)
  • tunnel (ホスト間のトンネリングの設定)
  • ipv4 (L3 IPv4 設定)
  • ipv6 (L3 IPv6 設定)
  • dns (DNS サーバと名前解決の設定)
  • raw (raw の設定のファイルの内容)

IP アドレスとサブネットは CIDR 形式 (1.1.1.1/24fd80:1234::1/64) で指定することを想定しています。

例外としてトンネルのローカルとリモートのアドレスは単なるアドレス (1.1.1.1fd80:1234::1) を指定します。

キー 条件 デフォルト 説明
bridge.driver string - native ブリッジのドライバ ("native" か "openvswitch")
bridge.external_interfaces string - - ブリッジに含める未設定のネットワークインタフェースのカンマ区切りリスト
bridge.hwaddr string - - ブリッジの MAC アドレス
bridge.mode string - standard ブリッジの稼働モード ("standard" か "fan")
bridge.mtu integer - 1500 ブリッジの MTU (tunnel か fan かでデフォルト値は変わります)
dns.domain string - lxd DHCP のクライアントに広告し DNS の名前解決に使用するドメイン
dns.mode string - managed DNS の登録モード ("none" は DNS レコード無し、 "managed" は LXD が静的レコードを生成、 "dynamic" はクライアントがレコードを生成)
dns.search string - - 完全なドメインサーチのカンマ区切りリスト(デフォルトは dns.domain の値)
fan.overlay_subnet string fan mode 240.0.0.0/8 FAN の overlay として使用するサブネット (CIDR 形式)
fan.type string fan mode vxlan FAN のトンネル・タイプ ("vxlan" か "ipip")
fan.underlay_subnet string fan mode デフォルトゲートウェイのサブネット FAN の underlay として使用するサブネット (CIDR 形式)
ipv4.address string standard mode ランダムな未使用のサブネット ブリッジの IPv4 アドレス (CIDR 形式)。 IPv4 をオフにするには "none" 、新しいアドレスを生成するには "auto" を指定。
ipv4.dhcp boolean ipv4 address true DHCP を使ってアドレスを割り当てるかどうか
ipv4.dhcp.expiry string ipv4 dhcp 1h DHCP リースの有効期限
ipv4.dhcp.gateway string ipv4 dhcp ipv4.address サブネットのゲートウェイのアドレス
ipv4.dhcp.ranges string ipv4 dhcp 全てのアドレス DHCP に使用する IPv4 の範囲 (開始-終了 形式) のカンマ区切りリスト
ipv4.firewall boolean ipv4 address true このネットワークに対するファイアウォールのフィルタリングルールを生成するかどうか
ipv4.nat.address string ipv4 address - ブリッジからの送信時に使うソースアドレス
ipv4.nat boolean ipv4 address false NAT にするかどうか (未設定の場合はデフォルト値は true になりランダムな ipv4.address が生成されます)
ipv4.nat.order string ipv4 address before 必要な NAT のルールを既存のルールの前に追加するか後に追加するか
ipv4.ovn.ranges string - none 子供の OVN ネットワークに使用する IPv4 アドレスの範囲(開始-終了 形式) のカンマ区切りリスト
ipv4.routes string ipv4 address - ブリッジへルーティングする追加の IPv4 CIDR サブネットのカンマ区切りリスト
ipv4.routing boolean ipv4 address true ブリッジの内外にトラフィックをルーティングするかどうか
ipv6.address string standard mode ランダムな未使用のサブネット ブリッジの IPv6 アドレス (CIDR 形式)。 IPv6 をオフにするには "none" 、新しいアドレスを生成するには "auto" を指定。
ipv6.dhcp boolean ipv6 address true DHCP 上で追加のネットワーク設定を提供するかどうか
ipv6.dhcp.expiry string ipv6 dhcp 1h DHCP リースの有効期限
ipv6.dhcp.ranges string ipv6 stateful dhcp 全てのアドレス DHCP に使用する IPv6 の範囲 (開始-終了 形式) のカンマ区切りリスト
ipv6.dhcp.stateful boolean ipv6 dhcp false DHCP を使ってアドレスを割り当てるかどうか
ipv6.firewall boolean ipv6 address true このネットワークに対するファイアウォールのフィルタリングルールを生成するかどうか
ipv6.nat.address string ipv6 address - ブリッジからの送信時に使うソースアドレス
ipv6.nat boolean ipv6 address false NAT にするかどうか (未設定の場合はデフォルト値は true になりランダムな ipv6.address が生成されます)
ipv6.nat.order string ipv6 address before 必要な NAT のルールを既存のルールの前に追加するか後に追加するか
ipv6.ovn.ranges string - none 子供の OVN ネットワークに使用する IPv6 アドレスの範囲(開始-終了 形式) のカンマ区切りリスト
ipv6.routes string ipv6 address - ブリッジへルーティングする追加の IPv4 CIDR サブネットのカンマ区切りリスト
ipv6.routing boolean ipv6 address true ブリッジの内外にトラフィックをルーティングするかどうか
maas.subnet.ipv4 string ipv4 address - インスタンスを登録する MAAS IPv4 サブネット (NIC で network プロパティを使う場合に有効)
maas.subnet.ipv6 string ipv6 address - インスタンスを登録する MAAS IPv6 サブネット (NIC で network プロパティを使う場合に有効)
raw.dnsmasq string - - 設定に追加する dnsmasq の設定ファイル
tunnel.NAME.group string vxlan 239.0.0.1 vxlan のマルチキャスト設定 (local と remote が未設定の場合に使われます)
tunnel.NAME.id integer vxlan 0 vxlan トンネルに使用するトンネル ID
tunnel.NAME.interface string vxlan - トンネルに使用するホスト・インタフェース
tunnel.NAME.local string gre or vxlan - トンネルに使用するローカルアドレス (マルチキャスト vxlan の場合は不要)
tunnel.NAME.port integer vxlan 0 vxlan トンネルに使用するポート
tunnel.NAME.protocol string standard mode - トンネリングのプロトコル ("vxlan" か "gre")
tunnel.NAME.remote string gre or vxlan - トンネルに使用するリモートアドレス (マルチキャスト vxlan の場合は不要)
tunnel.NAME.ttl integer vxlan 1 マルチキャストルーティングトポロジーに使用する固有の TTL

これらのキーは lxc コマンドで以下のように設定できます。

lxc network set <network> <key> <value>

systemd-resolved との統合

LXD が動いているシステムが DNS のルックアップに systemd-resolved を使用している場合、 LXD が名前解決できるドメインを systemd-resolved に指定することができます。 これには systemd-resolved にどのブリッジ、ネームサーバーのアドレス、そして DNS ドメインかを伝える必要があります。

例えば、 LXD が lxdbr0 インターフェースを使用している場合、 lxc network get lxdbr0 ipv4.address コマンドで IPv4 アドレス(IPv4 アドレスの代わりに IPv6 アドレスを使うこともできますし、 IPv4 アドレスと IPv6 アドレスの両方を使うこともできます)と lxc network get lxdbr0 dns.domain (ドメインが設定されていない場合は上記の表に示されているデフォルト値の lxd が使用されます)でドメインを取得します。 そして systemd-resolved に以下のように指定します。

systemd-resolve --interface lxdbr0 --set-domain '~lxd' --set-dns 1.2.3.4

上記の lxdbr0 は実際のブリッジの名前に、 1.2.3.4 はネームサーバーの実際の(サブネットマスクを除いた) アドレスに置き換えて実行してください。

さらに lxd はドメイン名に置き換えてください。 ドメイン名の前の ~ が重要ですので注意してください。 ~ はこのドメインだけをルックアップするためにこのネームサーバーを使うように systemd-resolved に指定します。 実際のドメイン名が何であるかにかかわらず ~ を前につけるべきです。 また、 ~ という文字はシェルが展開するかもしれないので、クォートに囲んでエスケープする必要があるかもしれません。

systemd のより新しいリリースでは systemd-resolve コマンドは deprecated になっていますが、(これを書いている時点では)後方互換性のためまだ提供されています。 systemd-resolved に伝えるための新しい方法は resolvectl コマンドを使うことです。 これは以下の 2 ステップで実行します。

resolvectl dns lxdbr0 1.2.3.4
resolvectl domain lxdbr0 '~lxd'

この systemd-resolved の設定はブリッジが存在する間のみ存続します。 ですので、リブートと LXD が再起動するたびにこのコマンドを繰り返し実行する必要があります。 また、これはブリッジの dns.modenone でないときにしか機能しないことに注意してください。

IPv6 プリフィクスサイズ

最適な動作には 64 のプリフィクスサイズが望ましいです。 より大きなサブネット( 64 より小さいプリフィクス)も正しく動作するでしょうが、SLAAC環境下では有用ではないことが多いでしょう。

IPv6 アドレスの割り当てにステートフル DHCPv6 を使用している場合は、より小さなサブネットも理論的には利用可能ですが、 dnsmasq にきちんとサポートされておらず問題が起きるかもしれません。 これらの 1 つをどうしても使わなければならない場合、静的割り当てか別のスタンドアロンの RA デーモンを使用可能です。

Firewalld で DHCP, DNS を許可する

firewalld を使用しているホストで LXD が実行する DHCP と DNS サーバーにインスタンスがアクセスできるようにするには、ホストのブリッジインターフェースを firewalld の trusted ゾーンに追加する必要があります。

(リブート後も設定が残るように)恒久的にこれを行うには以下のコマンドを実行してください。

firewall-cmd --zone=trusted --change-interface=<LXD network name> --permanent

例えばブリッジネットワークが lxdbr0 という名前の場合、以下のコマンドを実行します。

firewall-cmd --zone=trusted --change-interface=lxdbr0 --permanent

これにより LXD 自身のファイアーウォールのルールが有効になります。

Firewalld に LXD の iptables ルールを制御させるには

firewalld と LXD を一緒に使う場合、 iptables のルールがオーバーラップするかもしれません。例えば firewalld が LXD デーモンより後に起動すると firewalld が LXD の iptables ルールを削除し、 LXD コンテナーが外向きのインターネットアクセスが全くできなくなるかもしれません。 これを修正する 1 つの方法は LXD の iptables ルールを firewalld に移譲し、 LXD の iptables ルールは無効にすることです。

最初のステップは Firewalld で DHCP, DNS を許可する ことです。

次に LXD に iptables ルールを設定しないように(firewalld が設定するので)伝えます。

lxc network set lxdbr0 ipv4.nat false
lxc network set lxdbr0 ipv6.nat false
lxc network set lxdbr0 ipv6.firewall false
lxc network set lxdbr0 ipv4.firewall false

最後に firewalld のルールを LXD の利用ケースに応じて有効にします(この例では、ブリッジインターフェースが lxdbr0 で付与されている IP の範囲が 10.0.0.0/24 だとしています)。

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i lxdbr0 -s 10.0.0.0/24 -m comment --comment "generated by firewalld for LXD" -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -o lxdbr0 -d 10.0.0.0/24 -m comment --comment "generated by firewalld for LXD" -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i lxdbr0 -s 10.0.0.0/24 -m comment --comment "generated by firewalld for LXD" -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.0.0.0/24 ! -d 10.0.0.0/24 -m comment --comment "generated by firewalld for LXD" -j MASQUERADE
firewall-cmd --reload

firewalld にルールが設定されたかを確認するには以下のようにします。

firewall-cmd --direct --get-all-rules 

警告:上記の手順はフールプルーフなアプローチではなく、不注意にセキュリティリスクをもたらすことにつながる可能性があります。

ネットワーク: macvlan

macvlan ネットワークタイプではインスタンスを macvlan NIC を使って親のインターフェースに接続する際に使用するプリセットを指定可能です。 これによりインスタンスの NIC 自体は下層の詳しい設定を一切知ることなく、接続する network を単に指定するだけで設定できます。

ネットワーク設定プロパティー:

キー 条件 デフォルト 説明
maas.subnet.ipv4 string ipv4 アドレス - インスタンスを登録する MAAS IPv4 サブネット(nic の network プロパティを使用する場合)
maas.subnet.ipv6 string ipv6 アドレス - インスタンスを登録する MAAS IPv6 サブネット(nic の network プロパティを使用する場合)
mtu integer - - 作成するインターフェースの MTU
parent string - - macvlan NIC を作成する親のインターフェース
vlan integer - - アタッチする先の VLAN ID

ネットワーク: sriov

sriov ネットワークタイプではインスタンスを sriov NIC を使って親のインターフェースに接続する際に使用するプリセットを指定可能です。 これによりインスタンスの NIC 自体は下層の詳しい設定を一切知ることなく、接続する network を単に指定するだけで設定できます。

ネットワーク設定プロパティー:

キー 条件 デフォルト 説明
maas.subnet.ipv4 string ipv4 アドレス - インスタンスを登録する MAAS IPv4 サブネット(nic の network プロパティを使用する場合)
maas.subnet.ipv6 string ipv6 アドレス - インスタンスを登録する MAAS IPv6 サブネット(nic の network プロパティを使用する場合)
mtu integer - - 作成するインターフェースの MTU
parent string - - sriov NIC を作成する親のインターフェース
vlan integer - - アタッチする先の VLAN ID

ネットワーク: ovn

ovn ネットワークタイプは OVN SDN を使って論理的なネットワークの作成を可能にします。 これは複数の個別のネットワーク内で同じ論理ネットワークのサブネットを使うような検証環境やマルチテナントの環境で便利です。

LXD の OVN ネットワークはより広いネットワークへの外向きのアクセスを可能にするため既存の管理された LXD のブリッジネットワークに接続できます。 OVN 論理ネットワークからの全ての接続は親のネットワークによって割り当てられた動的 IP に NAT されます。

スタンドアロンの LXD での OVN の設定

これは外向きの通信のために親のネットワーク lxdbr0 に接続されたスタンドアロンの OVN ネットワークを作成する手順です。

OVN のツールをインストールし、ローカルノードで OVN の統合ブリッジを設定します。

apt install ovn-host ovn-central
ovs-vsctl set open_vswitch . \
  external_ids:ovn-remote=unix:/var/run/ovn/ovnsb_db.sock \
  external_ids:ovn-encap-type=geneve \
  external_ids:ovn-encap-ip=n.n.n.n \ # LAN 上の LXD ホストの IP

以下を使用して OVN ネットワークとインスタンスを作成します。

lxc network create ovntest --type=ovn network=lxdbr0
lxc init images:ubuntu/focal c1
lxc config device override c1 eth0 network=ovntest
lxc start c1
lxc ls
+------+---------+---------------------+----------------------------------------------+-----------+-----------+
| NAME |  STATE  |        IPV4         |                     IPV6                     |   TYPE    | SNAPSHOTS |
+------+---------+---------------------+----------------------------------------------+-----------+-----------+
| c1   | RUNNING | 10.254.118.2 (eth0) | fd42:887:cff3:5089:216:3eff:fef0:549f (eth0) | CONTAINER | 0         |
+------+---------+---------------------+----------------------------------------------+-----------+-----------+
キー 条件 デフォルト 説明
bridge.hwaddr string - - ブリッジの MAC アドレス
bridge.mtu integer - 1442 ブリッジの MTU (デフォルトではホストからホストへの geneve トンネルを許可します)
dns.domain string - lxd DHCP のクライアントに広告し DNS の名前解決に使用するドメイン
dns.search string - - 完全なドメインサーチのカンマ区切りリスト(デフォルトは dns.domain の値)
ipv4.address string standard mode ランダムな未使用のサブネット ブリッジの IPv4 アドレス (CIDR 形式)。 IPv4 をオフにするには "none" 、新しいアドレスを生成するには "auto" を指定。
ipv6.address string standard mode ランダムな未使用のサブネット ブリッジの IPv6 アドレス (CIDR 形式)。 IPv6 をオフにするには "none" 、新しいアドレスを生成するには "auto" を指定。
network string - - 外部ネットワークへの外向きのアクセスに使う親のネットワーク