はじめに
プライベートネットワークに複数のサーバーを接続し、それぞれ固定のプライベート IP アドレスを割り当てたいみたいな時があります。
私は、macOS を普段使いしていて、時々、自作PCに入れた Ubuntuサーバー を SSH で利用しています。
プライベート IP アドレスは DHCP によって割り当てられているので、サーバーの IP アドレスが頻繁に変わってしまうと、SSH 接続のたびに IP アドレスを調べ直す手間が発生し、非常に不便です。
下記の記事で書いた mDNS と SSH config を使ってやりくりしているのですが、netplan を使って固定の IP アドレスを割り当てるのも有用だったので、まとめます。
netplan とは
Linux システム上でネットワーク設定を抽象化し、管理するためのユーティリティです。
netplan 自体がネットワークの制御を行うのではなく、
設定ファイルを読み込み、その内容をバックエンドとなるネットワークサービスが理解できる形式に変換し、反映してもらうことが主な役割です。
現在、バックエンドのネットワークサービスとしてサポートされているのは
- NetworkManager
- Systemd-networkd
の2つです。
Ubuntu の場合、netplan はデフォルトで入っています。(Ubuntu 17.10 以降)
netplan を使って固定 IP アドレスを割り当てる
netplan の設定ファイル
ドキュメントを見ると、netplan は /{lib,etc,run}/netplan/*.yaml に配置されている設定ファイルを読みますが、
設定ファイルであるということと、https://netplan.io/ を見る感じ、/etc/netplan/*.yaml に配置するのが最も良さそうです。
/etc/netplan/*.yaml のファイルが辞書順に読み込まれるため、後から読み込んだファイルの設定が前に読み込んだファイルの設定を上書きします。
初期状態で /etc/netplan/50-cloud-init.yaml というファイルが存在していますが、このファイルは cloud-init によって自動的に生成されたもので、直接編集するものではないようです。
今回は、/etc/netplan/51-custom.yaml にファイルを作成して netplan の設定をしていきます。
DHCP をオフにする
固定のプライベートアドレス IP アドレスを割り当てるためには DHCP の機能をオフにする必要があります。
DHCP によって、IP アドレスやサブネットマスク、デフォルトゲートウェイ、DNS サーバーの IP アドレスが管理されていて、IP アドレス以外は特に変更したくないので、先にその辺の情報を控えておきます。
※ 私の環境では、対象のネットワークインターフェースが eno1 なので、その辺は適宜読み替えてください
- IPアドレス、サブネットマスク
$ ifconfig eno1 | grep -w inet
inet 192.168.151.155 netmask 255.255.254.0 broadcast 192.168.151.255
- デフォルトゲートウェイ
$ ip route show | grep default
default via 192.168.150.1 dev eno1 proto dhcp src 192.168.151.155 metric 100
- DNSサーバー
$ resolvectl status eno1
Link 2 (eno1)
Current Scopes: DNS
Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.150.1
DNS Servers: 192.168.150.1
既存のネットワーク状態がわかったので、早速 DHCP の機能をオフにしてみます。
私の環境では、バックエンドのネットワークサービスとして、NetworkManager を使っているので、renderer には NetworkManager を指定しています。
network:
version: 2
renderer: NetworkManager
ethernets:
eno1:
dhcp4: false
$ sudo netplan apply
これによって DHCP が無効化されるため、リンクローカルアドレス が割り当てられるようになります。
$ sudo ifconfig eno1 | grep -w inet
inet 169.254.212.76 netmask 255.255.0.0 broadcast 169.254.255.255
デフォルトゲートウェイの設定も DNS サーバーの設定もされなくなるため、インターネットに出ることも、名前解決することもできなくなりました。
固定のプライベート IP アドレスを設定する
今回の目的である、固定のプライベート IP アドレスを設定していきます。
私の環境だと、デフォルトゲートウェイ(ルーター)の プライベート IP アドレスが 192.168.150.1 で、サブネットマスクが 255.255.254.0 だったので、192.168.150.2 ~ 192.168.151.254 の範囲から設定します。
network:
version: 2
renderer: NetworkManager
ethernets:
eno1:
dhcp4: false
addresses:
- 192.168.150.111/23
$ sudo netplan apply
これで、対象のネットワークインターフェースに固定のプライベート IP アドレスが割り当てられるようになります。
$ ifconfig eno1 | grep -w inet
inet 192.168.150.111 netmask 255.255.254.0 broadcast 192.168.151.255
現時点で、プライベートネットワーク内での通信は可能になりましたが、
ゲートウェイの設定と DNS サーバーの設定がされていないため、インターネットに出られないのと名前解決ができない状態です。
DNS サーバーの設定をする
先に確認しておいた、DNS サーバーの設定を追加します。
network:
version: 2
renderer: NetworkManager
ethernets:
eno1:
dhcp4: false
addresses:
- 192.168.150.111/23
nameservers:
addresses:
- 192.168.150.1
$ sudo netplan apply
これで、名前解決はできるようになりますが、ゲートウェイの指定がされていないため、まだインターネットには出られない状態です。
$ curl https://qiita.com
curl: (7) Failed to connect to qiita.com port 443 after 19 ms: Couldn't connect to server
デフォルトゲートウェイを設定する
こちらも同様に先に確認しておいた、デフォルトゲートウェイの設定を追加します。
network:
version: 2
renderer: NetworkManager
ethernets:
eno1:
dhcp4: false
addresses:
- 192.168.150.111/23
nameservers:
addresses:
- 192.168.150.1
routes:
- to: default
via: 192.168.150.1
$ sudo netplan apply
ルーティングテーブルを確認すると、元々は dhcp だった箇所が static になっていることも確認できます。
- before
$ ip route show | grep default
default via 192.168.150.1 dev eno1 proto dhcp src 192.168.151.155 metric 100
- after
$ ip route show | grep default
default via 192.168.150.1 dev eno1 proto static metric 100