Как настроить мой DNS, если файл resolv.conf перезаписывается?

Вопрос или проблема

Большинство информации, которую я нахожу в интернете, говорит редактировать /etc/resolv.conf, но все изменения там просто перезаписываются.

$ cat /etc/resolv.conf 
# Файл resolv.conf(5) для glibc resolver(3), созданный resolvconf(8)
#     НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ ВРУЧНУЮ --
#     ВАШИ ИЗМЕНЕНИЯ БУДУТ ПЕРЕЗАПИСАНЫ
nameserver 127.0.1.1

Видимо, 127.0.1.1 — это локальный экземпляр dnsmasq. Документация dnsmasq говорит редактировать /etc/resolv.conf. Я пытался добавить пользовательские DNS-серверы в /etc/resolv.conf.d/base, но изменения не отразились в /etc/resolv.conf после выполнения sudo resolvconf -u.

К вашему сведению, я не хочу изменять DNS для каждого подключения отдельно, я хочу установить настройки DNS по умолчанию для всех подключений, если не указано иное.

ОБНОВЛЕНИЕ:

Я сам ответил на этот вопрос:
https://unix.stackexchange.com/a/163506/67024

Я считаю, это наилучшее решение, потому что:

  1. Оно работает.
  2. Требует минимальных изменений.
  3. Сохраняет работу с кешем DNS в dnsmasq, а не обходит его.

Я считаю, если вы хотите изменить DNS-сервер, то просто добавьте строку подобную этой в ваш файл base в resolv.conf.d.

Пример

ПРИМЕЧАНИЕ: Перед тем как начать, убедитесь, что установлен следующий пакет, apt install resolvconf.

$ sudo vim /etc/resolvconf/resolv.conf.d/base

Затем добавьте список ваших DNS-серверов следующим образом:

nameserver 8.8.8.8
nameserver 8.8.4.4

Наконец, обновите resolvconf:

$ sudo resolvconf -u

Если вы посмотрите на man страницу для resolvconf, в ней описаны различные файлы в /etc/resolvconf/resolv.conf.d/.

   /etc/resolvconf/resolv.conf.d/base
          Файл, содержащий базовую информацию о резолвере. Строки в этом 
          файле включаются в конфигурационный файл резолвера даже 
          если никакие интерфейсы не настроены.

   /etc/resolvconf/resolv.conf.d/head
          Файл, который добавляется в начало динамически сгенерированного 
          конфигурационного файла резолвера. Обычно это просто строка
          комментария.

   /etc/resolvconf/resolv.conf.d/tail
          Файл, который добавляется в конец динамически сгенерированного 
          конфигурационного файла резолвера. Чтобы ничего не добавлять, 
          сделайте этот файл пустым. Этот файл — хорошее место для добавления
          строки с опциями резолвера, если это необходимо, например,

              options inet6

Несмотря на предупреждение в начале файла head:

$ cat /etc/resolvconf/resolv.conf.d/head
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ ВРУЧНУЮ -- ВАШИ ИЗМЕНЕНИЯ БУДУТ ПЕРЕЗАПИСАНЫ

это предупреждение существует для того, чтобы в процессе создания этих файлов, оно в конце концов попадало в результирующий файл resolv.conf, который будет создан на основе этих файлов. Вы также можете добавить строки nameserver, описанные выше для файла base, в файл head.

Ссылки

Я тоже интересуюсь этим вопросом и попробовал предложенное решением от @sim.

Для проверки я вставил

nameserver 8.8.8.8

в /etc/resolvconf/resolv.conf.d/base и

nameserver 8.8.4.4

в /etc/resolvconf/resolv.conf.d/head

Потом я перезапустил сеть с помощью

sudo service network-manager restart

Результат таков, что /etc/resolv.conf выглядит как

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ ВРУЧНУЮ -- ВАШИ ИЗМЕНЕНИЯ БУДУТ ПЕРЕЗАПИСАНЫ
nameserver 8.8.4.4
nameserver 127.0.1.1

и nm-tool отображает следующие DNS-серверы:

DNS:             208.67.222.222
DNS:             208.67.220.220

которые предоставляются моим роутером.
С другой стороны, проверка адреса с помощью dig показывает, что

;; Query time: 28 msec
;; SERVER: 8.8.4.4#53(8.8.4.4)

Если я прав, я делаю вывод из всего этого, что

  1. только часть “head” читается resolvconf: часть “base” каким-то образом контролируется dnsmasq
  2. dns-server фактически принудительно задан на 8.8.4.4 независимо от сервера, предоставленного DHCP, НО вы теряете кеширование, предоставляемое dnsmasq, поскольку запрос всегда отправляется на 8.8.4.4
  3. dnsmasq все еще использует ТОЛЬКО dns-сервер, предоставленный DHCP.

В итоге это работает, но я не думаю, что это был запрашиваемый результат.
Более близким решением может быть следующее. Отредактируйте

sudo vim /etc/dhcp/dhclient.conf

затем добавьте

supersede domain-name-servers 8.8.8.8;

Результат такой: В resolv.conf указано только 127.0.0.1, что означает, что вызывается кеширование dnsmasq, а nm-tool говорит

DNS:             8.8.8.8

что означает, что если искомое имя не находится в кеше, то запрос отправляется на 8.8.8.8, а не на сервер, предоставляемый DHCP.

Другим (возможно, лучшим) вариантом является использование “prepend” вместо “supersede”: таким образом, если имя не разрешается 8.8.8.8, то запрос возвращается на другой сервер. Фактически, nm-tool говорит

DNS:             8.8.8.8    
DNS:             208.67.222.222
DNS:             208.67.220.220

Я выяснил, что вы можете изменить серверы имен, которые использует dnsmasq, добавив следующие строки в файл /etc/dnsmasq.conf:

server=8.8.8.8
server=8.8.4.4

Однако у меня не было файла /etc/dnsmasq.conf, так как он устанавливается пакетом dnsmasq, а Ubuntu поставляется только с dnsmasq-base. Я выполнил sudo apt-get install dnsmasq, затем отредактировал /etc/dnsmasq.conf, затем sudo service dnsmasq restart и sudo service network-manager restart.

Я выполнил sudo tail -n 200 /var/log/syslog, чтобы проверить syslog и убедиться, что dnsmasq использует указанные мной серверы имен:

Oct 21 23:00:54 mylaptop dnsmasq[8611]: using nameserver 8.8.8.8#53
Oct 21 23:00:54 mylaptop dnsmasq[8611]: using nameserver 8.8.4.4#53

Для статического IP, руководство по серверу Ubuntu говорит изменить файл /etc/network/interfaces, который может выглядеть так:

iface eth0 inet static
address 192.168.3.3
netmask 255.255.255.0
gateway 192.168.3.1
dns-search example.com
dns-nameservers 192.168.3.45 192.168.8.10

Измените IP-адреса 192.168.3.45 192.168.8.10 на те, которые вы хотите, например, 8.8.8.8

https://help.ubuntu.com/14.04/serverguide/serverguide.pdf
Страница 38

  1. Найдите ‘Подключение к сети’

  2. Откройте его

                        enter image description here

  3. Затем выберите либо WiFi, либо Ethernet, или что бы вы ни использовали, и нажмите “редактировать”. Вы увидите следующее:

                  enter image description here

  4. Выберите вкладку ipv4

  5. Выберите метод “только адреса”

  6. Введите свое DNS-имя ниже и сохраните его

  7. Готово

Быстрое и грязное решение, которое еще не упоминалось, — это установка неизменяемого флага на файл resolv.conf сразу после его редактирования.

$ sudo nano /etc/resolv.conf

Добавьте это и сохраните:

nameserver 8.8.8.8

Затем выполните:

$ sudo chattr +i /etc/resolv.conf

Это должно решить проблему. Я делаю это на своей системе тоже.

Моя проблема была немного другой, я хотел переопределить DNS-серверы моего роутера. Я нашел эту ссылку от Ubuntu: https://wiki.ubuntu.com/OverrideDNSServers

Там говорится:
Если вы хотите переопределить настройки DNS, предоставленные вашим DHCP сервером, откройте

/etc/dhcp3/dhclient.conf

и добавьте следующую строку:

supersede domain-name-servers <dns_ip_address1>,<dns_ip_address2>;

заменяя <dns_ip_address*> на соответствующие значения.

Попробуйте добавить dns-nameservers XXX.XXX.XXX.X в файл /etc/networking/interfaces.

Может, я что-то упустил, но согласно инструкциям по настройке на https://help.ubuntu.com/14.04/serverguide/network-configuration.html все что нужно сделать — это обновить следующее. Я не использую прокси – просто машина за фаерволом и локальный DNS (в примере показан DNS от Google, но установите его на нужные вам значения).

nano /etc/network/interfaces

По умолчанию:

# Этот файл...
# и как его активировать...

# Циклический интерфейс...
auto local
iface lo inet loopback

# Основной сетевой интерфейс 
auto eth0
iface eth0 inet dhcp

ОБНОВЛЕНИЕ:

# Этот файл...
# и как его активировать...

# Циклический интерфейс...
auto local
iface lo inet loopback

# Основной сетевой интерфейс 
#iface eth0 inet dhcp
iface eth0 inet static
address x.x.x.x
netmask 255.255.255.0
gateway x.x.x.x

#nameservers
# Возможно, dns-search не потребуется
# Я использую его, так как моя сеть основана на Windows 
# поэтому это полезно
# dns-search x.y 
dns-nameservers 4.4.4.4 8.8.8.8

Перезагрузитесь, если можете.

Существует два метода

Метод 1

Сервер DNS для использования можно изменить, обновив файл head в директории resolv.conf.d

$ echo 'nameserver 1.1.1.1' | sudo tee /etc/resolvconf/resolv.conf.d/base

затем выполните

$ sudo resolvconf -u

Вышеописанное сгенерирует общий файл resolv.conf в директории /etc. Все ваши запросы на разрешение адресов будут отправляться на указанный сервер имен. Решено.

Однако у этого есть последствия. При использовании resolvconf для прямого запроса 1.1.1.1 на разрешение адресов, теряется возможность кэширования, предоставляемая dnsmasq. Каждый запрос будет отправляться на 1.1.1.1

Метод 2

Если вы не хотите этого и использовать dnsmasq для разрешения DNS, обратитесь к этому ответу. Ответ описан здесь простым образом.

Добавьте следующее содержимое в файл /etc/dnsmasq.conf.

server=1.1.1.1

Затем перезапустите службу dnsmasq

$ sudo systemctl restart dnsmasq.service

Все будет работать нормально. Решено.

Некоторые из ответов здесь работают нормально. Однако мне не нравилось, что надо вручную редактировать конфигурационные файлы, чтобы установить “правильный” DNS, который я уже получаю через DHCP с помощью NetworkManager.

Я немного покопался и заметил, что файл /etc/resolv.conf на самом деле является ссылкой и указывает на /run/systemd/resolve/stub-resolv.conf. После некоторых экспериментов оказалось, что в директории /run/systemd/resolve/ содержится еще один файл resolv.conf, который уже содержит настройки, которые вы получили через DHCP. Таким образом, вместо того чтобы вручную перезаписывать/создавать конфигурационные файлы в /etc/, вы можете просто снова привязать /etc/resolv.conf к файлу /run/systemd/resolve/resolv.conf, и все должно быть в порядке:

# sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

Теперь вы должны быть в состоянии редактировать настройки даже из Network Manager в Gnome. 🙂

Не уверен, что это будет работать на более старых версиях Ubuntu, но на Ubuntu 17.10 это работает.

Примечание: Как и большинство ответов, этот предполагает использование NetworkManager. Однако, в отличие от большинства других ответов, он не предполагает использование resolvconf, dhclient или чего-либо еще — будьте внимательны, они могут вмешаться (см. обновление).

Учитывая количество просмотров этого вопроса, невероятно, что это решение из 8 символов еще не было озвучено: согласно man NetworkManager.conf,

dns: […] none: NetworkManager не будет изменять resolv.conf. Это подразумевает rc-manager unmanaged

Поэтому добавьте

dns=none

в секцию [main] файла /etc/NetworkManager/NetworkManager.conf, затем перезапустите NetworkManager, и он больше не будет модифицировать /etc/resolv.conf.

Обратите внимание, что настройка rc-manager=unmanaged должна быть эквивалентна dns=none, а установка rc-manager=symlink вместе с наличием /etc/resolv.conf в виде символической ссылки может быть лучшей идеей (прочтите вышеупомянутую man страницу).

Обновление:

После того как NetworkManager перестал перезаписывать /etc/resolv.conf, я выяснил, что dhcpcd уже заменят /etc/resolv.conf на бесполезный пустой файл при загрузке. Manpage dhcpcd.conf помог, достаточно добавить

nohook resolv.conf

в ваш dhcpcd.conf (мой находится в /etc/dhcpcd.conf).

РЕДАКТИРОВАНО 6 МАЯ

Я написал скрипт для обновления всех настроек соединений в директории /etc/Network-Manager/system-connections/. GUI, который вы используете для редактирования отдельных соединений, редактирует конкретный файл в этой директории. Скрипт обновляет все файлы – он просто ищет те, у которых не установлен DNS, с помощью grep и устанавливает его с помощью awk.

Поскольку для доступа к этим файлам требуется sudo доступ, выполните этот скрипт с sudo, а затем перезапустите Network Manager

#!/bin/bash
# Автор: Серёга Коло
# Дата: 6 мая 2015 года
# Описание: этот скрипт проверяет все настройки соединений в 
# /etc/NetworkManager/system-connections/ , и если DNS не установлен,
# этот скрипт устанавливает его;
# ПРИМЕЧАНИЕ: выполните sudo service network-manager restart после выполнения этого скрипта

set -x

for file in /etc/NetworkManager/system-connections/* ; do
        grep 'dns=208.67.220.220;' "$file"  || ( awk '{print;if ($1=="[ipv4]"){getline; print "method=auto\ndns=208.67.220.
220;\nignore-auto-dns=true"}}' "$file" > .tmpfile && ( cat .tmpfile > "$file") )
done

Скрипт в действии:

enter image description here

ОРИГИНАЛЬНЫЙ ПОСТ
Некоторые пользователи здесь отметили, что DNS как-то контролируется dnsmasq. Это действительно так. Я столкнулся с несколько меньшей проблемой, когда, как бы я ни менял head или body в /etc/resolvconf/resolv.conf.d , мой компьютер не мог фактически получить доступ к интернету по доменному имени – работало только с IP-адресами.

Я отредактировал файл /etc/NetworkManager/NetworkManager.conf. Изначально там было dns=dnsmasq, но я изменил на: dns=208.67.222.222. Хотя таким образом nm-tool не указывает 208.67.222.222, я все равно смог использовать доменные имена, а не только IP-адреса.

Вот как сейчас выглядит мой файл NetworkManager.conf:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq
dns=208.67.222.222

[ifupdown]
managed=false

ПРИМЕЧАНИЕ: Для более подробной информации о моей проблеме и этом решении, обратитесь к моему посту на askubuntu.com.

ОБНОВЛЕНИЕ №1

Вернувшись домой после учебы сегодня, я обнаружил, что не могу подключиться к домашней WiFi сети. Я немного почитал man NetworkManager.conf и выяснил, что dns= в [main] на самом деле строка для плагинов, поэтому строка dns=dnsmasq на самом деле добавляет плагин dnsmasq в NetworkManager, видимо.

Таким образом, мое решение все еще сработало, просто не так, как я ожидал. Вот отрывок из man страницы:

dns=plugin1,plugin2, ... Список имен плагинов DNS через ','.

Плагины DNS используются для предоставления функциональности локального
кеширующего сервер имен (что ускоряет DNS-запросы) и для передачи
данных DNS приложениям, которые их используют.

Таким образом, установив dns=208.67.222.222, я, возможно, фактически помешал NetworkManager использовать этот плагин, который иначе использовал бы локальный DNS сервер (который, как оказалось, не работал).

Это связано с тем, что какое-то установленное приложение управляет этим файлом.
Вы можете либо удалить это приложение, либо задать желаемые параметры напрямую через это приложение.

В моем случае (Linux centos7 минимальный сервер) я получал # Generated by NetworkManager в начале файла resolv.conf, поэтому лучший способ, которым я мог изменить эту опцию, был использование команды

nmtui

. Вы можете редактировать серверы имен в этом инструменте, и когда вы изменяете параметры networkmanager с помощью этой утилиты, они будут автоматически применены к /etc/resolv.conf после перезагрузки. Здесь вы можете найти больше информации.

На Centos 7, при использовании NetworkManager, самое чистое, постоянное и работоспособное решение, которое я смог найти, это создать скрипт для NetworkManager, который использует nmcli для установки нужных мне значений.

Например:

Создайте /etc/NetworkManager/dispatcher.d/mydns.sh с правами 755 и следующим содержимым:

#!/usr/bin/sh

if [ $1 == "enp0s11" -a $2 == "up" ]
then
        echo "Установка моего DNS ($1 is $2)" | logger

        # отключение DNS по умолчанию
        nmcli device mod enp0s11 ipv4.ignore-auto-dns yes

        # Замена на наш собственный DNS, в нужном порядке
        nmcli device mod enp0s11 ipv4.dns "10.0.1.101 10.0.1.1"
fi

И для теста, без перезагрузки:

systemctl restart NetworkManager.service
cat /etc/resolv.conf

Ваша конфигурация может отличаться, но это единственный способ, который я нашел, чтобы мой /etc/resolv.conf ‘пережил’ перезагрузку без перезаписи нежелательными значениями.

Ничто в интернете мне не помогло, потому что утилита CLI от NordVPN постоянно перезаписывала /etc/resolv.conf каждый раз при подключении и отключении от VPN. Она даже переопределила chattr +i, что было очень раздражающим!!

Что помогло мне, это полностью отключить resolvconf!

Отредактируйте /etc/resolvconf.conf и сделайте это единственным элементом:

resolvconf=NO

Это специально отключает resolvconf, то есть ваш /etc/resolv.conf больше не будет изменяться. Затем выполните sudo chattr +i /etc/resolv.conf для уверенности.

Проверено на Arch Linux.

https://man.archlinux.org/man/resolvconf.conf.5#resolvconf

Легкий способ изменить DNS:

$ sudo nano /etc/network/interfaces

Если возникнут проблемы, установите nano:

$ sudo apt-get install nano -y

затем ..

  1. найдите это: dns-nameservers
  2. если не найдёте, просто введите его
  3. Я сделал следующее: dns-nameservers 199.85.126.10 199.85.127.10

Я надеюсь, что это лучший способ, я сделал это на VPS, кстати.

выполняя от имени root:

  1. ознакомьте dns=dnsmasq в файле /etc/NetworkManager/NetworkManager.conf
  2. добавьте supersede domain-name-servers 4.2.2.1,4.2.2.3,4.2.2.5,4.2.2.4,4.2.2.1,4.2.2.2; в конце /etc/dhcp/dhclient.conf
  3. sudo service network-manager restart

Следующее действие вносит изменения, показанные выше:

$ sudo sed -i 's/dns\x3Ddnsmasq/\x23dns\x3Ddnsmasq/' \
   /etc/NetworkManager/NetworkManager.conf

$ echo 'supersede domain-name-servers 4.2.2.1,4.2.2.3,4.2.2.5,4.2.2.4,4.2.2.1,4.2.2.2;' | \
   sudo tee --append /etc/dhcp/dhclient.conf

$ sudo service network-manager restart

Подождите 7-10 секунд, чтобы закончился процесс перезапуска, проверьте вашу конфигурацию с помощью
“nslookup nist.gov”. Работает хорошо на Ubuntu LTS 14.04.

.

Ответ или решение

Если вы столкнулись с проблемой перезаписи файла /etc/resolv.conf и хотите установить DNS по умолчанию для всех подключений, не изменяя его вручную, есть несколько методов для решения этой задачи. Ваш вопрос касается настройки DNS-серверов, когда resolv.conf управляется системой, такой как resolvconf или NetworkManager. Приведём детализированное руководство по этому вопросу.

Основные причины и решения

  1. resolvconf: Использование базовых файлов конфигурации

    Если ваша система использует resolvconf для управления resolv.conf, изменения напрямую в этом файле будут перезаписаны. Вместо этого вам следует использовать файлы конфигурации в каталоге /etc/resolvconf/resolv.conf.d/. Добавьте свой DNS-сервер в файл base:

    sudo nano /etc/resolvconf/resolv.conf.d/base
    nameserver 8.8.8.8
    nameserver 8.8.4.4

    Обновите конфигурацию:

    sudo resolvconf -u
  2. Настройка dnsmasq

    Если используется dnsmasq, вы можете задать DNS-серверы через конфигурационный файл dnsmasq:

    sudo nano /etc/dnsmasq.conf

    Добавьте строки:

    server=8.8.8.8
    server=8.8.4.4

    Перезапустите службу:

    sudo systemctl restart dnsmasq
  3. Изменение dhclient.conf

    Если ваша система получает DNS через DHCP, измените конфигурацию клиента DHCP:

    sudo nano /etc/dhcp/dhclient.conf

    Добавьте или измените строку:

    supersede domain-name-servers 8.8.8.8, 8.8.4.4;

    Это будет приоритетным источником DNS-серверов, получаемых через DHCP.

  4. Переключение NetworkManager на статический режим

    Если NetworkManager управляет вашими сетевыми подключениями:

    sudo nano /etc/NetworkManager/NetworkManager.conf

    Найдите строку dns=dnsmasq и закомментируйте её или измените на dns=none. Это предотвратит модификации в resolv.conf:

    dns=none

    Перезапустите NetworkManager:

    sudo systemctl restart NetworkManager

Заключение

Учитывая вышеупомянутые методы, выбор подходящего решения зависит от вашей системы и предпочтений в использовании кэширующего DNS-резолвера, такого как dnsmasq. Всегда учитывайте возможные влияния на производительность и удобство пользователей при внесении изменений в системные конфигурации. Надеемся, что это руководство поможет вам успешно настроить DNS по умолчанию, не теряя при этом функциональность, предоставляемую системой.

Оцените материал
Добавить комментарий

Капча загружается...