ネットワーク設定

次のネームスペースの key/value 設定が現在サポートされています。

  • bridge (L2 インタフェースの設定)
  • fan (Ubuntu FAN overlay に特有な設定)
  • tunnel (ホスト間のトンネリングの設定)
  • ipv4 (L3 IPv4 設定)
  • ipv6 (L3 IPv6 設定)
  • dns (DNS サーバと名前解決の設定)
  • raw (raw の設定のファイルの内容)
  • 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 のネットワークの設定項目の完全なリストは以下の通りです。

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" はクライアントがレコードを生成)
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 boolean ipv4 address false NAT にするかどうか (未設定の場合はデフォルト値は true になりランダムな ipv4.address が生成されます)
ipv4.nat.order string ipv4 address before 必要な NAT のルールを既存のルールの前に追加するか後に追加するか
ipv4.nat.address string ipv4 address - ブリッジからの送信時に使うソースアドレス
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 boolean ipv6 address false NAT にするかどうか (未設定の場合はデフォルト値は true になりランダムな ipv6.address が生成されます)
ipv6.nat.order string ipv6 address before 必要な NAT のルールを既存のルールの前に追加するか後に追加するか
ipv6.nat.address string ipv6 address - ブリッジからの送信時に使うソースアドレス
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 でないときにしか機能しないことに注意してください。

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 

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