Не работает resolv conf ubuntu

Обновлено: 02.07.2024

Стало достаточно традиционным для Linux запускать небольшой локальный DNS-сервер, который ускоряет работу, кешируя ответы на повторяющиеся DNS-запросы. В этом случае в общесистемный /etc/resolv.conf помещается директива nameserver 127.0.0.1 , а ip-адреса внешних DNS-серверов переносятся в настройки локального.

При изменении сетевой конфигурации, запуске и остановке процессов, некоторым программам необходимо динамически изменять файл resolv.conf . При одновременном доступе программы мешают друг другу и сохраняют неверную информацию в файл. Утилита resolvconf действует как посредник между программами, которые предоставляют информацию о сервере имен, и программами, которые используют информацию о сервере имен.

При этом файл resolv.conf заменяется символической ссылкой на /run/resolvconf/resolv.conf и программы используют динамически сгенерированный файл. В системе без службы resolvconf.service файл resolv.conf поддерживается вручную или набором скриптов. И эти скрипты могут мешать друг другу при попытках одновременного доступа к файлу.

Всё работало хорошо, пока не появились NetworkManager и Systemd. Система инициализации Systemd имеет свой собственный резолвер systemd-resolved , запущенный по умолчанию и требующий отдельной настройки. А NetworkManager пытается дружить со всеми — с resolvconf , с Systemd , с наиболее распространёнными DNS-резолверами.

Всё это привело к тому, что теперь в одной системе порт 53 может слушать несколько разных резолверов, причём для избежания конфликтов NetworkManager и systemd-resolved используют вместо 127.0.0.1 другие ip-адреса в loopback-сети:

  • 127.0.0.1 — dnsmasq или unbound с настройками по умолчанию
  • 127.0.1.1 — dnsmasq или unbound , запущенный NetworkManager
  • 127.0.0.53 — systemd-resolved , запущенный по умолчанию

Настройка службы systemd-resolved

В Ubuntu Server эта служба уже установлена и запущена сразу после установки операционной системы. Но если это не так, установить ее несложно:

Следующим шагом будет правка файла /etc/nsswitch.conf — находим строку, которая начинается с hosts :

Эта строка отвечает за последовательность обращений приложения к системным компонентам с целью резолвинга доменного имени. В данном случае сначала программа заглянет в файл /etc/hosts , затем запросит демона systemd-resolved , а потом — к DNS серверам.

Осталось сообщить systemd-resolved ip-адреса DNS-серверов, к которым следует обращаться для резолвинга:

Для целей совместимости с приложениями, которые не используют библиотечные вызовы, а обращаются к DNS-серверам напрямую, получая их ip-адреса из /etc/resolv.conf , следует создать символическую ссылку. Обычно этого не требуется, ссылка уже существует после установки systemd-resolved :

В файле /run/systemd/resolve/stub-resolv.conf указан один-единственный сервер 127.0.0.53 :

Кроме того, можно создать символическую ссылку на /run/systemd/resolve/resolv.conf . Этот файл содержит DNS-сервера, полученные от DHCP-сервера и из файла конфигурации /etc/systemd/resolved.conf . В этом случае локальный кеширующий сервер не используется, что замедлит резолвинг.

Как видите, у меня DNS-серверов получилось слишком много, так что последняя запись может быть проигнорирована. Все готово, остается только разрешить запуск службы при загрузке системы, если это еще не было сделано:

Настройка службы resolvconf.service

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

После установки /etc/resolv.conf будет представлять из себя ссылку на /run/resolvconf/resolv.conf .

При этом исходный файл /etc/resolv.conf (который на самом деле ссылка на /run/systemd/resolve/resolv.conf ) будет сохранен как original в директории /etc/resolvconf/resolv.conf.d/ (чтобы восстановить его при удалении службы resolvconf.service ). В этой же директории есть есть еще три файла — base , head и tail — которые позволяют вручную добавить записи в динамически формируемый /run/resolvconf/resolv.conf .

Теперь добавим пару записей в файл tail (сервера OpenDNS):

Перезагрузим службу и посмотрим сформированный /run/resolvconf/resolv.conf :

Первая запись — это резолвер systemd-resolved , а две другие записи были добавлены в конец resolv.conf из файла tail . Благодаря тому, что первая запись это 127.0.0.53 — резолвинг будет работать быстро, потому что systemd-resolved кеширует ответы DNS-серверов.

Но если мы остановим службу systemd-resolved , резолвинг все равно будет работать, используя сервера 208.67.222.222 и 208.67.220.220 — хотя и гораздо медленнее.

Используем только resolv.conf

Так делать не рекомендуется, потому что резолвинг будет работать медленно, но рассмотрим и этот вариант для полноты картины. Первым делом изменим имя файла /etc/resolv.conf на /etc/resolv.conf.back , а потом создадим свой resolv.conf :

Для Ubuntu Desktop запретим вездесущему NetworkManager вмешиваться в процесс распознавания доменных имен:

Итак, сегодня мы поговорим с вами о настройке DNS в Debian. Тем, кто «в теме», не потребуются объяснения, но для остальных пройдемся от малого. Что такое DNS? Это компьютерная распределенная система для получения информации о доменах. Она используется для получения IP-адреса той самой уютной ЖЖшки, или ВК. Нужна она прежде всего для человека, так как нам, как ни странно, будет проще запомнить адрес в буквенном формате, чем в числовом. Но это не единственный плюс.

Раньше сеть была гораздо меньше нынешней и на каждой машине находился файл hosts, его рассылали автоматически и «централизованно». Он отвечал за преобразование между доменными и IP-адресами, но сеть непрерывно росла, а данный метод уже явно не справлялся с поставленными задачами. Вот здесь и выходит на сцену механизм, способный делать все то же самое и в больших объемах — DNS. С основными определениями разобрались, теперь перейдем к сути статьи.

Настройка DNS в Debian

Сперва мы ознакомимся с файлом /etc/resolv.conf. Это — это основной файл настройки библиотеки распознавателя имен DNS. Распознаватель - это библиотека на языке Cи, именно она обеспечивает доступ к DNS для программ в системе.

Его функции настроены на следующее:

  • На проверку записей в файле /etc/hosts или на нескольких серверах DNS;
  • На использование базы данных хостов NIS (Информационная служба сети);

В современных Linux-системах, которые используют systemd, локальные приложения получают доступ к DNS через демон system-resolved. По умолчанию эта служба имеет четыре различных режима и использует по умолчанию файл-заглушку. Его путь: /run/systemd/resolve/stub-resolv.conf.

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

К сожалению, из-за того, что /etc/resolv.conf не прямо управляется службой systemd-resolved, а иногда с помощью использования initscripts или NetworkManager, любые пользовательские изменения НЕ будут сохранены. С учетом всех сложностей, описанных выше, я хочу поделиться с вами информацией о том, как настроить DNS на Debian в этом злополучном файле /etc/resolv.conf.

Шаг 1. Содержимое /etc/resolv.conf

Чтобы это сделать мы откроем терминал и напишем команду:


В нем мы видим имя сервера nameserver 192.168.1.1 и больше ничего. Это пока что, но мы к нему вернемся.

Шаг 2. Установка resolvconf

Обязательно обновим систему с помощью команды:

sudo apt update


После обновления устанавливаем resolvconf. Для этого пишем команду:

sudo apt install resolvconf


После установки система должна автоматически запустить службу resolvconf.service. Чтобы проверить так ли это вам надо будет использовать команду:

sudo systemctl status resolvconf.service


Здесь мы видим, что служба не запущена, но бывает, что триггер срабатывает автоматически. Так или иначе, нам надо запустить эту службу. Используем следующие команды:

sudo systemctl start resolvconf.service

sudo systemctl enable resolvconf.service

sudo systemctl status resolvconf.service



Как вы поняли, с помощью sudo systemctl start resolvconf.service и sudo systemctl enable resolvconf.service мы запускаем службу, а sudo systemctl status resolvconf.service отобразит состояние активности этой службы.

Шаг 3. Настройка DNS

Теперь откройте файл /etc/resolvconf/resolv.conf.d/head. Делается это с помощью команды:

sudo nano /etc/resolvconf/resolv.conf.d/head

Прекрасно, следующим шагом будет внесение данных в этот файл. Вписываем в него следующие строки так, как это показано на скриншоте:

nameserver 8.8.8.8
nameserver 8.8.4.4


Сохраняем изменения с помощью ctrl+o -> Enter -> ctrl+x. Теперь надо перезагрузить систему, чтобы изменения пришли в действие.

Шаг 4. Проверяем файл /etc/resolv.conf

После перезагрузки снова открываем терминал и пишем команду для запуска службы (это вторичная мера, у меня, например, триггер сработал автоматически):

sudo systemctl start resolvconf.service

Видим, что служба запущена. Переходим в наш конфигурационный файл, который был описан в самом начале статьи. Используем команду:


На скриншоте отображены те самые данные, которые мы внесли в файл — nameserver 8.8.8.8 и nameserver 8.8.4.4 На этом все! Настройка DNS Debian завершена. Достаточно легко и просто, а главное, что все работает.

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Я наконец-то перешел на 12.04 с 7.10. У меня есть одна последняя часть для завершения, но я в тупике. Я использую Puppet на каждом сервере, и в прошлом я включал адрес сервера имен и имя поискового домена для puppetmaster в resolv.conf.

В 12.04 resolv.conf перезаписывается при перезагрузке. Я не могу использовать статический IP-адрес для них, поэтому использование /etc/network/interfaces для помощи мне не имеет смысла.

Есть ли способ получить resolvconf для обработки этого в голове, хвосте или основании? Если есть, есть ли примеры, которые я могу использовать для настройки на моем сервере.

Буду признателен за любую оказанную помощь.

Вероятно, лучше, чтобы ваш DNS-сервер мог разрешить "марионетку" по правильному адресу, либо чтобы ваш DHCP-сервер раздавал адрес DNS-сервера имен и список поиска, либо (если у вас есть статические IP-адреса) иметь что-то вроде следующее в /etc/network/interfaces.

Но если вы хотите сделать это через конфигурационные файлы resolvconf, вам нужно отредактировать /etc/resolvconf/resolv.conf.d/base , В этом файле введите ваши данные, как в resolv.conf ,

Затем скажите resolvconf для восстановления resolv.conf ,

Я думаю, что ответом является проверка вашего /etc/dhcp/dhclient.conf не запрашивать dns-nameservers от вашего клиента dhcp.

Затем обновите свой /etc/network/interfaces

Тогда ваш resolv.conf будет автоматически настроен так, как вы этого хотите.

Добавить к dns-search а затем запустить /etc/init.d/networking restart (хотя этот скрипт устарел, он все еще работает).

Вероятно, это вызвано настройкой DHCP при первой установке Ubuntu. Попробуйте этот трехэтапный процесс для решения этой проблемы автоматической конфигурации.

Первый

Отредактируйте конфигурацию вашего интерфейса, которая находится в: /etc/network/interfaces

Добавьте эту строку ниже iface lo inet loopback :

В качестве примера для Google DNS вы можете использовать это:

второй

Отредактируйте файл конфигурации DHCP, расположенный по адресу:

В третьих

Перезагрузите сеть с помощью этой команды:

Как и во многих других ответах, это связано с resolvconf устанавливается в вашей системе.

Так что лучший способ сохранить что-то в resolv.conf это не потеряется при перезагрузке, это включить его в файлы конфигурации resolvconf, которые находятся в:

Там идти на head файл. Все, что вы положите туда, будет написано наверху /etc/resolv.conf

Так что все пойдет примерно так:

Есть и другие специальные файлы (голова и хвост), они могут помочь вам достичь того, что вы хотите.

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

  • Я не пользуюсь resolvconf просто /etc/resolv.conf ,
  • С помощью chattr +i заблокировать resolv.conf кажется слишком хакерским. Мне нужно, чтобы Puppet мог свободно вносить изменения, когда это необходимо.
  • AFAIK, редактирование /etc/network/interfaces не мешает resolv.conf от перезаписи; он просто указывает серверы имен, которые должны быть записаны. Для меня указание серверов имен не имеет смысла. Я пытаюсь установить options timeout:1 а также options attempts:1 в моем resolv.conf файл.

Лучшее решение, которое я нашел, отменяет поведение по умолчанию dhclient используя свои документированные хуки.

Создать новый файл в /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate со следующим содержанием:

Затем сделайте файл исполняемым:

Теперь при запуске dhclient - либо при перезагрузке, либо когда вы запускаете вручную sudo ifdown -a ; sudo ifup -a - загружает этот скрипт nodnsupdate , Этот скрипт переопределяет внутреннюю функцию make_resolv_conf() это обычно перезаписывает resolv.conf и вместо этого ничего не делает.

Это работало для меня на Ubuntu 12.04.

Это может быть какой-то странной причудой в моей машине, но у кого-то еще может быть такой же угловой случай.

Я пробовал многочисленные способы включения моих имен серверов ISP в /etc/resolv.conf, но безуспешно:

Я включил их в /etc/network/interfaces и перезапустил сеть. Они не появились в /etc/resolv.conf ,

Я положил их в /etc/resolv.conf явно, но, конечно, они были перезаписаны. Они появились в /run/resolvconf/interface/eth0.inet , но так и не добрался до /etc/resolv.conf ,

Я попытался настроить resolvconf для динамических обновлений. Без изменений.

Я нуждаюсь в помощи, выясняя почему мой resolv.conf продолжает изменяться на это, заставляя меня не смочь получить доступ к внешнему Интернету и только локальной сети:

Я думал, что зафиксировал его путем избавления от петлевого интерфейса и добавления в интерфейсе eth0 в /etc/network/interfaces с инструкциями относительно блога posterous jontsai.

Я попробовал вещи как выполнение:

И затем вещи работали бы временно, и в конечном счете сервер имен в resolv.conf вернуться снова.

P.S. Я также отправил это на ubuntuforums.

Таким образом, я пробую это:

while true; do echo listening; lsof | grep /etc/resolv.conf; echo sleeping; sleep 1; done

Добавление вывода файлов:

Никакой такой файл как /etc/NetworkManager/NetworkManager.conf

Вы можете сделать статические дополнения к /etc/resolv.conf . Эти дополнения могут переопределять автоматически добавляемые вещи.

Сначала установите пакет resolvconf .

Затем нажмите Alt+F2 и запустите gksudo nautilus . Откройте /etc/resolvconf/resolv.conf.d/head , если хотите добавить в начало файла; откройте /etc/resolvconf/resolv.conf.d/tail , если хотите добавить в конец. Внесите изменения, сохраните/закройте файлы, а затем запустите sudo resolvconf -u , чтобы применить изменения.

(К сожалению, я не помню, имеют ли настройки в начале или в конце файла наивысший приоритет.)

(В этом ответе содержатся способы исследования происходящего. Я могу дать реальное решение, если вы используете эти методы для сбора и предоставления дополнительной информации.)

Возможным триггером для, казалось бы, спонтанных обновлений /etc/resolv.conf является момент, когда DHCP-аренда обновляется. Проверьте, на какой период времени вы получаете DHCP-аренду (это должно появиться в системных журналах, я думаю, в /var/log/syslog ).

Вы можете использовать auditd для того, чтобы узнать, что изменяет файл. Запустите демона ( sudo service auditd start ) и скажите ему, чтобы он следил за изменениями в этом файле:

Audit logs находятся в /var/log/audit/audit.log . Вы увидите время, когда файл был изменен, и имя программы, которая его модифицировала.

Если у вас установлен пакет resolvconf , Network Manager может наступать на ноги. Попробуйте выключить все сетевые интерфейсы, затем остановить сетевой менеджер ( sudo service network-manager stop ), затем перезапустить его.

Я отключаю обновление разрешения -to . conf , создав файл с именем disable_make_resolv_conf в /etc/dhcp3/dhclient-enter-hooks.d

Он заменяет стандартную функцию тем же именем, которое отвечает за обновление resolv.conf .

У меня была точно такая же проблема - resolv.conf переписывался каждый раз при перезагрузке сервера.

Это было вызвано DHCP. Чтобы установить resolv.conf таким, каким я хочу его видеть, я отредактировал /etc/dhcp/dhclient.conf и добавил следующее:

Фактически, вы можете немного контролировать свой файл resolv.conf. внесением изменений в это.

Надеюсь, это поможет.

ответ дан Peter Sankauskas 23 November 2019 в 00:53

Откройте терминал и введите

+ i позаботится о том, чтобы файл не сбрасывался при загрузке даже с правами root.

Для отмены вышеуказанного

Другой вариант, который мне повезло, связан с использованием resolvconf .

Добавьте любые записи в этот файл:

И они будут добавлены в /etc/resolv.conf .

Поздно, но я опубликую свой случай, поскольку он отличался от всего вышеперечисленного.

В моем случае /etc/resolv.conf является символической ссылкой на /var/run/NetworkManager/resolv.conf и по какой-то причине cat / etc /resolv.conf выдает ошибку: нет такого файла или каталога (может быть, потому что он пуст?)

Если я открою его с помощью vi и добавлю сервер имен xxxx , он будет работать, но очищается при перезагрузке.

Я попытался отредактировать / etc / network / interfaces и добавить dns-nameservers xxxx , изменить /etc/dhcp/dhclient.conf и удалить в запрос серверы доменных имен , также отредактированный , добавление серверов доменных имен xxxx [1170 403].

Двоичный файл Resolvconf не установлен, NetworkManager.conf не содержит ничего важного. Но каждый раз, когда я перезагружал машину, сервер домена отсутствовал.

Я не уверен, в чем причина, но похоже, что это связано с тем, что это машина VBox, запущенная GNS3 и из-за этого внутри Настройка VBox, я должен оставить его без создания интерфейса. Очевидно, GNS3 создает «интерфейс UDP» на лету, когда я запускаю машину, при условии, что я запускаю его из GNS3.

Читайте также: