メインコンテンツへスキップ
kt-tech.blog

【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のインストール

Bash
sudo apt update
sudo apt install systemd-resolved

systemd-resolvedの起動

Bash
sudo systemctl start systemd-resolved
sudo systemctl enable systemd-resolved

シンボリックリンクの確認

Bash
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Tips
リンク先には resolv.confstub-resolv.conf の2つがあります。既定は後者で、127.0.0.53 を経由して systemd-resolved が名前解決します(キャッシュや DNSSEC が効く)。今回張っている resolv.conf は実際の DNS サーバーの IP が直接書かれるもので、127.0.0.53 を理解しないコンテナやツールがある環境ではこちらが無難です。あとで出てくる resolvectl statusresolv.conf modeuplink になっていれば、この状態です。

resolvectlコマンドの使用

Bash
resolvectl status

DNS設定の編集

Bash
sudo vi /etc/netplan/01-netcfg.yaml
注意
パスは /etc/netplan/ です。~/etc/netplan/ と書くとホームディレクトリ配下を見にいってしまい、新規ファイルができるだけで設定が反映されません。ファイル名も環境によって 00-installer-config.yaml などと異なるので、ls /etc/netplan/ で実在するファイルを確認してから編集してください。
JavaScript
network:
  version: 2
  ethernets:
    enp0s1:
      dhcp4: yes
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4

権限設定

Bash
sudo chmod 600 /etc/netplan/01-netcfg.yaml

Netplanの設定を再適用

Bash
sudo netplan apply
Tips
SSH 越しにリモートのサーバーをいじるときは、sudo netplan try のほうが安全です。設定を適用したうえで 120 秒以内に Enter を押さなければ自動で元に戻るので、設定を間違えて接続が切れても復旧します。

最終確認

Bash
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 を無視させます。
JavaScript
dhcp4: yes
dhcp4-overrides:
  use-dns: no

まとめ

DNS の設定は、「なぜか通信できない」の原因として見落としがちなところです。ポイントは次の3点でした。

  • /etc/resolv.conf を直接編集しても戻る。上流の netplan に書く
  • パスは /etc/netplan/。ファイル名は環境によって違うので ls で確認する
  • 反映確認は resolvectl statusLink 側を見る

参考リンク

更新履歴

  1. netplan 設定のコードブロックの言語指定が javascript になっていたのを yaml に修正し、編集先のファイルパスをキャプションに追加。「環境」節にインターフェース名の確認方法を追記。
  2. 設定が反映されるまでの流れを図解で追加。ハマりどころ(パス・DHCP 由来の DNS・netplan try)と resolvectl の読み方を Tips として追記
  3. netplan 設定ファイルのパスの誤りを修正。Ubuntu 26.04 LTS でも同手順であることを追記。コードブロックの言語指定を bash に修正