Вопрос Как включить строки в resolv.conf, которые не будут потеряны при перезагрузке?


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

search puppetmaster.com
nameserver 192.168.1.XXX

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

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1

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

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


148
2018-06-28 13:54


происхождения




ответы:


Вероятно, лучше, чтобы ваш DNS-сервер смог разрешить «марионетку» на правильный адрес, а также для того, чтобы ваш DHCP-сервер раздавал адрес DNS-сервера DNS и список поиска или (если у вас есть статические IP-адреса), чтобы иметь что-то вроде в / 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

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

nameserver 192.168.1.XXX

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

sudo resolvconf -u

120
2018-06-28 15:35



Хотя этот ответ имеет голоса, а первая часть более-менее правильная, вторая часть ответа неверна. (1) Делать не поместите строку поиска в /etc/resolvconf/resolv.conf.d/head. Если вы разместите там строку поиска, эта строка будет проигнорирована, если resolvconf включает строку поиска в динамической части файла resolv.conf. Glibc-резольвер игнорирует все, кроме последней строки «поиск» или «домен». См. Раздел resolv.conf (5). (2) Если конфигурация resolvconf изменена, вы не должны перезапускать задачу resolvconf, а просто запустите обновление «resolvconf -u». - jdthood
Я удалил строку. Другой вариант - использовать хвост вместо головы. - tgm4883
base, head или tail (начиная с 12.04), все они переписываются так же, как resolv.conf, поэтому я могу подтвердить, что комментарий @jdthood верен. Итак, полный ответ скажет: не редактируйте ни один из файлов resolv.conf и просто запустите: sudo /etc/init.d/networking restart. Фактически, это приведет к изменению интерфейса для resolv.conf. - tishma
@tishma: Привет. Во-первых, чтобы предотвратить любое недоразумение: ничто не записывает файлы базы, головы или хвоста. Ничего не записывается ни в какие файлы в файле /etc/resolvconf/resolv.conf.d/ во время выполнения. Эти файлы считываются с помощью resolvconf, который собирает их содержимое в файл, который он пишет --- /run/resolvconf/resolv.conf, к которому указывает ссылка symlink /etc/resolv.conf. Во-вторых, относительно того, что делать после изменения параметров dns- * в / etc / network / interfaces. Делать не запустить «/etc/init.d/networking restart»; который теперь устарел. Вместо этого, если речь идет о интерфейсе, и если он снова. - jdthood
В 14.04 этот ответ ничего не сделал для меня. - Jay Sullivan


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

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

auto eth0
iface eth0 inet dhcp
dns-search google.com
dns-nameservers dnsserverip

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

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


32
2017-11-26 01:58



dhclient управляет любыми настройками resolvconf, поэтому это должен быть лучший ответ. - Alex R
/etc/init.d/networking restart не работал на моей машине, но sudo ifdown -a а потом sudo ifup -a сделал. (Также мне потребовалось немного понять, что мне пришлось заменить dnsserverip с чем-то вроде 8.8.8.8; Я чувствую себя немного глупо.) - Jason Gross
пытаться systemctl restart networking.service - Pavel Sayekat


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

Первый

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

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

dns-nameservers yourdns youraltdns

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

dns-nameservers 8.8.8.8 8.8.4.4

второй

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

/etc/dhcp/dhclient.conf

Отметьте синтаксис как комментарий, используя # на каждой линии или просто удалить каждый запрос имя-сервера. В 16.04 вам могут не потребоваться внести какие-либо изменения здесь.

В третьих

Перезагрузите сеть, используя следующую команду:

/etc/init.d/networking restart

В 16.04:

sudo ifdown -a
sudo ifup -a

18
2018-06-20 01:50



/etc/init.d/networking restart не работал на моей машине, но sudo ifdown -a а потом sudo ifup -a сделал. - Jason Gross
Это просто, и он работает, хотя он немного взломан! Проблема с такими вещами, как ubuntu, имеет 1000 способов сделать одно! - Willa O Ng'wana
И тогда вы можете проверить, что /etc/resolv.conf содержит эти две новые записи DNS на первых полезных строках. - ROMANIA_engineer


Посмотрите на resolvconf. Вы можете принудительно включить определенные настройки DNS, создав, например, /etc/resolvconf/resolv.conf.d/base:

  /etc/resolvconf/resolv.conf.d/base
          File containing basic resolver information.  The lines  in  this
          file  are  included in the resolver configuration file even when
          no interfaces are configured.

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


7
2017-09-04 14:26



Вы можете добавлять строки в /etc/resolvconf/resolv.conf.d/base, но поскольку каждый сервер имен доступен через интерфейс и доступен только при этом интерфейсе, лучше всего связать информацию с сервером имен с этим интерфейсом. Если интерфейс сконфигурирован с ifup, это означает: поместить информацию в строки «dns-search» и «dns-nameservers» в строках / etc / network / interfaces stanzas. Если интерфейс настроен через DHCP, это означает: настроить DHCP-сервер для предоставления имен поиска и имен серверов клиентам. И т. Д. Используйте «базовый» файл только в качестве временного взлома или в крайнем случае. - jdthood


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

  • Я не использую 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 со следующим содержанием:

#!/bin/sh
make_resolv_conf() {
    :
}

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

chmod +x /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate

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

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


4
2018-03-05 22:12



Прекрасно работает на Debian 8. Элегантное решение! - Artur Bodera
просто для полноты: manpage dhclient-скрипт содержит информацию о сценарии конфигурации сети клиента DHCP, упомянутом выше. - hecke
Это не сработало в 16.04, я добавил вещи в /etc/network/interfaces.d тоже без эффекта, добавил пустое переопределение make_resolv_conf, рекомендованное здесь, без эффекта .... но не изменял / etc / dhcp / dhclient.conf - мне действительно нужно изменить статический файл конфигурации, чтобы исправить это? - silverjam


Как и многие другие ответы, это имеет отношение к resolvconf будучи установленным в вашей системе.

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

/etc/resolvconf/resolv.conf.d/

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

Итак, все будет идти примерно так:

# echo nameserver 8.8.8.8 >> /etc/resolvconf/resolv.conf.d/head
# resolvconf --enable-updates
# resolvconf -u

3
2017-10-17 13:59





добавьте ваш сервер имен в файл /etc/resolvconf/resolv.conf.d/head. Файл содержит сообщение, которое вы получили:

этот файл должен выглядеть следующим образом после добавления 8.8.8.8

root@hvnatvcc: ~ # cat /etc/resolvconf/resolv.conf.d/head 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.8.8

2
2017-10-23 10:43



Добавление строк в /etc/resolvconf/resolv.conf.d/head является плохим решением, что еще хуже, чем добавление строк в /etc/resolvconf/resolv.conf.d/base. Правильное решение для интерфейсов, сконфигурированных с использованием ifup, заключается в добавлении строк «dns-search» и «dns-nameservers» к строфам в / etc / network / interfaces. См. Также мои комментарии к другим ответам. - jdthood
Это единственное, что действительно сработало для меня ... и кажется, трудно понять, почему ни одно из «правильных» решений не работает. - silverjam


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

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

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

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

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

Наконец, я где-то читал, что если локальная машина (127.0.0.1) появляется в /etc/resolv.conf любые другие серверы имен не включены.

В отчаянии я отредактировал /run/resolvconf/interface/lo.named, удалил единственную строку в ней (nameserver 127.0.0.1) и перезапущен: ifdown eth0 && ifup eth0,

/etc/resolv.conf затем включил мой сервер имен ISP в первый раз! Я побежал service network-manager restart чтобы убедиться, что он стабилен и /etc/resolv.conf все еще включает в себя мои ISP-серверы имен. Перезагрузился, чтобы убедиться, и он все еще там но  /run/resolvconf/interface/lo.named получил сброс: nameserver 127.0.0.1,

Любопытно, что перезапуск сетей все еще работает: /etc/resolv.conf все еще содержит мои серверы имен ISP. Я не могу объяснить это (может кто-то?), Но это может помочь кому-то застрять в том же месте.


2
2018-06-26 05:18



Вероятно, это вызвано dnsmasq, Вы можете просто удалить его, используя apt-get remove dnsmasq или обновить конфигурацию в /etc/dnsmasq.conf, - Tombart