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対応デバイスが必要)
ovnOVN 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

なお、VPS選びで迷ったらこちらの記事で主要VPSのメモリ容量ごとの月額、年額料金を比較していますので、是非参考にしてみてください。

コンテナ仮想化に戻る

「コンテナ仮想化」に関する他の手順

このページのトップに戻る