LXDのネットワーク設定(bridgeとmacvlan)
カテゴリ:コンテナ仮想化

この記事ではLXDのネットワーク設定について解説いたします。
Note以降は CentOS 8 + LXD 4.4 環境での手順となります。
初期設定で作成されるブリッジインターフェース
LXDでは、lxd initコマンドを実行すれば、初期設定でブリッジlxdbr0が作成されNATとして構成されます。
lxd init実行後のnmcli deviceコマンドの結果:
# nmcli device DEVICE TYPE STATE CONNECTION ens33 ethernet 接続済み ens33 lxdbr0 bridge 接続済み lxdbr0 virbr0 bridge 接続済み virbr0 lo loopback 管理無し -- virbr0-nic tun 管理無し --
ip addrコマンドの結果:
lxdbr0には自動で10.231.170.1/24のIPアドレスが設定されていることが確認できます。
# ip addr show dev lxdbr0 5: lxdbr0:mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:16:3e:45:a3:09 brd ff:ff:ff:ff:ff:ff inet 10.231.170.1/24 scope global lxdbr0 valid_lft forever preferred_lft forever inet6 fd42:3d0d:672a:e80c::1/64 scope global valid_lft forever preferred_lft forever inet6 fe80::216:3eff:fe45:a309/64 scope link valid_lft forever preferred_lft forever
コンテナの実行時には自動でvethインターフェースが作成され、コンテナにlxdbr0で設定したネットワーク(ホストの物理NICとは別ネットワーク)のIPアドレスが割り振られます。
ファイアウォールの設定
CentOS では、ファイアウォールでlxdbr0を信頼済みゾーンに追加しなければ、コンテナにIPアドレスが割り振られません。
# lxc list +---------+---------+------+------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +---------+---------+------+------+-----------+-----------+ | centos8 | RUNNING | | | CONTAINER | 0 | +---------+---------+------+------+-----------+-----------+
まず、以下のコマンドですべてのアクティブなゾーンを確認します。
# firewall-cmd --get-active-zones libvirt interfaces: virbr0 public interfaces: ens33
lxdbr0がゾーン一覧に表示されない場合、信頼済みゾーンに追加します。
# firewall-cmd --add-interface=lxdbr0 --zone=trusted --permanent success # firewall-cmd --reload success
参考--permanentオプションは恒久的な設定を意味し、OSを再起動しても設定が保持されます。
lxdbr0が信頼済みゾーンに追加されていることを確認します。
# firewall-cmd --get-active-zones libvirt interfaces: virbr0 public interfaces: ens33 trusted interfaces: lxdbr0
一旦コンテナを再起動し、今度はIPv4のIPアドレスが割り振られていることを確認します。
# lxc restart centos8 # lxc list +---------+---------+-----------------------+------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +---------+---------+-----------------------+------+-----------+-----------+ | centos8 | RUNNING | 10.209.170.144 (eth0) | | CONTAINER | 0 | +---------+---------+-----------------------+------+-----------+-----------+
LXDのネットワーク設定の確認
LXDのネットワーク設定の確認や変更には lxc network コマンドを使用します。
現在のネットワーク設定を確認するためには、lxc network show コマンドに続けて、インターフェース名を指定します。
使用法:lxc network show インターフェース名
例)
# lxc network show lxdbr0 config: ipv4.address: 10.231.170.1/24 ipv4.nat: "true" ipv6.address: fd42:3d0d:672a:e80c::1/64 ipv6.nat: "true" volatile.bridge.hwaddr: 00:16:3e:45:a3:09 description: "" name: lxdbr0 type: bridge used_by: - /1.0/instances/centos8 - /1.0/profiles/default managed: true status: Created locations: - none
キー名を指定して値を取得する場合は、lxc network get コマンドに続けて、インターフェース名、キー名を指定します。
使用法:lxc network get インターフェース名 キー名
# lxc network get lxdbr0 ipv4.address 10.231.170.1/24
また、defaultプロファイルの初期設定は以下となり、この設定が各コンテナに継承されます。デフォルトでeth0デバイスが定義されていることが確認できます。
例)
# lxc profile show default config: {} description: Default LXD profile devices: eth0: name: eth0 network: lxdbr0 type: nic root: path: / pool: strage type: disk name: default used_by: - /1.0/instances/centos8
LXDのネットワーク設定の変更
lxdbr0の設定を変更するには、lxc network edit コマンドに続けて、インターフェース名を指定します。
# lxc network edit lxdbr0 ### This is a YAML representation of the network. ### Any line starting with a '# will be ignored. ### ### A network consists of a set of configuration items. ### ### An example would look like: ### name: lxdbr0 ### config: ### ipv4.address: 10.62.42.1/24 ### ipv4.nat: true ### ipv6.address: fd00:56ad:9f7a:9800::1/64 ### ipv6.nat: true ### managed: true ### type: bridge ### ### Note that only the configuration can be changed. config: ipv4.address: 10.231.170.1/24 ipv4.nat: "true" ipv6.address: fd42:3d0d:672a:e80c::1/64 ipv6.nat: "true" volatile.bridge.hwaddr: 00:16:3e:45:a3:09 description: "" name: lxdbr0 type: bridge used_by: - /1.0/instances/centos8 - /1.0/profiles/default managed: true status: Created locations: - none
また、コマンドでキー値を変更する場合は、lxc network set コマンドに続けて、インターフェース名、キー名、値を指定します。
使用法:lxc network set インターフェース名 キー名 値
例)
# lxc network set lxdbr0 ipv6.nat false # lxc network get lxdbr0 ipv6.nat false
ネットワークタイプの設定
LXDは以下のネットワークタイプをサポートしています。
bridge | インスタンスにL2ブリッジを介して接続(デフォルト) |
---|---|
macvlan | インスタンスを親の macvlan インターフェースに接続(ホストとの通信は不可) |
sriov | インスタンスを親の SR-IOV インターフェースに接続(SR-IOV対応デバイスが必要) |
ovn | OVN SDN (software defined network) システムを使用して論理的ネットワークを作成(OVN SDN環境が必要) |
一般的な環境では、選択肢はbridgeかmacvlanの2択になるのではないでしょうか。 そのため、以降ではbridgeとmacvlanのネットワークの構築手順を記載します。
bridge(デフォルト)の設定
bridge がデフォルトであるため、lxd init コマンドで初期設定を行えば、特別な設定は必要ありません。 lxdbr0の設定内容は以下のようになります。
# lxc network show lxdbr0 config: ipv4.address: 10.231.170.1/24 ipv4.nat: "true" ipv6.address: fd42:3d0d:672a:e80c::1/64 ipv6.nat: "true" volatile.bridge.hwaddr: 00:16:3e:45:a3:09 description: "" name: lxdbr0 type: bridge used_by: - /1.0/instances/centos8 - /1.0/profiles/default managed: true status: Created locations: - none
macvlanの設定
macvlanは物理NICに対して任意のMACアドレスを割り当てた仮想的NICを作成します。ホストと同じDNS、DHCPが使用され、外部からのアクセスが可能となりますが、ホストとコンテナ間の通信はできなくなります。
注意VMWareなどの仮想マシン上で動作させている場合、macvlanを使用する場合はネットワーク設定でNICのMACアドレス改ざんを許容する無差別(promiscuous)モードを有効にしなければmacvlanは機能しません。
参考:How promiscuous mode works at the virtual switch and portgroup levels (1002934)
また、WPA/WPA2のようなセキュリティ機能はコンピュータからの他のMACアドレスをすべて拒否するためワイヤレスネットワーク環境ではmacvlanは機能しません。
うまく行かない場合は、物理環境、有線LAN接続の環境で試してみてください。
macvlan用プロファイルを作成する場合
上述したようにdefaultプロファイルはbridgeとして作成されているため、macvlan用に新たなプロファイルmacvlanを作成することにします。
# lxc profile create macvlan Profile macvlan created # lxc profile list +---------+---------+ | NAME | USED BY | +---------+---------+ | default | 1 | +---------+---------+ | macvlan | 0 | +---------+---------+
その上で、macvlanプロファイル上にmacvlanインターフェースを作成します。 lxc profile device add コマンドのオプションに、nictype に macvlan、parent に接続先の物理NIC(ens33)を指定し、新たなインターフェースeth0を追加します。
# lxc profile device add macvlan eth0 nic nictype=macvlan parent=ens33 Device eth0 added to macvlan
作成されたmacvlanプロファイルの内容を見てみます。
# lxc profile show macvlan config: {} description: "" devices: eth0: nictype: macvlan parent: ens33 type: nic name: macvlan used_by: []
次にmacvlanプロファイルを指定してコンテナを作成します。 オプションでは、最初にdefaultプロファイルを指定し、次にmacvlanプロファイルを指定する必要があります。
# lxc launch images:centos/8 centos8macvlan --profile default --profile macvlan
Notedefaultプロファイル(bridge)のコンテナ側のインターフェース名もeth0で、一見競合しそうですが問題ありません。 コンテナは最初に指定したdefaultプロファイルから基本構成を取得し、ネットワークインターフェースは後に指定したmacvlanプロファイルで上書きされるからです。
macvlanプロファイルのused_byキーにcentos8macvlanが追加されたことが確認できます。
# lxc profile show macvlan config: {} description: "" devices: eth0: nictype: macvlan parent: ens33 type: nic name: macvlan used_by: - /1.0/instances/centos8macvlan
こちらがdefaultプロファイルの状態です。こちらもused_byキーにcentos8macvlanが追加されています。
# lxc profile show default config: {} description: Default LXD profile devices: eth0: name: eth0 network: lxdbr0 type: nic root: path: / pool: strage type: disk name: default used_by: - /1.0/instances/centos8 - /1.0/instances/centos8macvlan
また、macvlanプロファイルのUSED BYが1と表示されていることが確認できます。
# lxc profile list +---------+---------+ | NAME | USED BY | +---------+---------+ | default | 2 | +---------+---------+ | macvlan | 1 | +---------+---------+
ホストのデフォルトゲートウェイは192.168.11.1です。
# ip route show default 0.0.0.0/0 default via 192.168.11.1 dev ens33 proto dhcp metric 100
そしてcentos8macvlanコンテナ側では192.168.11.xxのIPアドレスが割り振られていることが確認できますね。
# lxc list +----------------+---------+-----------------------+------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +----------------+---------+-----------------------+------+-----------+-----------+ | centos8 | RUNNING | 10.231.170.144 (eth0) | | CONTAINER | 0 | +----------------+---------+-----------------------+------+-----------+-----------+ | centos8macvlan | RUNNING | 192.168.11.32 (eth0) | | CONTAINER | 0 | +----------------+---------+-----------------------+------+-----------+-----------+
プロファイルを作成しない場合
macvlanプロファイルを作成せず、単にコンテナにmacvlanインターフェースeth1を追加する場合は、以下を実行します。
# lxc config device add centos8macvlan eth1 nic nictype=macvlan parent=ens33 Device eth1 added to centos8macvlan
注意この場合は、defaultプロファイルと重複しないインターフェース名を指定する必要があります。
クライアントから接続できるようにする
コンテナにクライアントから直接接続できるように、静的ルートを設定します。 クライアントがWindowsの場合は、コマンドプロンプト(cmd)から以下のようにrouteコマンドで設定します。
※-pオプションを付与することで恒久的に設定されます。(OSを再起動しても設定が保持されます)
route -p add "宛先コンテナのネットワーク/サブネット" mask "サブネット" "ゲートウェイ(LXDホストのIP)"
上記のコンテナへの静的ルートであれば以下のようになります。
route -p add "10.231.170.0/24" mask "255.255.255.0" "192.168.11.150"
静的ルートは異なるネットワークへの経路(ゲートウェイ)を設定します。例えばクライアントPCのIPが192.168.11.2であった場合、宛先コンテナのネットワーク(10.231.170.0/24)への経路を知っているゲートウェイを探します。そして、そのゲートウェイ経由で接続を試みます。ゲートウェイ側では192.168.11.2からのパケットを10.231.170.0/24の宛先IPアドレスに転送(フォワーディング)します。なお、ゲートウェイ(LXDホスト)側ではIP転送が行えるよう、/etc/sysctl.confにnet.ipv4.ip_forward=1を設定しておく必要があります。
例)
net.ipv4.ip_forward=1
設定を反映
sysctl -pNote
公開日時:2020年09月03日 22:09:41
最終更新日時:2022年03月13日 08:34:33