Ubuntu 22.04 LTSで固定IPアドレスの設定

Ubuntu 22.04 LTS Serverでの固定IPアドレス設定。
17.10から、IPアドレスの変更が/etc/network/interfacesをいじる方式からNetplanへ変更になっているのでメモ。

[Netplan | Backend-agnostic network configuration in YAML](https://netplan.io/)

## 基本 - IPアドレスの固定

設定ファイル ( /etc/netplan/99_config.yaml ) を作成し既存の設定を上書きします。

1. /etc/netplan/99_config.yaml を作成しIPアドレスを設定する
    以下は設定例
    ```yaml
    network:
      version: 2
      renderer: networkd
      ethernets:
        eth0:
          dhcp4: false
          dhcp6: false
          addresses: [192.168.1.70/24]
          routes:
            - to: default
              via: 192.168.1.1      
          nameservers:
            addresses: [192.168.1.1, 8.8.8.8, 8.8.4.4]
    ```

2. ファイルのパーミッションを変更する
    ```bash
    sudo chmod 600 /etc/netplan/99_config.yaml
    ```

3. 設定の反映を行う
    ```bash
    sudo netplan apply
    ```

※ ルーターのアドレス指定方法が、Ubuntu22.04(21?)以降変わっているようです。
Ubuntu20.04以前では、ルーターのアドレスは``gateway4: 192.168.1.1``のように設定していましたが、netplan applyを実行すると下記のような警告が表示されたので、設定例を更新しました。
```console:
** (process:841): WARNING **: 02:50:55.217: `gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.
```

### 応用
KVMやLXDなどで、物理マシンの外に公開するサーバーを建てたい場合にはブリッジの設定をすると思う。その場合には下記のように記述します。(そして仮想nicをbr0に差し込む)

##### 事前準備
設定をする前にブリッジ機能の有効化をしておく

```bash
$ sudo apt install -y bridge-utils
$ brctl show
```

##### ブリッジ構成時の設定ファイル
```yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
      dhcp6: false
  bridges:
    br0:
      interfaces: [eth0]
      dhcp4: false
      dhcp6: false
      addresses: [192.168.1.70/24]
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [192.168.1.1, 8.8.8.8, 8.8.4.4]
      parameters:
        forward-delay: 0
        stp: false
      optional: true
```

##### NICを冗長化しつつVLANを作り更にブリッジを構成した際の設定ファイル(/etc/netplan/99_config.yml)
メモ：netplan applyでは上手く反映されず、OS再起動で接続できるようになった。

```yaml
network:
  version: 2
  renderer: networkd

  ethernets:
    enp3s0: {}
    eth0: {}

  bonds:
    bond0:
      interfaces:
        - enp3s0
        - eth0
      parameters:
        mode: balance-rr

  vlans:
    vlan129:
      id: 129
      link: bond0
    vlan52:
      id: 52
      link: bond0

  bridges:
    br0:
      interfaces: [vlan129]
      dhcp4: false
      dhcp6: true
      addresses: [192.168.129.10/23]
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [192.168.128.1, 8.8.8.8, 8.8.4.4]
    br1:
      interfaces: [vlan52]
      addresses: [192.168.52.21/24]
```

## IPアドレス設定変更の反映

`netplan apply`を実行して反映します。再起動不要です。

```
$ sudo netplan apply
```

### tryコマンド

リモートから設定を変更するときに自信があるならばapplyで一気に反映させてもいいけど、失敗して疎通不能になるのは困る場合、反映後指定秒数以内に[Enter]が押せなかったら、元の設定に戻してくれる機能がある。(但し、ブリッジやボンディングには対応していない。timeoutを設定しない時のデフォルトは120秒)
IPアドレスを変更するときなどは、IPアドレスを変えて再度sshしても別な端末になりEnterが押せないので、tmux等仮想端末上からnetplanコマンドを叩いてssh再接続後アタッチ(tmux a)しなおすのが良いかも。

```
$ sudo netplan try --timeout 10
Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in  1 seconds
Reverting.
```

## IPアドレスの確認

ifconfigコマンドがデフォルトでインストールされなくなったので、ipコマンドで確認。

```
$ ip addr
```

(2020-05-28 自分用にメモ追記)
ネットワークの状態を詳細に確認するなら、下記コマンドが便利。

```
$ networkctl status -a
```
## フックスクリプト
interfacesファイルの頃は、pre-up , up , down , post-downにコマンドを書いていたが、Netplanにはそういった機能は無く、例えばrendererにnetworkdを指定した場合、networkdが呼び出すnetworkd-dispatcherにそういった設定を追加する。

```
sudo apt install -y networkd-dispatcher
sudo mv ap_start.sh /etc/networkd-dispatcher/routable.d/
sudo mv ap_stop.sh /etc/networkd-dispatcher/off.d/
```
(参考)https://netplan.io/faq#use-pre-up-post-up-etc-hook-scripts
(参考)https://roy-n-roy.github.io/Raspberry%20Pi/Network/

## 参考
[How To Configure Static IP Address on Ubuntu 20.04/18.04/19.10](https://computingforgeeks.com/how-to-configure-static-ip-address-on-ubuntu/)
[Network - Configuration | Server documentation | Ubuntu] (https://ubuntu.com/server/docs/network-configuration)
[Netplan reference](https://netplan.io/reference) (←WiFi、ブリッジの設定等もある)
[【Ubuntu】 /etc/netplan/50-cloud-init.yamlを編集するの止めろ](https://qiita.com/yas-nyan/items/9033fb1d1037dcf9dba5)