ネットワーク設定
次のネームスペースの 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/24
や fd80:1234::1/64
) で指定することを想定しています。例外としてトンネルのローカルとリモートのアドレスは単なるアドレス (1.1.1.1
や fd80: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.mode
が none
でないときにしか機能しないことに注意してください。
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
警告:上記の手順はフールプルーフなアプローチではなく、不注意にセキュリティリスクをもたらすことにつながる可能性があります。