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


174

Я наконец-то перешел на 12.04 с 7.10. У меня есть одна последняя часть для завершения, но я в тупике. Я использую Puppet на каждом сервере, и в прошлом я включал адрес сервера имен и имя поискового домена для puppetmaster в 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 для обработки этого в голове, хвосте или основании? Если есть, есть ли примеры, которые я могу использовать для настройки на моем сервере.

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


2
resolvconf - плохое программное обеспечение, просто удалите его и управляйте /etc/resolv.conf по-старому.
бронзовый мужчина

Ответы:


134

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

13
Хотя этот ответ имеет голоса, и первая часть более или менее правильная, вторая часть ответа неверна. (1) Как не поместить строку «поиск» в /etc/resolvconf/resolv.conf.d/head. Если вы поместите туда строку «search», эта строка будет игнорироваться, если resolvconf включает строку «search» в динамическую часть файла resolv.conf. Средство распознавания glibc игнорирует все, кроме последней строки "search" или "domain". Смотрите resolv.conf (5). (2) Если конфигурация resolvconf изменена, вам не следует перезапускать задание resolvconf, а просто запустить обновление, «resolvconf -u».
Jdthood

1
Я удалил линию. Другой вариант будет использовать хвост вместо головы.
tgm4883

6
@tishma: Привет. Во-первых, чтобы избежать недоразумений: ничего не записывается в файлы базы, заголовка или хвоста. Во время выполнения ничего не записывается ни в какие файлы в /etc/resolvconf/resolv.conf.d/. Эти файлы читаются resolvconf, который собирает их содержимое в записываемый файл --- /run/resolvconf/resolv.conf ---, на который указывает символическая ссылка /etc/resolv.conf. Во-вторых, что делать после изменения параметров dns- * в / etc / network / interfaces. Вы не запускать «/etc/init.d/networking перезагрузки»; сейчас это устарело. Вместо ifdown интерфейс, о котором идет речь, и ifup снова.
Jdthood

4
В 14.04 этот ответ ничего не сделал для меня.
Джей Салливан

2
Если ничего не помогло .. $ sudo resolconf -u, похоже, ничего не изменило для меня, перезапустил машину, presto.
MSpreij

35

Я думаю, что ответом является проверка вашего /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 (хотя этот скрипт устарел, он все еще работает).


5
dhclient управляет любыми настройками resolvconf, так что это должен быть лучший ответ.
Алекс Р

6
/etc/init.d/networking restartне работал на моей машине, но sudo ifdown -aи тогда sudo ifup -aсделал. (Кроме того, мне потребовалось немного времени, чтобы понять, что я должен был заменить dnsserveripчто-то вроде 8.8.8.8; я чувствую себя немного глупо.)
Джейсон Гросс

попробуйsystemctl restart networking.service
Павел Сайекат

20

Вероятно, это вызвано настройкой 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

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

Третий

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

/etc/init.d/networking restart

В 16.04:

sudo ifdown -a
sudo ifup -a

3
/etc/init.d/networking restartне работал на моей машине, но sudo ifdown -aи тогда sudo ifup -aсделал.
Джейсон Гросс

Это просто и работает, хотя это немного хакерски! Проблема с такими вещами, как Ubuntu имеет 1000 способов сделать одну вещь!
Вилла О Нгвана

И затем вы можете проверить, что /etc/resolv.conf содержит эти 2 новые записи DNS в первых полезных строках.
ROMANIA_engineer

8

Пожалуйста, посмотрите на 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.

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


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

Ага. Я добавил "nameserver 1.2.3.4" в /etc/resolvconf/resolv.conf.d/base
Бастион

8

Как и во многих других ответах, это связано с 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

Это актуальный правильный ответ! В заключение!
user77232

6

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

  • Я не использую 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.


1
Отлично работает на Debian 8. Элегантное решение!
Артур Бодера

1
просто для полноты: manpage dhclient-script содержит информацию о скрипте конфигурации сети клиента DHCP, упомянутом выше в ответе.
хекк

Это не сработало 16.04, я тоже кое-что добавил в /etc/network/interfaces.d, без эффекта, добавил рекомендованное здесь пустое переопределение make_resolv_conf, без эффекта .... но не изменил / etc / dhcp / dhclient.conf - мне действительно нужно изменить статический файл конфигурации, чтобы это исправить?
silverjam

3

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

Я пробовал многочисленные способы включения моих имен серверов 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-серверы имен. Rebooted просто чтобы убедиться , и он все еще там , но /run/resolvconf/interface/lo.named получил сбрасываются: nameserver 127.0.0.1.

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


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

2

добавьте свой сервер имен в файл /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

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

3
Это единственное, что действительно сработало для меня ... и, кажется, трудно понять, почему ни одно из "правильных" решений не работает.
silverjam

1

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

nameserver 8.8.8.8

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

sudo chattr +i /etc/resolv.conf

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

Отменить вышеуказанное

sudo chattr -i /etc/resolv.conf

Для большего

man chattr

1

Другие решения не работали для меня в моей системе Fedora 20. Моя конкретная проблема заключалась в том, что строка «search» в /etc/resolv.conf была перезаписана. Вот что это исправило. (Это предполагает, что NetworkManager производит строку, search rn.yourcompany.com и вы хотите, чтобы она была search rn.yourcompany.com yourcompany.com intnet.yourcompany.com:

1. Используйте команду ifconfig, чтобы узнать, какой интерфейс представляет интерес:

$ ifconfig
  :
  :

em2:  <this was the one which was connected>

2. Войдите в систему и перейдите в каталог сетевых устройств конфигурации системы:

$ sudo su -[sudo] 
password for youruser:
# cd /etc/sysconfig/networking/devices`
  1. Используйте ваш любимый доступный редактор, чтобы добавить Domainстроку с дополнительными доменами для поиска:

DOMAIN="yourcompany.com intnet.yourcompany.com"

Сохраните, выйдите из системы и снова войдите в систему. Теперь в NetworkManager должна быть строка \etc\resolve.conf:

search rn.yourcompany.com yourcompany.com intnet.yourcompany.com

3
Не для дождя на вашем параде, но это Ask Ubuntu, и поэтому Fedora не по теме.
Flimm

1

Добавить записи в /etc/resolvconf/resolv.conf.d/head

echo 'search puppetmaster.com' | sudo tee -a /etc/resolvconf/resolv.conf.d/head
echo 'nameserver 192.168.1.XXX' | sudo tee -a /etc/resolvconf/resolv.conf.d/head

и выполните следующую команду

sudo resolvconf -u

1

Для Ubuntu Server 18 Netplan - новая утилита для настройки сети.

# cd /etc/netplan

Затем отредактируйте запись адресов серверов имен в файле yaml (используйте правильный отступ). Например, если вы используете DNS-серверы Google:

nameservers:
    addresses: [8.8.8.8,8.8.4.4]

Перезапустить сервис

# netplan apply

Смотрите https://netplan.io/

https://www.techrepublic.com/article/how-to-set-dns-nameservers-in-ubuntu-server-18-04/


0

Если вы используете DHCP, отредактируйте, /etc/dhcp/dhclient.confчтобы добавить дополнительные DNS-серверы:

prepend domain-name-servers 12.34.56.78, 12.34.56.79;

Клиент DHCP перезаписывает dns-nameserversв систему, etc/network/interfacesи я думаю , что в /etc/resolvconf/resolv.conf.d/baseтоже.

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

Смотрите подробности в вики Debian NetworkConfiguration .


0

Просто сделайте резервную копию вашего resol.conf, удалите пакет resolvconf и отредактируйте файл /etc/resolv.conf так, как вам нужно.

apt-get remove -y resolvconf
echo 'nameserver 8.8.8.8' > /etc/resolv.conf

Мы должны иметь право не использовать плохое программное обеспечение, такое как resolvconf.

Кстати, поле поиска в /etc/resolv.conf бесполезно.


0

Использование resolvconfи отключение systemd-resolved.service(это работает для меня Ubuntu 19.04):

  1. устанавливать resolvconf

    sudo apt install resolvconf
    
  2. Добавление серверов имен

    Откройте /etc/resolvconf/resolv.conf.d/baseс помощью вашего текстового редактора, я использую vim.

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

    затем добавьте серверы имен в открытый файл, например:

    nameserver 1.1.1.1
    nameserver 1.0.0.1
    
  3. обновление resolv.conf

    sudo resolvconf -u
    
  4. Отключить systemd-resolved.serviceи перезагрузить. nameserver 127.0.0.53не написано /etc/resolv.conf.

    sudo systemctl disable systemd-resolved.service
    sudo reboot
    

Готово!

Источник


Не могли бы вы указать, для какой версии Ubuntu вы это сделали? Оригинальный вопрос относится к Ubuntu 12.04, поскольку давно устарел.
Марк Ванхомиссен

0

Я нашел это самое простое исправление. Если у вас есть resolv.confи resolvconfфайлы, они будут наступать друг на друга. Вам нужно удалить resolv.confфайл, который получает и перезаписывает каждый раз, когда вы делаете перезагрузку.

Поместите nameserver 1.1.1.1 1.0.0.1внизу файла resolvconf и затем запустите

sudo rm /etc/resolv.conf

Чтобы избавиться от файла. Затем сделайте перезагрузку и все заработает.


0

Ми решение на 12.04:

Я заметил, что если вы добавляете dns-nameserver в интерфейсах, которые не принимают серверы разрешения имен

справочная страница resolvconf

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

sudo resolvconf –disable-updates

после:

sudo resolvconf -a eth0 # or your network interface

затем вручную отредактируйте, /run/resolvconf/resolv.confдобавив максимум два DNS-сервера.

Затем перезапустите сервис:

sudo /etc/init.d/networking restart

4
Это очень не правильный путь , чтобы решить эту проблему.
Jdthood

1
@jdthood, как кто-то просматривает это, вы можете уточнить, ПОЧЕМУ это не правильный путь? Это кажется мне логичным, но я ничего не знаю об этом.
ErikPerik

-1

Просто положить

dns-search google.com && dns-nameservers (sample: 8.8.8.8)

Команда в вашей /etc/network/interfacesконфигурации. затем перезагрузите вашу сеть.

он должен работать.


-2

Эта конфигурация объявлена ​​в /etc/default/bind9

RESOLVCONF=no|yes

нет = не применять условие вinit.d bind9

да , или другое значение = переопределитьresolv.conf

Эта проблема возникает при установке bind9и не заботится о проверке всех конфессий.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.