【Ubuntu24.04LTS】DNS永続化設定
技術約5分で読めます

この記事でわかること
- 再起動や DHCP で DNS 設定が戻ってしまう原因と、netplan で永続化する方法
- /etc/resolv.conf を systemd-resolved に管理させるシンボリックリンクの張り方
- resolvectl status で設定が実際に効いているかを確かめる方法
Ubuntu 24.04 LTS または 26.04 LTS / sudo 権限 / netplan を使う構成(Ubuntu 18.04 以降の既定)
概要
この記事では Ubuntu 24.04 LTS の初期設定で、DNS の設定を永続化する手順をまとめています。
/etc/resolv.conf を直接編集しても、再起動や DHCP の再取得で元に戻ってしまいます。Ubuntu 18.04 以降は netplan と systemd-resolved がネットワーク設定を管理しており、/etc/resolv.conf はその結果が書き出されるだけのファイルだからです。
つまり永続化したければ、上流である netplan に書く必要があります。
flowchart TD
A["netplanの設定"] -->|apply| B["systemd-resolved"]
F["DHCP"] -.->|未設定なら上書き| B
B -->|生成| C["resolve/resolv.conf"]
C -.->|リンク| D["/etc/resolv.conf"]
D --> E["アプリの名前解決"]
編集すべきは一番上の netplan の設定ファイルで、/etc/resolv.conf は一番下流の「出力結果」です。この記事では、この流れを上から順に作っていきます。
環境
- OS: Ubuntu 24.04 LTS
- 仮想化: UTM
- インターフェース名:
enp0s1(環境によって違うのでip aで確認)
ポイント
この手順は Ubuntu 26.04 LTS(Resolute Raccoon、2026年4月リリース)でも同じです。netplan と systemd-resolved の組み合わせは Ubuntu 18.04 以降の推奨方法で、現在も変わっていません。
手順
systemd-resolvedのインストール
sudo apt update
sudo apt install systemd-resolvedsystemd-resolvedの起動
sudo systemctl start systemd-resolved
sudo systemctl enable systemd-resolvedシンボリックリンクの確認
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.confTips
リンク先には
resolv.conf と stub-resolv.conf の2つがあります。既定は後者で、127.0.0.53 を経由して systemd-resolved が名前解決します(キャッシュや DNSSEC が効く)。今回張っている resolv.conf は実際の DNS サーバーの IP が直接書かれるもので、127.0.0.53 を理解しないコンテナやツールがある環境ではこちらが無難です。あとで出てくる resolvectl status の resolv.conf mode が uplink になっていれば、この状態です。resolvectlコマンドの使用
resolvectl statusDNS設定の編集
sudo vi /etc/netplan/01-netcfg.yaml注意
パスは
/etc/netplan/ です。~/etc/netplan/ と書くとホームディレクトリ配下を見にいってしまい、新規ファイルができるだけで設定が反映されません。ファイル名も環境によって 00-installer-config.yaml などと異なるので、ls /etc/netplan/ で実在するファイルを確認してから編集してください。network:
version: 2
ethernets:
enp0s1:
dhcp4: yes
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4権限設定
sudo chmod 600 /etc/netplan/01-netcfg.yamlNetplanの設定を再適用
sudo netplan applyTips
SSH 越しにリモートのサーバーをいじるときは、
sudo netplan try のほうが安全です。設定を適用したうえで 120 秒以内に Enter を押さなければ自動で元に戻るので、設定を間違えて接続が切れても復旧します。最終確認
resolvectl status
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: uplink
Link 2 (enp0s1)
Current Scopes: DNS
Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
DNS Servers: 8.8.8.8 8.8.4.4 192.168.64.1 fe80::6c7e:67ff:fead:cf64
Link 3 (docker0)
Current Scopes: none
Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported見るべきは Global ではなく、実際に使っているインターフェース(ここでは Link 2 (enp0s1))の DNS Servers です。Global が空でも、Link 側に出ていれば名前解決は動きます。Current Scopes: DNS になっていれば、そのリンクが DNS を引ける状態です。
注意
設定したはずの DNS の後ろに、覚えのない IP が並ぶことがあります。上の実行例でも、指定していない
192.168.64.1 が付いています。これは DHCP が配ってきた DNS が追加されているためです。指定したものだけを使いたい場合は、netplan 側で DHCP 由来の DNS を無視させます。dhcp4: yes
dhcp4-overrides:
use-dns: noまとめ
DNS の設定は、「なぜか通信できない」の原因として見落としがちなところです。ポイントは次の3点でした。
/etc/resolv.confを直接編集しても戻る。上流の netplan に書く- パスは
/etc/netplan/。ファイル名は環境によって違うのでlsで確認する - 反映確認は
resolvectl statusの Link 側を見る
参考リンク
更新履歴
- netplan 設定のコードブロックの言語指定が javascript になっていたのを yaml に修正し、編集先のファイルパスをキャプションに追加。「環境」節にインターフェース名の確認方法を追記。
- 設定が反映されるまでの流れを図解で追加。ハマりどころ(パス・DHCP 由来の DNS・netplan try)と resolvectl の読み方を Tips として追記
- netplan 設定ファイルのパスの誤りを修正。Ubuntu 26.04 LTS でも同手順であることを追記。コードブロックの言語指定を bash に修正


