Linux: IPアドレスを固定したいときに見る Netplan設定ガイド

趣味でLinuxを触るだけの筆者がターミナルからIPアドレスを固定しようとしたら、思いのほか苦戦したために書きました。

今回筆者はWi-Fi環境で設定をしましたが、有線接続との違いにも配慮しています。

## 注意点

- 筆者にネットワークまわりの知識は一切ありません。そのためこの記事にも重大な誤りや欠陥があるかもしれません。
- 筆者の環境はZorin OS 15.3です。Ubuntuベースであり共通点が多いOSなので、おそらくUbuntuでも同じように設定できると思います。が、検証はしていません。
- GUIからも比較的簡単に設定出来ます。[参考リンク 1](#参考リンク)
    - 今回はコマンドを用いて設定しています。
- 上にも書きましたがWi-Fi環境での設定ファイルの書き方がメインになります。有線での詳しい設定方法は[参考リンク 4,6](#参考リンク)がおすすめです。

## 手順

1. [ネットワーク設定の確認](#1-ネットワーク設定の確認)
2. [設定ファイルの作成](#2-設定ファイルの作成)
3. [設定の適用](#3-設定の適用)

### 1. ネットワーク設定の確認

IPアドレスを固定するための準備です。

1-1. [IPアドレス・インターフェース名を調べる](#1-1-ipアドレスインターフェース名を調べる)
1-2. [デフォルトゲートウェイのアドレスを調べる](#1-2-デフォルトゲートウェイのアドレスを調べる)
1-3. [DNSアドレスを調べる](#1-3-dnsアドレスを調べる)

#### 1-1. IPアドレス・インターフェース名を調べる

どんなIPアドレスに固定するか。わかりやすいのがいいでしょう。他の機器で使われていないものであればなんでもいいです。
今どんなIPアドレスかは次のコマンドで確認出来ます。

```terminal
$ ip address
```

どのインターフェースが使われているかも確認しましょう。(見分け方はよくわからないです.. 他より行数が多いやつかも..)

ちなみに特定のインターフェースだけに出力をしぼることもできます。

```terminal
$ ip address show インターフェース名
```

#### 1-2. デフォルトゲートウェイのアドレスを調べる

`ip route`で確認できます。`grep`でdefaultのものだけを出力するには以下のとおりです。

```terminal
$ ip route | grep default
```

#### 1-3. DNSアドレスを調べる

`/etc/resolv.conf`を直接参照しろという記述もみかけますがこれは間違いだそうです。そもそもこのファイルは`systemd-resolved`により生成されるファイルであり、詳細がしりたいときは`systemd-resolved --status`を使うらしいです。[参考2](#参考リンク)

```terminal
$ systemd-resolved --status
```
上で調べたインターフェースの項目中の`DNS Servers`にある数値が目的のアドレスです。

### 2. 設定ファイルの作成

`/etc/netplan/`に作成します。ファイル名は`99_config.yaml`です。既存の`XX_config.yaml`を編集するのは非推奨だそうです。[参考3,4](#参考リンク)

```yaml:/etc/netplan/99_config.yaml
network:
  version: 2
  renderer: networkd
  wifis:
    インターフェース名:
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.XXX.XXX/24
      gateway4: 192.168.XXX.XXX
      nameservers:
        addresses:
          - 192.168.XXX.XXX
      access-points:
        "accessPoint1":
          password: "password"
        "accessPoint2":
          password: "password"
```

NetplanはバックエンドにnetworkdとNetwork Managerの2つをサポートしているそうです。調べているときはnetworkdを使っているサイトが多かったですが、もしNetwork Managerをつかう場合は`renderer: NetworkManager`のようにします。

4行目を`wifis:`としていますが有線接続の場合は`ethernets:`としてください。

インターフェース名は[1-1. IPアドレス・インターフェース名を調べる](#1-1-ipアドレスインターフェース名を調べる)のものにしてください。

9行目`- 192.168.XXX.XXX/24`は固定したいIPアドレスにしてください。

10行目`gateway4: 192.168.XXX.XXX`は[1-2. デフォルトゲートウェイのアドレスを調べる](#1-2-デフォルトゲートウェイのアドレスを調べる)のものにしてください。

13行目`nameservers:`>`addresses:`の`- 192.168.XXX.XXX`は[1-3. DNSアドレスを調べる](#1-3-dnsアドレスを調べる)のものにしてください。

14行目`access-points:`以降はWi-Fi接続だけの設定になります。注意点としてアクセスポイント名(SSID)とパスワードはダブルクオーテーションで囲みましょう。アクセスポイントは1つでも3つ以上でも大丈夫です。

### 3. 設定の適用

いきなり設定を適用するのは怖いのでnetplanのtryコマンドを使いましょう。一時的に設定を適用したあと、Enterキーが押されなければ120秒で自動的にもとの設定に戻してくれます。`--timeout`オプションで任意の秒数に変更できます。[参考5](#参考リンク)

```terminal
$ sudo netplan try --timeout 180
```

この間にネットワーク接続をし直してからネットの検索などでちゃんとつながるか試しましょう。また実際にIPアドレスが固定されているか別ターミナルを立ち上げて`ip address`で確認するのもいいでしょう。

もし成功していたらEnterキーを押して完了です！

タイムアウトしてしまってもapplyコマンドで適用できます。

```terminal
$ sudo netplan apply
```

## 最後に

そもそも筆者はネットワークの知識がなさすぎて用語を調べるところからでしたが、検索にヒットするWebサイトが古かったり、サイトごとに方法がバラついていたためにとても苦労しました。まず"Netplanを使う"というところまでたどり着くのにも時間がかかりました。
最初に`99_config.yaml`を書いたときは`try`コマンドを知らず、そのまま`apply`してしまいました。結果繋がらなくなり絶望しました... 記述ミスがあったのですが最初は気づかず、設定ファイルを移動したりPC再起動したり焦っていろいろやりました。ミスを修正してからもすぐには直らず「明日OSを入れ直すしかない...」と落ち込んだのがこれを書く前夜のことです。今朝になってPCを起動してみたらWi-Fiが繋がっていた(IPアドレスの固定は出来ていませんでしたが)のは嬉しかったですが理由がわからずひたすら困惑しました。
その後Netplanの公式[(参考6)](#参考リンク)をみて設定したところ固定に成功しました。やっぱ公式は偉大ですね。
有線やもっと複雑なネット環境の方には[参考4](#参考リンク)と一緒におすすめします。

拙い記事ですが最後まで読んでいただきありがとうございました。

## 参考リンク

1. [Ubuntu 18.04 LTSで固定IPアドレスを設定する方法【デスクトップ編】](https://linuxfan.info/ubuntu-1804-desktop-static-ip-address)
2. [networking - What DNS servers am I using? - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/28941/what-dns-servers-am-i-using)
3. [【Ubuntu】 /etc/netplan/50-cloud-init.yamlを編集するの止めろ - Qiita](https://qiita.com/yas-nyan/items/9033fb1d1037dcf9dba5)
4. [Network - Configuration | Server documentation | Ubuntu](https://ubuntu.com/server/docs/network-configuration)
5. [Ubuntu 20.04 LTSで固定IPアドレスの設定 - Qiita](https://qiita.com/zen3/items/757f96cbe522a9ad397d#try%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)
6. [Netplan | Backend-agnostic network configuration in YAML](https://netplan.io/examples/)