Вопрос или проблема
Большинство информации, которую я нахожу в интернете, говорит редактировать /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
Я считаю, это наилучшее решение, потому что:
- Оно работает.
- Требует минимальных изменений.
- Сохраняет работу с кешем 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)
Если я прав, я делаю вывод из всего этого, что
- только часть “head” читается resolvconf: часть “base” каким-то образом контролируется dnsmasq
- dns-server фактически принудительно задан на 8.8.4.4 независимо от сервера, предоставленного DHCP, НО вы теряете кеширование, предоставляемое dnsmasq, поскольку запрос всегда отправляется на 8.8.4.4
- 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
-
Найдите ‘Подключение к сети’
-
Откройте его
-
Затем выберите либо WiFi, либо Ethernet, или что бы вы ни использовали, и нажмите “редактировать”. Вы увидите следующее:
-
Выберите вкладку ipv4
-
Выберите метод “только адреса”
-
Введите свое DNS-имя ниже и сохраните его
-
Готово
Быстрое и грязное решение, которое еще не упоминалось, — это установка неизменяемого флага на файл 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
Скрипт в действии:
ОРИГИНАЛЬНЫЙ ПОСТ
Некоторые пользователи здесь отметили, что 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.
Легкий способ изменить DNS:
$ sudo nano /etc/network/interfaces
Если возникнут проблемы, установите nano
:
$ sudo apt-get install nano -y
затем ..
- найдите это:
dns-nameservers
- если не найдёте, просто введите его
- Я сделал следующее:
dns-nameservers 199.85.126.10 199.85.127.10
Я надеюсь, что это лучший способ, я сделал это на VPS, кстати.
выполняя от имени root:
- ознакомьте
dns=dnsmasq
в файле/etc/NetworkManager/NetworkManager.conf
- добавьте
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
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
. Приведём детализированное руководство по этому вопросу.
Основные причины и решения
-
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
-
Настройка
dnsmasq
Если используется
dnsmasq
, вы можете задать DNS-серверы через конфигурационный файлdnsmasq
:sudo nano /etc/dnsmasq.conf
Добавьте строки:
server=8.8.8.8 server=8.8.4.4
Перезапустите службу:
sudo systemctl restart dnsmasq
-
Изменение
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.
-
Переключение NetworkManager на статический режим
Если
NetworkManager
управляет вашими сетевыми подключениями:sudo nano /etc/NetworkManager/NetworkManager.conf
Найдите строку
dns=dnsmasq
и закомментируйте её или измените наdns=none
. Это предотвратит модификации вresolv.conf
:dns=none
Перезапустите NetworkManager:
sudo systemctl restart NetworkManager
Заключение
Учитывая вышеупомянутые методы, выбор подходящего решения зависит от вашей системы и предпочтений в использовании кэширующего DNS-резолвера, такого как dnsmasq
. Всегда учитывайте возможные влияния на производительность и удобство пользователей при внесении изменений в системные конфигурации. Надеемся, что это руководство поможет вам успешно настроить DNS по умолчанию, не теряя при этом функциональность, предоставляемую системой.