Ubuntu 18.04 Server + LXDでブリッジ接続する

# 概要

LXDのコンテナをホストと同じネットワークで動かすと、
あたかも同じネットワーク上にサーバを1台追加したように扱うことができて便利。

ただ、Ubuntu 18.04からはネットワークの設定がnetplanに変更されていて、
それまでのbrctlと`/etc/network/interfaces`を使った設定方法とはちょっとやり方が変わってくるので、
netplanでの設定方法とLXDの設定方法をまとめてみた。

# 手順

## `bridge-utils`のインストール

~~~
$ sudo apt install bridge-utils
~~~

→ 2019.06.29追記) これは不要かもしれない。

## sysctl.conf設定

下記部分をコメントアウト。

~~~:/etc/sysctl.conf
#net.ipv4.ip_forward=1
net.ipv4.ip_forward=1
~~~

設定を反映(再起動でも良い)。

~~~
$ sudo sysctl -p
~~~

## netplanの設定

ホストのnetplan設定ファイル(Ubuntu 18.04 Serverでは`/etc/netplan/`に新たな設定ファイル作る)を以下のように設定。

この例では、もともとのNICインターフェースは`enp3s0`という名前で、
新たに`br0`というブリッジを作成。
ホストのネットワーク設定は下記のようになる。

* IPアドレス: `192.168.10.232`
* ネットマスク: `255.255.255.0`
* ゲートウェイ: `192.168.10.253`
* DNS: `192.168.10.234`, `192.168.10.236`

~~~:/etc/netplan/99_config.yaml
network:
    ethernets:
        enp3s0:
            dhcp4: false
    bridges:
        br0:
            interfaces:
                - enp3s0
            dhcp4: false
            addresses:
            - 192.168.10.232/24
            gateway4: 192.168.10.253
            nameservers:
                addresses:
                - 192.168.10.236
                - 192.168.10.234
            parameters:
                forward-delay: 0
                stp: false
            optional: true
    version: 2
    
~~~

設定ファイルの内容を`netplan apply`で適用し、`ip a`で確認。

なお、DHCPで取得したアドレスがある場合は、`ip addr flush dev enp0s3`を実行してから`netplan apply`をするのだが、
SSHで接続しているときは一旦接続が切れるので注意。

~~~
$ sudo netplan apply
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether 00:21:5a:f3:49:86 brd ff:ff:ff:ff:ff:ff
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 42:c3:b5:d3:6d:98 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.232/24 brd 192.168.10.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::40c3:b5ff:fed3:6d98/64 scope link 
       valid_lft forever preferred_lft forever
5: enp5s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:21:5a:f3:49:84 brd ff:ff:ff:ff:ff:ff
~~~

## LXDの初期設定

`lxd init`として、LXDの初期設定を行う。
途中、先ほど作成したブリッジ`br0`を利用するように設定。

* `Would you like to create a new network bridge? (yes/no) [default=yes]`: `no`と入力
* `Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]`: `yes`と入力
* `Name of the existing bridge or host interface`: `br0`と入力

~~~
$ sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: 
Name of the storage backend to use (btrfs, dir, lvm) [default=btrfs]: dir
Would you like to connect to a MAAS server? (yes/no) [default=no]: no
Would you like to create a new network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]: yes
Name of the existing bridge or host interface: br0
Is this interface connected to your MAAS server? (yes/no) [default=yes]: no
Would you like LXD to be available over the network? (yes/no) [default=no]: no
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] 
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 

$ lxc version
Client version: 3.0.0
Server version: 3.0.0
~~~

これにて完了。

## LXDがすでに設定済みの場合

`lxc profile edit default`でコンテナが使うネットワークを設定する。
デフォルトであれば、`lxdbr0`となっている部分があるはずなので、
これを上記で作成した`br0`に書き換えればOK。

## 後からNATネットワークを追加する場合

以下のコマンドで新規ネットワークを作成する(この例では`br1`)。

~~~
lxc network create br1
~~~

あとは作ったネットワークを使うプロファイルを作成する。
既存の`default`などをコピーして編集する(この例では名前をnatnetwork)。

~~~
lxc profile copy default natnetwork

lxc profile edit natnetwork
~~~

Viでネットワークを設定する箇所があるので、`br0`を`br1`などと変更して保存

既存のコンテナのプロファイルを切り替えて、所属するネットワークを変更する場合は、`lxc profile assign`とする。

~~~
lxc profile assign CONTAINER natnetwork
~~~