定時帰る術-DNS設定が有効にならないけど、なぜ

最近、まだ面白いことが発見したので、投稿させてもらう。
記事タイトルの通り、「/etc/resolv.conf」をいじっても、OSが再起動されたら、設定が戻ってしまうことが分かった。
早速見てみよう


# 作業流れ
ご覧の通り、「vi」で「/etc/resolv.conf」の中身を変更して、OSを再起動したら、「/etc/resolv.conf」の設定が元に戻った
```
[root@rasp ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.1
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# cp -pv /etc/resolv.conf /etc/resolv.conf_0123
'/etc/resolv.conf' -> '/etc/resolv.conf_0123'
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# ll /etc/resolv.conf*
-rw-r--r-- 1 root root 53  6月 22  2018 /etc/resolv.conf
-rw-r--r-- 1 root root 53  6月 22  2018 /etc/resolv.conf_0123
[root@rasp ~]# vi /etc/resolv.conf
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# reboot
Last login: Tue Jan 23 07:09:54 2024 from 192.168.1.67
[root@rasp ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.
[root@rasp ~]#
```
# 犯人さがす

「/etc/resolv.conf」に「# Generated by NetworkManager」が記載されているのが気になって、「NetworkManager」経由での変更する方法を調べてみました。
「nmcli」で変更できるなんて知らなかった。
## やってみよう
「nmcli」でやってみると、うまくいけた。
```
[root@rasp ~]# nmcli c mod eth0 ipv4.dns 8.8.8.8
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# nmcli c u eth0
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
Last login: Tue Jan 23 07:16:56 2024 from 192.168.1.67
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
```
## 原因（推測）
①デフォルトの場合は、「/etc/resolv.conf」が「NetworkManager」より管理されている
②「nmcli c mod eth0 ipv4.dns 8.8.8.8」で実行することで、「/run/NetworkManager/resolv.conf」が更新される。
③「nmcli c u eth0」で、「cp -p /run/NetworkManager/resolv.conf /etc/resolv.conf」のような処理が実行される

# 「vi」で変更した対応方法

## 「/etc/resolv.conf」を「NetworkManager」の管理から外す
「/run/NetworkManager/resolv.con」が更新されたが、「/etc/resolv.conf」が更新されないことがかくにんできたので、「原因（推測）」の「③」があっているきがする。
この状態で、「vi」で「/etc/resolv.conf」を変更すれば、「原因（推測）」の「③」が実行されないので、OSが再起動されても、「vi」での設定がそのままになる。
```
[root@rasp ~]# vi /etc/NetworkManager/conf.d/90-dns-none.conf
[root@rasp ~]# cat /etc/NetworkManager/conf.d/90-dns-none.conf
[main]
dns=none
[root@rasp ~]# systemctl reload NetworkManager
[root@rasp ~]#
[root@rasp ~]# NetworkManager --print-config | grep dns | grep -v "#"
dns=none
[root@rasp ~]#
[root@rasp ~]#  nmcli c mod eth0 ipv4.dns 1.1.1.1
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# nmcli c u eth0
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@rasp ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# cat /run/NetworkManager/resolv.conf
# Generated by NetworkManager
nameserver 1.1.1.1
```

##　リンクをはる
「/etc/resolv.conf」がリンクになっている場合、↑と同じく「原因（推測）」の「③」が実行されなくなり、「vi」での変更が保存される。

```
[root@rasp ~]# mv -v /etc/resolv.conf /etc/resolv.conf.manually-configured
renamed '/etc/resolv.conf' -> '/etc/resolv.conf.manually-configured'
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# ln -s /etc/resolv.conf.manually-configured /etc/resolv.conf
[root@rasp ~]# rm -rf /etc/NetworkManager/conf.d/90-dns-none.conf
[root@rasp ~]# systemctl reload NetworkManager
[root@rasp ~]# NetworkManager --print-config | grep dns | grep -v "#"
[root@rasp ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
[root@rasp ~]#  nmcli c mod eth0 ipv4.dns 1.1.1.2
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]#
[root@rasp ~]# nmcli c u eth0
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@rasp ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
[root@rasp ~]# cat /run/NetworkManager/resolv.conf
# Generated by NetworkManager
nameserver 1.1.1.2
```
# 最後
## DNS変更方法
「vi」で「/etc/resolv.conf」を変更したい場合は、↓の「①」も「②」も公式の方法となり、どっちでも使えると思われる。そもそも「nmcli」でもいいかきがする。
（nmcliで設定変更を実施する場合、NICをアップする必要があるので、少し面倒くさいかもしれない。）
①「NetworkManager」の管理から外す
②リンクをはる
## トラブルシューティング
■「vi」で「/etc/resolv.conf」を変更して、有効にならない場合は、↓を確認した方がいいでしょう。
①「NetworkManager」に「dns=none」がちゃんと設定されるのか
```
[root@rasp ~]# NetworkManager --print-config | grep dns | grep -v "#"
dns=none
```
②「/etc/resolv.conf」がリンクになっているのか
```
[root@rasp ~]# ll /etc/resolv.conf
lrwxrwxrwx 1 root root 36  1月 23 07:45 /etc/resolv.conf -> /etc/resolv.conf.manually-configured
```
■「/run/NetworkManager/resolv.conf」も認識して、困ったら見てみよう


以上