Chapter 06

参照するフルサービスリゾルバを変更しよう

参照するフルサービスリゾルバ(キャッシュDNSサーバ、再帰的DNSサーバ)を192.168.10.1から192.168.10.2に変更する方法をいくつか紹介します。後ろで紹介する方法ほどおすすめです。

詳細はArch Wikiを参照してください。

/etc/resolv.confを直接書き換える

非推奨です

$ cat /etc/resolv.conf
...
nameserver 192.168.10.1
$ vim /etc/resolv.conf
$ cat /etc/resolv.conf
...
nameserver 192.168.10.2

NetworkManager vs systemd-networkd

おそらくあなたの環境でネットワーク設定を管理しているのは、NetworkManagerまたはsystemd-networkdでしょう。

どちらかが起動してあるはずなので、確認しましょう

$ systemctl status NetworkManager
● NetworkManager.service - Network Manager
     Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: disabled)
    Drop-In: /usr/lib/systemd/system/NetworkManager.service.d
             └─NetworkManager-ovs.conf
     Active: active (running) since Mon 2021-03-29 19:27:54 JST; 41min ago
       Docs: man:NetworkManager(8)
   Main PID: 5115 (NetworkManager)
      Tasks: 3 (limit: 19063)
     Memory: 6.8M
     CGroup: /system.slice/NetworkManager.service
             └─5115 /usr/bin/NetworkManager --no-daemon
	     
$ systemctl status systemd-networkd
● systemd-networkd.service - Network Service
     Loaded: loaded (/usr/lib/systemd/system/systemd-networkd.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
TriggeredBy: ● systemd-networkd.socket
       Docs: man:systemd-networkd.service(8)

この例では、NetworkManagerが有効になっていました。

どちらを使っても構わないですが、ネームサーバの設定において、違いを知っておく必要があります

  • NetworkManagerは/etc/resolv.confを書き換えることがある
  • systemd-networkdは/etc/resolv.confを書き換えない

systemd-networkdは/etc/resolv.confを書き換えないにも関わらず、どのようにしてDNSクライアントが参照するフルサービスリゾルバを変更するのか、疑問に思うかもしれません。

この疑問は次章で解決するはずです。
systemd-networkdを有効にする場合、同時にsystemd-resolvedを動かす必要があります。

NetworkManagerを有効にする場合、systemd-resolvedを使っても使わなくても良いです。systemd-resolvedを推奨される動作モードで動かしていると、NetworkManagerは/etc/resolv.confを書き換えません。

NetworkManager経由による変更

systemd-networkdが無効になっていて、NetworkManagerが有効になっている場合を考えます。

/etc/resolv.confGenerated by NetworkManagerと記述されていたとします

$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.10.1

このとき、/etc/resolv.confを直接書き換えてもNetworkManagerが再起動後に上書きしてしまうことがあります。

そこで、NetworkManagerのDNS設定を変更し、再起動をすることで、/etc/resolv.confが変更されるようにします。

$ nmcli
eno1: connected to System eno1
   ...
   ip4 default
   inet4 192.168.10.5/24
   route4 0.0.0.0/0
   route4 192.168.10.0/24
DNS configuration:
   servers: 192.168.10.1
   domains: example.com
   interface: eno1

eno1: connected to System eno1System eno1がデバイス名となります

DNS設定を以下のように変更し、再起動します
場合によっては、DHCPによるDNSサーバ設定を無効にする必要があります

$ sudo nmcli con mod "System eno1" ipv4.ignore-auto-dns yes
$ sudo nmcli con mod "System eno1" ipv4.dns "192.168.10.2"
$ sudo systemctl restart NetworkManager
$ nmcli
eno1: connected to System eno1
   ...
   ip4 default
   inet4 192.168.10.5/24
   route4 0.0.0.0/0
   route4 192.168.10.0/24
DNS configuration:
   servers: 192.168.10.2
   domains: example.com
   interface: eno1
$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.10.2

nmcliを叩くのではなく、ifcfg ファイルを使って設定する方法もあります

コマンドを実行する代わりに、設定ファイルを書いてそれを適用することは、「Infrastructure as Codeによるインフラ構築の自動化」の足がかりとなるため、より推奨されます。

詳しくはRedHatのドキュメントを参照してください

CentOSなどではNetworkManagerがデフォルトになっているので、RedHatのドキュメントが充実しています

systemd-networkd経由による変更

NetworkManagerが無効になっていて、systemd-networkdが有効になっている場合を考えます。

詳しくはArch Wiki を参照してください。

netplanを使う

Ubuntuではnetplan がネットワーク設定に使われるようになりました。

netplanは、内部でNetworkManagerまたはsystemd-networkdの設定を生成して反映しているだけです。

設定を/etc/netplan/*.yamlに書いて

$ sudo netplan apply

をすれば適用されます。

https://netplan.io/examples/ を設定の参考として載せておきます

rendererはnetworkdまたはNetworkManagerを指定できます

network:
    version: 2
    renderer: networkd
    ethernets:
        enp3s0:
            addresses:
                - 10.10.10.2/24
            gateway4: 10.10.10.1
            nameservers:
                search: [mydomain, otherdomain]
                addresses: [10.10.10.1, 1.1.1.1]