【Ubuntu 24.04】初期設定からDNSサーバの指定を恒久的に変更する方法
今回はUbuntuサーバでDNS設定を恒久的に変更する方法を解説します。
初期セットアップ後にcloud-initが生成したNetplanファイル(50-cloud-init.yaml)の影響で、再起動のたびにDNS設定が元に戻ってしまうという問題が発生することがあります。
今回のモデルケースとして、初期セットアップ時にDNSサーバとして192.168.40.1が設定されていた環境で、これを恒久的に8.8.8.8 / 1.1.1.1に変更する方法を紹介します。
この記事では、cloud-initの干渉を停止し、再起動時に設定が復活する現象を回避する手順を解説します。
前提条件
- Ubuntu Server 24.04.3 LTS を使用
- IP アドレス/ゲートウェイ/DNSサーバは固定設定
- セットアップ時のDNSサーバ:192.168.40.1
- OpenSSH Serverはインストール済み
- 上記以外はすべてデフォルト設定で、初回ログイン直後のクリーンな状態から作業を開始
手順
以下のコマンドすべてUbuntuホスト側で実行します。
①現在のネットワーク設定(揮発性)を確認
DNS=192.168.40.1であることが分かります。
gumio@ubuntu-server:~$ ls -al /run/systemd/network/
total 4
drwxr-xr-x 2 root root 60 Nov 14 07:31 .
drwxr-xr-x 23 root root 600 Nov 15 04:07 ..
-rw-r----- 1 root systemd-network 150 Nov 14 07:31 10-netplan-ens18.network
gumio@ubuntu-server:~$
gumio@ubuntu-server:~$ sudo cat /run/systemd/network/10-netplan-ens18.network
[sudo] password for gumio:
[Match]
Name=ens18
[Network]
LinkLocalAddressing=ipv6
Address=192.168.40.10/24
DNS=192.168.40.1
[Route]
Destination=0.0.0.0/0
Gateway=192.168.40.99
gumio@ubuntu-server:~$②現在反映されているDNSサーバを確認
gumio@ubuntu-server:~$ resolvectl
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
Link 2 (ens18)
Current Scopes: DNS
Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.40.1
DNS Servers: 192.168.40.1
gumio@ubuntu-server:~$③Netplanの設定ファイル(不揮発性)を確認
以下の出力例のように、XX-cloud-init.yamlというファイルが存在することが分かります。
このファイルが、起動時に①の10-netplan-ens18.networkを自動生成しています。
gumio@ubuntu-server:~$ ls -al /etc/netplan/
total 12
drwxr-xr-x 2 root root 4096 Nov 14 07:15 .
drwxr-xr-x 108 root root 4096 Nov 14 07:15 ..
-rw------- 1 root root 235 Nov 14 07:15 50-cloud-init.yaml
gumio@ubuntu-server:~$
gumio@ubuntu-server:~$ sudo cat /etc/netplan/50-cloud-init.yaml
network:
version: 2
ethernets:
ens18:
addresses:
- "192.168.40.10/24"
nameservers:
addresses:
- 192.168.40.1
search: []
routes:
- to: "default"
via: "192.168.40.99"
gumio@ubuntu-server:~$④cloud-initによるNetplan生成を無効化
cloud-initがNetplanに干渉しないよう、対象ファイルを無効化します。
gumio@ubuntu-server:~$ sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.disabled
gumio@ubuntu-server:~$
gumio@ubuntu-server:~$
gumio@ubuntu-server:~$ ls -al /etc/netplan/
total 12
drwxr-xr-x 2 root root 4096 Nov 15 06:01 .
drwxr-xr-x 108 root root 4096 Nov 14 07:15 ..
-rw------- 1 root root 235 Nov 14 07:15 50-cloud-init.yaml.disabled
gumio@ubuntu-server:~$⑤新しいNetplan設定ファイルを作成
gumio@ubuntu-server:~$ sudo nano /etc/netplan/99-network.yaml
gumio@ubuntu-server:~$
gumio@ubuntu-server:~$ ls -al /etc/netplan/
total 16
drwxr-xr-x 2 root root 4096 Nov 15 06:07 .
drwxr-xr-x 108 root root 4096 Nov 14 07:15 ..
-rw------- 1 root root 235 Nov 14 07:15 50-cloud-init.yaml.disabled
-rw-r--r-- 1 root root 366 Nov 15 06:07 99-network.yaml
gumio@ubuntu-server:~$99-network.yamlの中身には以下を記述しています。インターフェイス名(ens18)はご自身の環境に合わせて修正してください。
network:
version: 2
renderer: networkd
ethernets:
ens18:
dhcp6: false
dhcp4: false
addresses: [192.168.40.10/24]
routes:
- to: default
via: 192.168.40.99
nameservers:
addresses: [8.8.8.8, 1.1.1.1]Tips
今回は99-network.yamlのように、cloud-initが生成するファイルより大きい番号(99)をプレフィックスとして付けていますが、手順④でcloud-initを無効化しているため、実際には任意のファイル名(.yamlであれば何でも可)で問題ありません。
また、もし50-cloud-init.yamlが有効な状態で99-network.yamlを配置した場合、Netplanはファイル名の昇順に設定を読み込み、最後のファイルが優先されます。ただし今回のように、各ファイルで異なるDNSサーバが指定されている場合、単純に上書きではなく設定がマージされる点に注意が必要です。
その結果、DNSサーバとして:
- 50-cloud-init.yaml → 192.168.40.1
- 99-network.yaml → 8.8.8.8, 1.1.1.1
が記載されていると、最終的なネットワーク設定には192.168.40.1 / 8.8.8.8 / 1.1.1.1のすべてが反映されることになります。
⑥Netplanを適用
最後にNetplanを適用、ステータス確認をして完了です。
■ネットワーク設定ファイルの生成・適用
gumio@ubuntu-server:~$ sudo netplan generate
** (generate:1102): WARNING **: 07:05:56.270: Permissions for /etc/netplan/99-network.yaml are too open. Netplan configuration should NOT be accessible by others.
gumio@ubuntu-server:~$
gumio@ubuntu-server:~$ sudo netplan apply
** (generate:1149): WARNING **: 07:06:02.975: Permissions for /etc/netplan/99-network.yaml are too open. Netplan configuration should NOT be accessible by others.
** (process:1147): WARNING **: 07:06:03.142: Permissions for /etc/netplan/99-network.yaml are too open. Netplan configuration should NOT be accessible by others.
** (process:1147): WARNING **: 07:06:03.192: Permissions for /etc/netplan/99-network.yaml are too open. Netplan configuration should NOT be accessible by others.
gumio@ubuntu-server:~$
gumio@ubuntu-server:~$ ls -al /run/systemd/network/
total 4
drwxr-xr-x 2 root root 60 Nov 15 07:06 .
drwxr-xr-x 23 root root 600 Nov 15 07:06 ..
-rw-r----- 1 root systemd-network 157 Nov 15 07:06 10-netplan-ens18.network
gumio@ubuntu-server:~$
■生成されたネットワーク設定ファイルの中身を確認
gumio@ubuntu-server:~$ sudo cat /run/systemd/network/10-netplan-ens18.network
[Match]
Name=ens18
[Network]
LinkLocalAddressing=ipv6
Address=192.168.40.10/24
DNS=8.8.8.8
DNS=1.1.1.1
[Route]
Destination=0.0.0.0/0
Gateway=192.168.40.99
gumio@ubuntu-server:~$
■DNSの設定値を確認
gumio@ubuntu-server:~$ resolvectl
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
Link 2 (ens18)
Current Scopes: DNS
Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
DNS Servers: 8.8.8.8 1.1.1.1
gumio@ubuntu-server:~$まとめ
UbuntuのDNSサーバの反映フロー
Ubuntu起動
⬇
netplanがsystemd-networkd用の設定ファイルを生成
(※このタイミングで50-cloud-init.yamlが使われてしまう)
⬇
systemd-networkdが生成された*.networkを読み込み、IPやDNSを適用
⬇
systemd-networkdがDNS設定をsystemd-resolvedに通知
⬇
systemd-resolvedが最終的なDNSサーバを決定
という流れの中で、cloud-initが毎回Netplanに干渉してDNS上書きしていた問題を解消することができました。参考になれば幸いです。
