Centos 7 dns setup resolv conf и пошаговое руководство по настройке DNS-сервера BIND в среде chroot для Red Hat (RHEL

Centos 7 dns setup resolv conf и пошаговое руководство по настройке DNS-сервера BIND в среде chroot для Red Hat (RHEL Хостинг

Время на прочтение

Настройка сетевого взаимодействия сервисов не самая простая задача и часто осуществляется без глубокого понимания как требуется настраивать систему и какие настройки на что влияют. После миграции сервисов в docker контейнерах с centos 6 на centos 7 я столкнулся со странным поведением вебсервера: он пытался присоединиться к сервису по IPv6, а сервис же слушал только IPv4 адрес. Стандартный совет в такой ситуации — отключить поддержку IPv6. Но это не поможет в ряде случаев. Каких? В этой статье я задался целью собрать и детально объяснить как приложения resolve‘ят адреса.

Публикация будет полезна начинающим администраторам и разработчикам.

Прочитав эту статью, вы узнаете:

  • какой алгоритм в Linux для резолва хостнеймов;
  • как переопределить логику определения хостнеймов;
  • какие функции и библиотеки использует ОС;
  • какие ловушки существуют при конфигурировании и как их не допускать;

Centos 7 dns setup resolv conf и пошаговое руководство по настройке DNS-сервера BIND в среде chroot для Red Hat (RHEL

У операционной системы Linux есть несколько источников для определения адреса по hostname. Весь необходимый функционал для определения находится в GNU C Library (glibc). glibc является по-сути фреймворком и реализовывает множество полезных функций для разработчика, предоставляя свой API для упрощения разработки. Среди прочего, glibc имплементирует POSIX. Такие функции как open, read, write, malloc, printf, getaddrinfo, dlopen, pthread_create, crypt, login, exit для Linux систем предоставляет именно glibc.

Известные многим утилиты host, dig и nslookup используют glibc, но поставляются отдельно.

А еще я веду телеграм канал Об IT без галстуков и блог. На канале рассказываю о проблемах менеджмента и как их решать, пишу о принципах мышления при решении бизнес задач, о том как стать эффективным и высокоплачиваемым специалистом.

Теперь, когда у разработчика есть возможность вызвать функцию семейства getaddrinfo из glibc для определения адреса, то возникает потребность конфигурировать возвращаемые значения. Например, использовать ли сперва /etc/hosts или запрос к DNS-серверу. В glibc подобное конфигурирование производится с помощью схемы под названием Name Service Switch (NSS).

Если объяснять на пальцах, то NSS позволяет задавать базы данных и очередность поиска в этих базах для предоставления сервиса. В нашем случае, сервис — это поиск по hostname, а базой данных может выступать /etc/hosts или DNS сервер. Это не единственный сервис настраиваемый посредством NSS, предоставляются сервисы mail алиасов, сервис поиска пользователей и групп. Ознакомится со списком можно в руководстве.

Благодаря NSS можно без пересборки приложений, в рантайме, конфигурировать упомянутые базы данных. Производится конфигурирование в файле /etc/nsswitch.conf. Ниже пример конфига из стандартного /etc/nsswitch.conf в Centos 7.

$ grep ^hosts /etc/nsswitch.conf
hosts: files dns myhostname

files, dns и myhostname являются алиасами баз данных для поиска. files на большинстве систем подразумевает использование /etc/hosts, dns база — это DNS-сервер к которому будет осуществляться запрос поиска hostname, а myhostname — это самая необычная база, о существовании которой мало кто знает и она не является частью стандартной поставки в glibc. В некоторых дистрибутивах присутствует еще и база mdns4_minimal. Ниже по тексту предоставлен разбор этих баз данных.

Базы используются в том порядке в котором они обьявлены в /etc/nsswitch.conf и если в текущей базе запись найдена, то происходит выход из цепочки и возврат результата. При отсутствии результата происходит переход к следующей базе в списке. Если ни в одной базе не найден результат, то такой ответ и дается на запрос glibc функции getaddrinfo. Поведение перехода к следующей базе и условия такого перехода можно дополнительно конфигурировать, например, при недоступности DNS (не путать с отсутствием записи) завершить цепочку. Понятное и простое объяснение принципа настройки условий для /etc/nsswitch.conf даны в этой статье.

База files, а в частности /etc/hosts, из коробки в Centos 7 выглядит следующим образом:

$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

Можно отметить, что для localhost имеются две записи: IPv4 и IPv6 адрес. Это может сыграть злую шутку и в конце материала я расскажу почему.

База dns при определении адреса использует name server указанный в конфиге /etc/resolv.conf. Вот пример моего /etc/resolv.conf на хост системе:

$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 127.0.0.1
nameserver 192.168.100.1

Name server’а используются тоже по цепочке и в порядке их объявления. В моем случае, первым выступает локальный DNS сервер (я использую dnsmasq) для задания локальных адресов .priv зон. Если находится совпадение, то возвращается адрес из локальной сети. Все остальные запросы отправляются на основной DNS сервер с адресом 192.168.100.1.

База myhostname присутствует в поставке Centos и Ubuntu, но не является частью glibc. Не зная этого факта я потратил много времени пытаясь выяснить почему мне возвращаются IPv6 адреса для определения хоста. Он работает следующим образом:

  • При запросе локального хостнейма (того что возвращает команда hostname) плагин возвращает все IP адреса публичных интерфейсов (т.е. все кроме loopback), при отсутствии таких интерфейсов возвращается IPv4 адрес 127.0.0.2 и IPv6 адрес ::1;
  • При запросе хостнейма localhost или localhost.localdomain возвращает IPv4 адрес 127.0.0.1 и IPv6 адрес ::1;
  • При запросе хостнейма оканчивающегося на .localhost или .localhost.localdomain возвращает IPv4 адрес 127.0.0.1 и IPv6 адрес ::1;

В мануале еще пишут про особую логику с обработкой хостнейма _gateway, но видимо это какой-то патч, так как с Centos 7 у меня он не завелся.

База mdns4_minimal или же mdns_minimal требуется для корректной работы Avahi. При необходимости можно обратиться к документации Arch по Avahi, где коротко и понятно дана информация
по использованию.

Теперь, когда дана информация по базам и принципам их работы стоит отметить отличия в определении адресов в разных инструментах, что приводит к проблемам в рантайме.

Для проверки результатов возвращаемой каждой из баз документация рекомендует воспользоваться утилитой getent.

Ниже немного примеров работы с getent с включенным IPv6.

В /etc/nsswitch.conf содержится следующая цепочка баз:

hosts: files dns myhostname

В /etc/hosts содержится следующее инфо

$ cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback

Команда getent ahosts <hostname> покажет список всех адресов которые удалось найти. С такими настройками она выведет следующее:

$ getent ahosts localhost
::1 STREAM localhost
::1 DGRAM
::1 RAW
127.0.0.1 STREAM
127.0.0.1 DGRAM
127.0.0.1 RAW

Команда позволяет точечно опросить конкретную базу и выяснить что срезолвит база. Рассмотрим для каждой базы возвращаемые значения:

$ getent -s hosts:files ahosts localhost
::1 STREAM localhost
::1 DGRAM
::1 RAW
127.0.0.1 STREAM
127.0.0.1 DGRAM
127.0.0.1 RAW
$ getent -s hosts:dns ahosts localhost
::1 STREAM localhost
::1 DGRAM
::1 RAW
127.0.0.1 STREAM
127.0.0.1 DGRAM
127.0.0.1 RAW
$ getent -s hosts:myhostname ahosts localhost
::1 STREAM localhost
::1 DGRAM
::1 RAW
127.0.0.1 STREAM
127.0.0.1 DGRAM
127.0.0.1 RAW

Если убрать из /etc/hosts строки для localhost, то вывод видоизменится:

$ getent -s hosts:files ahosts localhost
$ getent -s hosts:dns ahosts localhost
::1 STREAM localhost
::1 DGRAM
::1 RAW
127.0.0.1 STREAM
127.0.0.1 DGRAM
127.0.0.1 RAW
$ getent -s hosts:myhostname ahosts localhost
::1 STREAM localhost
::1 DGRAM
::1 RAW
127.0.0.1 STREAM
127.0.0.1 DGRAM
127.0.0.1 RAW

Теперь база dns и myhostname возвращает ответы, а база files не содержит данных. Для DNS запросов используется неймсервер конфигурируемый в /etc/resolv.conf в моем контейнере, например

$ cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

На хост машине установлен dnsmasq который проксирует и кэширует ответы DNS серверов. Ответ от DNS будет зависеть от настроек DNS сервера к которому поступил запрос. RFC 1912 рекомендует в пункте 4.1 сконфигурировать DNS сервера таким образом, чтобы localhost указывал на 127.0.0.1.

Certain zones should always be present in nameserver configurations:

 primary localhost localhost primary 0.0.127.in-addr.arpa 127.0 primary 255.in-addr.arpa 255 primary 0.in-addr.arpa 0

These are set up to either provide nameservice for «special»
addresses, or to help eliminate accidental queries for broadcast or
local address to be sent off to the root nameservers. All of these
files will contain NS and SOA records just like the other zone files
you maintain, the exception being that you can probably make the SOA
timers very long, since this data will never change.

 localhost. IN A 127.0.0.1

В моем случае, dnsmasq из коробки содержит записи для localhost, как и рекомендует RFC.

$ dig +noall +answer localhost ANY @127.0.0.1
localhost. 0 IN A 127.0.0.1
localhost. 0 IN AAAA ::1

Отключается это либо удалением записей из /etc/hosts на самом DNS сервере, либо же включением опции no-hosts в /etc/dnsmasq.conf.

После включения опции getent для базы myhostname вернет непустой результат, но как и отмечалось выше, с включенным myhostname будет возвращаться IPv4 и IPv6 адрес. На системах со статическими IP адресами можно смело выключить myhostname плагин и конфигурировать локальные хосты с использованием /etc/hosts. Альтернативный вариант — это отключение IPv6.

Статус IPv6 на сервере можно получить из параметров ядра. Значение 0 возвращается при включенном IPv6, а 1 при выключенном.

$ sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0

В выводе ifconfig интерфейсы слушающие IPv6 содержат строчку inet6. Ниже пример вывода с выключенным и включенным IPv6 соответственно:

# diabled
$ ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.101.5 netmask 255.255.255.0 broadcast 0.0.0.0 ether 02:42:c0:a8:65:05 txqueuelen 0 (Ethernet) RX packets 15789549 bytes 2553533549 (2.3 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 9783999 bytes 1318627420 (1.2 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1 (Local Loopback) RX packets 606047 bytes 67810892 (64.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 606047 bytes 67810892 (64.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# enabled
$ ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.101.5 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::42:c0ff:fea8:6505 prefixlen 64 scopeid 0x20<link> ether 02:42:c0:a8:65:05 txqueuelen 0 (Ethernet) RX packets 15787641 bytes 2553216408 (2.3 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 9782965 bytes 1318487919 (1.2 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1 (Local Loopback) RX packets 605949 bytes 67799887 (64.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 605949 bytes 67799887 (64.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Выключить IPv6 можно вызовом

$ sysctl -w net.ipv6.conf.all.disable_ipv6=1
$ sysctl -w net.ipv6.conf.default.disable_ipv6=1

Что изменится после выключения? Я откатил все конфиги на стандартные: в /etc/hosts присутствует localhost с адресами IPv4 и IPv6, в dnsmasq выключена опция no-hosts. Отключил IPv6 командами выше и вывод getent стал следующим:

$ getent -s hosts:files ahosts localhost
127.0.0.1 STREAM localhost
127.0.0.1 DGRAM
127.0.0.1 RAW
127.0.0.1 STREAM
127.0.0.1 DGRAM
127.0.0.1 RAW
$ getent -s hosts:dns ahosts localhost
127.0.0.1 STREAM localhost
127.0.0.1 DGRAM
127.0.0.1 RAW
$ getent -s hosts:myhostname ahosts localhost
127.0.0.1 STREAM localhost
127.0.0.1 DGRAM
127.0.0.1 RAW

Воу, в первом выводе у нас дублируется адрес 127.0.0.1. Чтобы разобраться почему так происходит стоит обратиться к исходному коду glibc и к коду утилиты getent. Ниже кусок кода утилиты getent.

Читайте также:  Переход с MODX на OctoberCMS. Часть 1-я

/* This is for hosts, but using getaddrinfo */
static int
ahosts_keys_int (int af, int xflags, int number, char *key[])
{ // ... hint.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME | idn_flags | xflags); hint.ai_family = af; for (i = 0; i < number; ++i) { struct addrinfo *res; if (getaddrinfo (key[i], NULL, &hint, &res) != 0) result = 2; else { struct addrinfo *runp = res; while (runp != NULL) { // printf goes here } freeaddrinfo (res); } } return result;

Флаг AI_V4MAPPED функции getaddrinfo производит маппинг IPv6 адресов на IPv4 если не были найдены IPv6 адреса в результате опроса базы. Флаг AI_ADDRCONFIG вынудит getaddrinfo проверить наличие IPv6/IPv4 адресов сконфигурированных в системе и в случае отсутствия хотя бы одного IPv6/IPv4 адреса не будет возвращаться IPv6/IPv4 независимо от того что ответит конкретная база.

Поскольку у getent включены оба флага, а в /etc/hosts присуствуетя для localhost адреса 127.0.0.1 и ::1, то getaddrinfo получит из NSS базы hosts (в примере выше мы обсуждали именно эту базу), адреса 127.0.0.1 и ::1, затем не обнаружив ни одного IPv6 адреса в системе (выключены параметрами ядра) и произведет маппинг ::1 -> 127.0.0.1.

Чтобы лучше понять эту концепцию, приведу примеры с выводом getaddrinfo на той же системе, с разными настройками ai_flags и ai_family. В /etc/hosts включены для localhost IPv4 и IPv6 адреса.
Исходный код можно найти на моем github.

# ./getaddrinfo localhost
IP addresses for localhost:
[AF_INET] AI_V4MAPPED IPv4: 127.0.0.1 IPv4: 127.0.0.1
[AF_INET] AI_V4MAPPED AI_ALL IPv4: 127.0.0.1 IPv4: 127.0.0.1
[AF_INET] AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1
[AF_INET] AI_V4MAPPED AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1
[AF_INET] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1
--------------
[AF_INET6] AI_V4MAPPED IPv6: ::1
[AF_INET6] AI_V4MAPPED AI_ALL IPv6: ::ffff:127.0.0.1 IPv6: ::ffff:127.0.0.1 IPv6: ::1
[AF_INET6] AI_ADDRCONFIG
getaddrinfo: Name or service not known
[AF_INET6] AI_V4MAPPED AI_ADDRCONFIG
getaddrinfo: Name or service not known
[AF_INET6] AI_V4MAPPED AI_ALL AI_ADDRCONFIG
getaddrinfo: Name or service not known
--------------
[AF_UNSPEC] AI_V4MAPPED IPv4: 127.0.0.1 IPv6: ::1
[AF_UNSPEC] AI_V4MAPPED AI_ALL IPv4: 127.0.0.1 IPv6: ::1
[AF_UNSPEC] AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1
[AF_UNSPEC] AI_V4MAPPED AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1
[AF_UNSPEC] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1
--------------

Из вывода видно, что с _aifamily равным _AIUNSPEC (возвращать и IPv4, и IPv6) и без AI_ADDRCONFIG флага getaddrinfo возвращает два адреса, IPv4 и IPv6, что многие администраторы не ожидают увидеть. Это происходит независимо от того выключен ли IPv6 в параметрах ядра. Если в /etc/hosts убрать адрес ::1, то из вывода getaddrinfo (с флагом AF_UNSPEC) вовсе исчезнут IPv6 адреса.

С включенным IPv6 и наличием ::1 в /etc/hosts будет возвращаться IPv4 и IPv6. Для предотвращения возврата адреса IPv6 требуется закомментировать IPv6 адрес в /etc/hosts. Если адреса будут найдены в /etc/hosts, то в dns и myhostname базу glibc не полезет.

Осталось проверить как ведет себя getaddrinfo для dns базы. Для этого оставлю в /etc/nsswitch.conf для hosts только dns базу и порезолвлю google.com. Вывод ниже с включенным IPv6.

$ sysctl -w net.ipv6.conf.default.disable_ipv6=0
$ sysctl -w net.ipv6.conf.all.disable_ipv6=0
$ ./getaddrinfo google.com
IP addresses for google.com:
[AF_INET] AI_V4MAPPED IPv4: 216.58.215.78
[AF_INET] AI_V4MAPPED AI_ALL IPv4: 216.58.215.78
[AF_INET] AI_ADDRCONFIG IPv4: 216.58.215.78
[AF_INET] AI_V4MAPPED AI_ADDRCONFIG IPv4: 216.58.215.78
[AF_INET] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 216.58.215.78
--------------
[AF_INET6] AI_V4MAPPED IPv6: 2a00:1450:401b:806::200e
[AF_INET6] AI_V4MAPPED AI_ALL IPv6: ::ffff:216.58.215.78 IPv6: 2a00:1450:401b:806::200e
[AF_INET6] AI_ADDRCONFIG IPv6: 2a00:1450:401b:806::200e
[AF_INET6] AI_V4MAPPED AI_ADDRCONFIG IPv6: 2a00:1450:401b:806::200e
[AF_INET6] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv6: ::ffff:216.58.215.78 IPv6: 2a00:1450:401b:806::200e
--------------
[AF_UNSPEC] AI_V4MAPPED IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e
[AF_UNSPEC] AI_V4MAPPED AI_ALL IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e
[AF_UNSPEC] AI_ADDRCONFIG IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e
[AF_UNSPEC] AI_V4MAPPED AI_ADDRCONFIG IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e
[AF_UNSPEC] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e
--------------

А вот вывод с выключенным IPv6:

$ sysctl -w net.ipv6.conf.all.disable_ipv6=1
$ sysctl -w net.ipv6.conf.default.disable_ipv6=1
$ ./getaddrinfo google.com
IP addresses for google.com:
[AF_INET] AI_V4MAPPED IPv4: 216.58.215.78
[AF_INET] AI_V4MAPPED AI_ALL IPv4: 216.58.215.78
[AF_INET] AI_ADDRCONFIG IPv4: 216.58.215.78
[AF_INET] AI_V4MAPPED AI_ADDRCONFIG IPv4: 216.58.215.78
[AF_INET] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 216.58.215.78
--------------
[AF_INET6] AI_V4MAPPED IPv6: 2a00:1450:401b:806::200e
[AF_INET6] AI_V4MAPPED AI_ALL IPv6: ::ffff:216.58.215.78 IPv6: 2a00:1450:401b:806::200e
[AF_INET6] AI_ADDRCONFIG
getaddrinfo: Name or service not known
[AF_INET6] AI_V4MAPPED AI_ADDRCONFIG
getaddrinfo: Name or service not known
[AF_INET6] AI_V4MAPPED AI_ALL AI_ADDRCONFIG
getaddrinfo: Name or service not known
--------------
[AF_UNSPEC] AI_V4MAPPED IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e
[AF_UNSPEC] AI_V4MAPPED AI_ALL IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e
[AF_UNSPEC] AI_ADDRCONFIG IPv4: 216.58.215.78
[AF_UNSPEC] AI_V4MAPPED AI_ADDRCONFIG IPv4: 216.58.215.78
[AF_UNSPEC] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 216.58.215.78
--------------

Как видно, ситуация с AI_ADDRCONFIG очень похожа.

Напоследок приведу пример как не учитывая все вышесказанное вляпаться в проблемы. IPv6 включен, /etc/nsswitch.conf стандартный.

$ cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
$ grep hosts /etc/nsswitch.conf
hosts: files dns myhostname
$ cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0
$ sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0

Что вернет host localhost или dig ANY localhost? Что вернет getaddrinfo, например, с флагами как у nginx?

$ dig +noall +answer ANY localhost @127.0.0.11
localhost. 0 IN A 127.0.0.1
$ host localhost
localhost has address 127.0.0.1
$ ./getaddrinfo localhost
IP addresses for localhost:
[AF_UNSPEC] AI_ADDRCONFIG IPv6: ::1 IPv4: 127.0.0.1

nginx будет пытаться подключаться к двум адресам: 127.0.0.1 и ::1, а приложение может и не ожидать такого. Источник для ошибок.

Centos 7 dns setup resolv conf и пошаговое руководство по настройке DNS-сервера BIND в среде chroot для Red Hat (RHEL

Какой можно сделать вывод из всего написанного?

  1. Если вы разрабатываете приложение работающее с сетью, то учитывайте, что IPv6 может быть отключен;
  2. При настройке сервера учитывайте наличие NSS и очередности проверок, используйте getent или мой код для проверки;
  3. Если неизвестно как работает приложение, то при наличии исходных кодов можно посмотреть с какими флагами резолвятся
    адреса и сверить с настройками системы;
  4. Если исходных кодов нет, то можно по поведению в выводе strace сделать предположение об используемых флагах.

P.S. Подписывайся на мой канал Об IT без галстуков. Я рассказываю о фундаментальных проблемах в IT бизнесе и способах их решения, о запросе повышений и о построении карьеры до управленца или собственного бизнеса.

Перевод статьи подготовлен для студентов курса «Безопасность Linux». Интересно развиваться в данном направлении? Смотрите запись трансляции мастер-класса Ивана Пискунова «Безопасность в Linux в сравнении с Windows и MacOS»

Centos 7 dns setup resolv conf и пошаговое руководство по настройке DNS-сервера BIND в среде chroot для Red Hat (RHEL

В этой статье я расскажу о шагах по настройке DNS-сервера на RHEL 7 или CentOS 7. Для демонстрации я использовал Red Hat Enterprise Linux 7.4. Наша цель — создать одну A-запись и одну PTR-запись для зоны прямого и обратного просмотра соответственно.

Сначала установите необходимые rpm-пакеты для DNS-сервера.

ПРИМЕЧАНИЕ: Для RHEL у вас должна быть активная подписка на RHN, или вы можете настроить локальный автономный репозиторий, с помощью которого менеджер пакетов «yum» сможет установить необходимые rpm-пакеты и зависимости.

# yum install bind bind-chroot caching-nameserver

# hostname
golinuxhub-client.example
Мой IP-адрес 192.168.1.7
# ip address | egrep 'inet.*enp0s3' inet 192.168.1.7/24 brd 192.168.1.255 scope global dynamic enp0s3

Поскольку мы будем использовать chroot, нужно отключить службу.

# systemctl stop named
# systemctl disable named

Затем скопируйте необходимые файлы в каталог chroot.
ПРИМЕЧАНИЕ. Используйте аргумент -p в команде cp для сохранения прав и владельцев.

[root@golinuxhub-client ~]# cp -rpvf /usr/share/doc/bind-9.9.4/sample/etc/* /var/named/chroot/etc/
‘/usr/share/doc/bind-9.9.4/sample/etc/named.conf’ -> ‘/var/named/chroot/etc/named.conf’
‘/usr/share/doc/bind-9.9.4/sample/etc/named.rfc1912.zones’ -> ‘/var/named/chroot/etc/named.rfc1912.zones’

Затем скопируйте файлы, связанные с зоной, в новое место.

[root@golinuxhub-client ~]# cp -rpvf /usr/share/doc/bind-9.9.4/sample/var/named/* /var/named/chroot/var/named/
‘/usr/share/doc/bind-9.9.4/sample/var/named/data’ -> ‘/var/named/chroot/var/named/data’
‘/usr/share/doc/bind-9.9.4/sample/var/named/my.external.zone.db’ -> ‘/var/named/chroot/var/named/my.external.zone.db’
‘/usr/share/doc/bind-9.9.4/sample/var/named/my.internal.zone.db’ -> ‘/var/named/chroot/var/named/my.internal.zone.db’
‘/usr/share/doc/bind-9.9.4/sample/var/named/named.ca’ -> ‘/var/named/chroot/var/named/named.ca’
‘/usr/share/doc/bind-9.9.4/sample/var/named/named.empty’ -> ‘/var/named/chroot/var/named/named.empty’
‘/usr/share/doc/bind-9.9.4/sample/var/named/named.localhost’ -> ‘/var/named/chroot/var/named/named.localhost’
‘/usr/share/doc/bind-9.9.4/sample/var/named/named.loopback’ -> ‘/var/named/chroot/var/named/named.loopback’
‘/usr/share/doc/bind-9.9.4/sample/var/named/slaves’ -> ‘/var/named/chroot/var/named/slaves’
‘/usr/share/doc/bind-9.9.4/sample/var/named/slaves/my.ddns.internal.zone.db’ -> ‘/var/named/chroot/var/named/slaves/my.ddns.internal.zone.db’
‘/usr/share/doc/bind-9.9.4/sample/var/named/slaves/my.slave.internal.zone.db’ -> ‘/var/named/chroot/var/named/slaves/my.slave.internal.zone.db’
```bash
Теперь давайте посмотрим на основной файл конфигурации.
```bash
# cd /var/named/chroot/etc/

Очистите содержимое named.conf и вставьте следующее.

[root@golinuxhub-client etc]# vim named.conf
options { listen-on port 53 { 127.0.0.1; any; };
# listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; any; }; allow-query-cache { localhost; any; };
};
logging { channel default_debug { file "data/named.run"; severity dynamic; };
};
view my_resolver { match-clients { localhost; any; }; recursion yes; include "/etc/named.rfc1912.zones";
};

Информация, относящаяся к зоне, должна быть добавлена в /var/named/chroot/etc/named.rfc1912.zones. Добавьте записи, приведенные ниже. Файл example.zone — это файл зоны прямого просмотра, а example.rzone — файл обратной зоны.

zone "example" IN { type master; file "example.zone"; allow-update { none; };
};
zone "1.168.192.in-addr.arpa" IN { type master; file "example.rzone"; allow-update { none; };
};

Файлы, связанные с зонами, находятся здесь:

# cd /var/named/chroot/var/named/

Далее создадим файлы для прямой и обратной зоны. Имена файлов будут такими же, как выше в файле named.rfc1912.zones. У нас уже есть несколько шаблонов по умолчанию, которые мы можем использовать.

# cp -p named.localhost example.zone
# cp -p named.loopback example.rzone

Как видите, текущие разрешения на все файлы и каталоги принадлежат root.

[root@golinuxhub-client named]# ll
total 32
drwxr-xr-x. 2 root root 6 May 22 2017 data
-rw-r--r--. 1 root root 168 May 22 2017 example.rzone
-rw-r--r--. 1 root root 152 May 22 2017 example.zone
-rw-r--r--. 1 root root 56 May 22 2017 my.external.zone.db
-rw-r--r--. 1 root root 56 May 22 2017 my.internal.zone.db
-rw-r--r--. 1 root root 2281 May 22 2017 named.ca
-rw-r--r--. 1 root root 152 May 22 2017 named.empty
-rw-r--r--. 1 root root 152 May 22 2017 named.localhost
-rw-r--r--. 1 root root 168 May 22 2017 named.loopback
drwxr-xr-x. 2 root root 71 Feb 12 21:02 slaves

Измените права всех файлов, указав в качестве владельца пользователя root и группу named.

# chown root:named *

Но для data владелец должен быть named:named.

# chown -R named:named data
# ls -l
total 32
drwxr-xr-x. 2 named named 6 May 22 2017 data
-rw-r--r--. 1 root named 168 May 22 2017 example.rzone
-rw-r--r--. 1 root named 152 May 22 2017 example.zone
-rw-r--r--. 1 root named 56 May 22 2017 my.external.zone.db
-rw-r--r--. 1 root named 56 May 22 2017 my.internal.zone.db
-rw-r--r--. 1 root named 2281 May 22 2017 named.ca
-rw-r--r--. 1 root named 152 May 22 2017 named.empty
-rw-r--r--. 1 root named 152 May 22 2017 named.localhost
-rw-r--r--. 1 root named 168 May 22 2017 named.loopback
drwxr-xr-x. 2 root named 71 Feb 12 21:02 slaves

Добавьте приведенное ниже содержимое в файл прямой зоны. Здесь мы создаем A-запись для localhost (golinuxhub-client) и еще одну для сервера (golinuxhub-server).

# vim example.zone
$TTL 1D
@ IN SOA example. root ( 1 ; serial 3H ; refresh 15M ; retry 1W ; expire 1D ) ; minimum IN NS example. IN A 192.168.1.7
golinuxhub-server IN A 192.168.1.5
golinuxhub-client IN A 192.169.1.7

Далее добавьте содержимое в файл обратной зоны. Здесь мы создаем PTR-запись для golinuxhub-client и для сервера golinuxhub-server.

# vim example.rzone
$TTL 1D
@ IN SOA example. root.example. ( 1997022700 ; serial 28800 ; refresh 14400 ; retry 3600000 ; expire 86400 ) ; minimum IN NS example.
5 IN PTR golinuxhub-server.example.
7 IN PTR golinuxhub-client.example.

Прежде чем мы запустим сервис named-chroot, проверим конфигурацию файла зоны.

[root@golinuxhub-client named]# named-checkzone golinuxhub-client.example example.zone
zone golinuxhub-client.example/IN: loaded serial 1
OK
[root@golinuxhub-client named]# named-checkzone golinuxhub-client.example example.rzone
zone golinuxhub-client.example/IN: loaded serial 1997022700
OK

Все выглядит хорошо. Теперь проверьте файл конфигурации, используя следующую команду.

[root@golinuxhub-client named]# named-checkconf -t /var/named/chroot/ /etc/named.conf

Итак, все выполнено успешно.

[root@golinuxhub-client named]# echo $?
0

ВАЖНОЕ ПРИМЕЧАНИЕ: у меня SELinux находится в режиме permissive

# getenforce
Permissive

Все выглядит хорошо, так что пора запускать наш сервис named-chroot .

[root@golinuxhub-client named]# systemctl restart named-chroot

[root@golinuxhub-client named]# systemctl status named-chroot
● named-chroot.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; disabled; vendor preset: disabled) Active: active (running) since Mon 2018-02-12 21:53:23 IST; 19s ago Process: 5236 ExecStop=/bin/sh -c /usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID (code=exited, status=0/SUCCESS) Process: 5327 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} -t /var/named/chroot $OPTIONS (code=exited, status=0/SUCCESS) Process: 5325 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -t /var/named/chroot -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS) Main PID: 5330 (named) CGroup: /system.slice/named-chroot.service └─5330 /usr/sbin/named -u named -c /etc/named.conf -t /var/named/chroot
Feb 12 21:53:23 golinuxhub-client.example named[5330]: managed-keys-zone/my_resolver: loaded serial 0
Feb 12 21:53:23 golinuxhub-client.example named[5330]: zone 0.in-addr.arpa/IN/my_resolver: loaded serial 0
Feb 12 21:53:23 golinuxhub-client.example named[5330]: zone 1.0.0.127.in-addr.arpa/IN/my_resolver: loaded serial 0
Feb 12 21:53:23 golinuxhub-client.example named[5330]: zone 1.168.192.in-addr.arpa/IN/my_resolver: loaded serial 1997022700
Feb 12 21:53:23 golinuxhub-client.example named[5330]: zone example/IN/my_resolver: loaded serial 1
Feb 12 21:53:23 golinuxhub-client.example named[5330]: zone localhost/IN/my_resolver: loaded serial 0
Feb 12 21:53:23 golinuxhub-client.example named[5330]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN/my_resolver: loaded serial 0
Feb 12 21:53:23 golinuxhub-client.example named[5330]: zone localhost.localdomain/IN/my_resolver: loaded serial 0
Feb 12 21:53:23 golinuxhub-client.example named[5330]: all zones loaded
Feb 12 21:53:23 golinuxhub-client.example named[5330]: running
```bash
Убедитесь, что resolv.conf содержит ваш IP-адрес, чтобы он мог работать в качестве DNS-сервера.
```bash
# cat /etc/resolv.conf
search example
nameserver 192.168.1.7
```bash
Давайте проверим наш DNS-сервер для обратной зоны, используя dig.
```bash
[root@golinuxhub-client named]# dig -x 192.168.1.5
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7 <<>> -x 192.168.1.5
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40331
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;5.1.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
5.1.168.192.in-addr.arpa. 86400 IN PTR golinuxhub-server.example.
;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 86400 IN NS example.
;; ADDITIONAL SECTION:
example. 86400 IN A 192.168.1.7
;; Query time: 1 msec
;; SERVER: 192.168.1.7#53(192.168.1.7)
;; WHEN: Mon Feb 12 22:13:17 IST 2018
;; MSG SIZE rcvd: 122

Как вы видите, мы получили положительный ответ (ANSWER) на наш запрос (QUERY).

Читайте также:  Программа для учета оборудования бесплатно

[root@golinuxhub-client named]# dig -x 192.168.1.7
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7 <<>> -x 192.168.1.7
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55804
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;7.1.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
7.1.168.192.in-addr.arpa. 86400 IN PTR golinuxhub-client.example.
;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 86400 IN NS example.
;; ADDITIONAL SECTION:
example. 86400 IN A 192.168.1.7
;; Query time: 1 msec
;; SERVER: 192.168.1.7#53(192.168.1.7)
;; WHEN: Mon Feb 12 22:12:54 IST 2018
;; MSG SIZE rcvd: 122

Точно так же мы можем проверить прямую зону.

[root@golinuxhub-client named]# nslookup golinuxhub-client.example
Server: 192.168.1.7
Address: 192.168.1.7#53
Name: golinuxhub-client.example
Address: 192.169.1.7
[root@golinuxhub-client named]# nslookup golinuxhub-server.example
Server: 192.168.1.7
Address: 192.168.1.7#53
Name: golinuxhub-server.example
Address: 192.168.1.5

Эта статья немного устарела, так как в RHEL 7 теперь не нужно копировать файлы конфигурации bind в chroot. Step-by-Step Tutorial: Configure DNS Server using bind chroot (CentOS/RHEL 7).

Время на прочтение

Abstract: описание того, как обновляется файл /etc/resolv.conf в условиях работающего dhcp-клиента, специфика различных ОС и варианты реализации.

Охват: Debian, Ubuntu, Centos/Fedora/RHEL; dhclient с resolvconf и без. NetworkManager не учитывается.

О чём речь?

У компьютера сетевой интерфейс принципиально может быть сконфигурирован тремя видами: вручную/специализированным софтом, статически заданными настройками и через DHCP-клиент. (Есть ещё сколько-то экзотики, но эти три — основные методы). Первый метод нам не интересен, со статической конфигурацией всё просто — как написано, так и будет. DHCP интересен тем, что компьютер запрашивает настройки по сети «у кого-то». Протокол DCHP имеет множество опций (настроек), которые могут изменять совершенно неожиданные настройки компьютера — часовой пояс, адрес сервера с точным временем, таблицу маршрутизации, имя или домен сервера, и т.д. Из всего этого нас интересует возможность задавать настройки DNS.

Традиционно, настройки DNS-ресолвера хранятся в файле /etc/resolv.conf, и после обновления dhcp-аренды этот файл обновляется. В этой статье объясняется, как именно «-ся» этот файл.

Устройство DHCP client

Существует несколько реализаций dhcp-клиента, нас интересует ISC DHCP, как наиболее распространённая.
Сам клиент называется /sbin/dhclient, однако, стандартно, для обновления настроек, вызывается не он, а /sbin/dhclient-script. dhclient-script вызывает dhclient и использует его ответ для изменения разных частей системы. В самом dhclient-script есть функция make_resolv_conf, которая, собственно, и создаёт файл resolv.conf.

Для удобства модификации (и запутывания системных администраторов) у dhclient-script’а есть хуки. Их положение разнится (в Ubuntu Xenial и Debian Stretch это /etc/dhcp/dhclient-exit-hooks.d, для какой-то версии Centos — /etc/dhclient-enter-hooks/ и т.д.). Хуки есть двух видов — entry и exit. Entry вызываются до основного когда dhclient-script, exit в конце. В хуках можно прописать свою версию функции make_resolv_conf(), и тогда dhclient-script будет вызывать её, а не встроенную. Что именно происходит с арендой определяет переменная reason (примеры значений: PREINIT, BOUND, RENEW, REBIND, REBOOT, EXPIRE, FAIL, RELEASE, etc). Спасибо maxzhurkin за указания на (исправленные) неточности в этом разделе.

Resolvconf

Этим активно пользуются авторы пакета resolvconf, который позволяет формировать файл /etc/resolv.conf по заданному шаблону (а не фиксированно, как в случае родной реализации dhclient-script). Они кладут файл (в Debian/Ubuntu) /etc/dhcp/dhclient-enter-hooks.d/resolvconf, который вызывает resolvconf -u (обновление) для создания новой версии resolvconf’а.

Чтобы не мешать жить dhcpclient-script, resolvconf управляет файлом /run/resolvconf/resolv.conf, а пакет resolvconf (не путать с программой, которую он предоставляет) при установке заменяет /etc/resolvconf на симлинк ../run/resolvconf/resolv.conf.

Типовой проблемой при использовании resolvconf’а является отсутствие симлинка. Если его нет, то dhclient-script будет просто перезаписывать /etc/resolv.conf с настройками от DHCP-сервера, а resolvconf будет обновлять свой файл в уголочке, лишь выдавая предупреждение, что /etc/resolv.conf не симлинк.

Шаблоны resolvconf’а довольно просты:

  • /etc/resolvconf/resolv.conf.d/head
  • /etc/resolvconf/resolv.conf.d/base
  • /etc/resolvconf/resolv.conf.d/tail

head и tail просто дописываются куда положено, а вот base позволяет всякие странные штуки, которые описываются в man resolvconf в разделе «CONSUMERS OF NAMESERVER INFORMATION»).

Специфика RHEL/Centos/Fedora

Red Hat использует свою версию скрипта dhclient-script, весьма обширную и сложную, учитывающую множество настроек из ifcfg-ethXXX, в частности, интересовавшую меня опцию RES_OPTIONS. Debian и Ubuntu используют большей частью апстримовую версию, в которой такие изыски отсутствуют. В Centos 7 одно время в этом скрипте был баг, приводивший к тому, что при наличии строчки ‘options’ в /etc/resolv.conf при перезагрузке, из него удалялись все остальные строчки, кроме строчки с options, причём новые DNS-сервера в файл не добавлялись.

Centos 7 настройка сети

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

Настройка сети во время установки

Логично, что для упрощения настройки разработчики CentOS позаботились сделать все как можно дружелюбнее. У вас как у пользователя есть возможность на вкладке Network & Hostname сразу задать статический ip адрес при установке.

Как установить CentOS 7-20

Выбираем нужный сетевой интерфейс и нажимаем справа Configure.

Как установить CentOS 7-21

Переходим в пункт ipv4 и выбираем manual, то есть в ручную.

Как установить CentOS 7-22

Прописываем ваши данные такие как

  • ip адрес
  • маску подсети
  • шлюз
  • dns сервера

Как установить CentOS 7-23

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

centos 7 настройка сети

Для того, чтобы у вас все получилось вам нужно быть администратором (root) данной системы, о чем будет говорить значок решетки #.

centos 7 настройка сети

Вводим ifconfig. Команда выводит текущие сетевые интерфейсы. У вас их может быть много, но заведите себе правило, если это сервер, то он обязательно должен иметь статику, ни в коем случае не оставляйте DHCP.

Настройка сети CentOS 6 (3)

Видим, что только есть интерфейс замыкания. В CentOS по умолчанию сетевой интерфейс отключен. Как его включить читаем ниже.

Установка в centos ifconfig

Если у вас выскакивает ifconfig: команда не найдена или ifconfig: command not found то не расстраивайтесь, ее забыли добавить в минимальную версию, как только настроите сеть по инструкции ниже, то сможете установить ее, только после настройки сети.

Посмотрим в состав какого пакета она входит

И собственно установим сам ifconfig в centos 7

установить ifconfig centos 7

Centos настройка сети из консоли

Самый распространенный метод, который позволяет произвести в centos настройку сети из консоли, да то самое черное окно, его преимущества в том, что требуется минимальная скорость сетевого подключения к серверу, в отличии от графики, очень пригодится если редактировать настройки Centos при большой нагрузке на сервер. Пишем vi или nano кому что нравится.

Настройка сети CentOS 6 (4)

Хочу отметить, что название интерфейса у вас может быть другое, отличное от ifcfg-eth0, но тоже будет начинаться с ifcfg-. Посмотреть список интерфейсов можно командой

Вот пример названия ifcfg-ens192

centos 7 настройка сети

Еще можно посмотреть командой

centos 7 настройка сети-02

Внесите/измените записи в файле для задания статической настройки сетевого интерфейса:

Собственно как понятно из файла, IP адрес он получает от DHCP сервера, поэтому выключаем DHCP и меняем настройки на ститику.Для редактирования жмем Insert.

После редактирования жмем ESC потом :wq (Что значит записать и выйти)

Настройка сети CentOS 6 (5)

После выхода пишем ifdown eth0 на всякий случай тушим интерфейс, потом ifup eth0 поднимаем интерфейс.

Видим, что сетевой интерфейс поднялся.

Настройка сети CentOS 6 (6)

Настройка DNS на сетевом интерфейсе CentOS 7

Пропишем DNS. они находятся в файле resolv.conf. Пишем.

И прописываем в нем nameserver 192.168.102.1

Настройка сети CentOS 6 (7)

перезапускаем интерфейс командой

service network restart

Настройка сети CentOS 6 (8)

Пингуем яндекс, видим, что все ок.

Настройка сети CentOS 6 (10)

Если у вас два интерфейса и вам нужно поставить основной, то делается это в файле /etc/sysconfig/network

Так же тут можно поменять имя хоста.

Настройка сети CentOS 6 (11)

Задаем шлюз и имя сервера

Настройка сети CentOS 6 (12)

Третий способ. Утилита system-config-network-tui

поставить ее можно из репозитория.

yum install -y system-config-network-tui

После установки пишем system-config-network-tui

Настройка сети CentOS 6 (17)

Выбираем Device configuration

Настройка сети CentOS 6 (19)

Выбираем нужный интерфейс

Настройка сети CentOS 6 (20)

Настройка сети CentOS 6 (21)

Настройка сети CentOS 6 (22)

Задаем нужные DNS сервера и имя сервера

Настройка сети CentOS 6 (23)

Save & out.

Настройка сети CentOS 6 (24)

Четвертый способ через консоль mc

ставим ее yum install mc -y

Запускаем командой mc. Переходим для примера в каталог /etc/sysconfig/network-scripts

выбираем ifcfg-eth0 и нажимаем F4. Выбираем 3 пункт редактировать с помощью mc.

Как в CentOS 6-7 настроить статический ip адрес-01

Как в CentOS 6-7 настроить статический ip адрес-01

Как в CentOS 6-7 настроить статический ip адрес-02

Как в CentOS 6-7 настроить статический ip адрес-02

F10 чтобы выйти.

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

Читайте также:  Аренда сервера CS:GO с тестовым периодом | CS Projects

Что мы научимся делать

  1. Разберем способы позволяющие вам настроить сеть в CentOS 8
  2. Научимся задавать статический IP-адрес в CentOS 8
  3. Настраивать DNS и основной шлюз в CentOS 8
  4. Получать IP-адрес по DHCP, автоматически в CentOS 8
  5. Разберем утилиты Network Manager, System config network tui, Nmcli
  6. Находить и дублировать сетевую конфигурацию сети
  7. Как создать конфигурацию виртуального интерфейса
  8. Разберем траблшутинг сети, отсутствие сетевых карт, недоступен шлюз. Разберем использование утилит ping, traceroute, dig
  9. Покажу как производится настройка VLAN в CentOS 8

Настройка сети при установке CentOS 8

Подобный методом мы рассматривали, когда во время установки задавали статический Ip адрес CentOS 7, кто не помнит может посмотреть по ссылке. Данный способ хорош тем, что если вы инсталлируете новый сервер, можете все сделать из красивого, графического интерфейса. Находясь на окне «Installation Summary» вам необходимо выбрать пункт «Network & Host Name«.

Настройка сети при установке CentOS 8

В окне «Network & Host Name» вы увидите список ваших сетевых интерфейсов, они по умолчанию отключены. В моем примере их два. Каждый сетевой интерфейс имеет отличительное имя, в моем примере, это ens33 и ens36. Видно, что текущий статус «Disconnected», чтобы это изменить переведите тумблер с состояния «Off» на «On«.

Список сетевых адаптеров при установке CentOS 8

Centos 8 настройка сети

В окне свойств сетевого интерфейса найдите вкладку IPV4 Settings, обратите внимание, что тут будет поле «Method«, в котором по умолчанию стоит «Automatic (DHCP)», то есть динамическое получение сетевых настроек в CentOS 8. На выбор у вас будут вот такие пункты:

  • Automatic (DHCP) — автоматическое получение всех настроек: IP, маску, DNS, Основной шлюз, маршруты
  • Automatic (DHCP) addresses only — вы получите автоматически только IP-адрес
  • Manual — ручная настройка сети CentOS 8
  • Link-Local Only — Локальные ссылки назначаются автоматически, когда компьютер не настроен на использование статического IP-адреса и не может найти DHCP-сервер. По сути, то APIPA адрес из диапазона 169.254.0.0
  • Shared to other computers — это совместное использование сетевого интерфейса. Простой пример у вас есть сервер с двумя сетевыми интерфейсами один LAN второй WAN, и есть другой сервер, где просто один сетевой интерфейс с LAN и без интернета. Вы можете выставить на первом сервере WAN в режим «Shared to other computers» и указать его в маршрутах для выхода в интернет.
  • Disabled — отключение получения настроек

Выбор метода получения IP адреса в CentOS 8

Настройка статического IP адреса при установке CentOS 8

Галка «Require IPv4 addressing for this connection to complete (Требовать адресацию IPv4 для этого соединения)» — Чтобы разрешить системе устанавливать это соединение в сети с поддержкой IPv6, если конфигурация IPv4 завершится неудачно, но конфигурация IPv6 будет успешной. Кнопка «Routes» позволяет вам настроить дополнительные маршруты в CentOS 8.

Настройка маршрутов при установке CentOS 8

Настройка IPv6 при установке CentOS 8

Если вы хотите задать настройки для IPv6, то перейдите на соответствующую вкладку. Возможные варианты настройки:

  • Игнорировать (Ignore) — IPv6 игнорируется для этого соединения.
  • Автоматическая (Automatic) — NetworkManager использует объявление маршрутизатора (RA) для создания автоматической конфигурации без сохранения состояния.
  • Автоматически, только адреса (Automatic, addresses only) — NetworkManager использует RA для создания автоматической конфигурации без сохранения состояния, но DNS-серверы и поисковые домены игнорируются и должны настраиваться вручную.
  • Автоматический, только DHCP (Automatic, DHCP only) — NetworkManager не использует RA, но запрашивает информацию у DHCPv6 напрямую для создания конфигурации с сохранением состояния.
  • Ручная (Manual) — Параметры IPv6 настраиваются вручную для статической конфигурации.
  • Link-Local Only — link-local адрес с FE80 ::/10 префиксом назначается интерфейсу

Настройка сети CentOS 8 через конфигурационные файлы

Первый метод мы с вами разобрали, он подходит всем, кто делает установку системы сам. Теперь ситуация, когда вам передали уже готовую CentOS 8, пусть в установке Minimal, это стандартный нормальный вариант использования CentOS 8, в качестве серверной ОС. Нет графики, нет кучи компонентов, меньше фронт атаки. Подключаемся к вашему терминалу. Первое, что вам необходимо сделать, это посмотреть список и названия всех ваших сетевых интерфейсов, для этого есть команда:

ip a (То же самое, что и ввести ip addr show)

Как видим у меня два сетевых интерфейса ens33 и ens36. У меня почему, то у интерфейса ens33 нет IPv4 адреса, у второго я получил 192.168.253.145, это мой интернет шнурок.

Просмотр всех сетевых карт entos 8

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

Но в случае с CentOS 8 Minimal у вас выскочит ошибка «Command not found» или в русском варианте «ifconfig команда не найдена«. Нам ее нужно установить

ifconfig command not found

Установка IFCONFIG в CentOS 8

Давайте выясним, в каком пакете у нас идет утилита IFCONFIG, для этого вам необходимо выполнить команду:

На выходе я получил «Basic networking tools (BaseOS)»

Установка ifconfig centos 8

Установим данный пакет, пишем команду:

install ifcfg on centos 8

Вас спросят хотите ли вы установить данный пакет net-tools, нажмите «Y». Видим, что все успешно установилось.

Установка ifcfg centos 8 minimal

Пробуем теперь запустить IFCONFIG. Как видим в таком варианте считывание информации, о настройках сети CentOS 8 куда приятнее.

утилита ifconfig

Давайте теперь я отредактирую сетевые настройки для интерфейса ens33 и задам ему:

  • IP — 192.168.31.31
  • Маску — 255.255.255.0
  • Шлюз — 192.168.31.1
  • DNS — 192.168.31.1, 192.168.31.2
  • Автоматическое включение при старте CentOS 8

В операционных системах CentOS настройки сетевых интерфейсах лежат по пути /etc/sysconfig/network-scripts/. Давайте посмотрим содержимое Для этого введите:

Вы увидите конфигурационные файлы ваших сетевых интерфейсов, в моем случае, это ens33 и ens36

Список конфигурационных файлов утещы 8

Чтобы настроить сеть на интерфейсах CentOS 8, вам необходимо отредактировать нужный конфигурационный файл. Для этого я воспользуюсь встроенным редактором vi. Пишем команду:

Чтобы начать редактировать файл нажмите клавишу «INSERT«

Настройка статического IP centos 8

  • TYPE=Ethernet
  • BOOTPROTO=none (означает задать статические настройки), можно поменять значение на DHCP
  • NAME=ens33
  • ONBOOT=yes (иначе не будет стартовать при запуске)
  • NAME=ens33 мое имя интерфейса
  • UUID можно менять при клонировании конфигурационного файла
  • IPADDR=192.168.31.31 мой IP-адрес
  • PREFIX=24 маска 255.255.255.0
  • DNS1=192.168.31.1 мой основной DNS
  • DNS2=192.168.31.2 дополнительный DNS
  • DOMAIN=root.pyatilistnik.org
  • GATEWAY=192.168.31.1 основной шлюз

Настройка сети centos 8 через конфиг

Чтобы сохранить настройки нажмите ESC, потом введите :wq  если нужно выйти без сохранения введите :qa!

Сохранение сетевых настроек centos 8

Получение ip по dhcp в Centos 8

осталось теперь поднять наш сетевой интерфейс для этого есть несколько методов, самый простой использование ifup введите:

Как видим, у меня сетевой интерфейс стал в состояние подключено и я вижу через ifconfig его ip адрес.

Поднимаем интерфейс в centos 8

Проверим через утилиту PING доступность контроллера домена и другого сервера, отлично пакеты ходят.

ping в centos 8

Другие методы перезапустить сеть CentOS 8

Чтобы так же поднять сетевой интерфейс вы можете ввести команду:

systemctl restart NetworkManager.service

В итоге я вижу успешный перезапуск сети в CentOS 8.

Перезапуск сети centos 8

Снова потушу сетевой интерфейс командой:

Для перезапуска сети введите команду:

nmcli connection up ens33

nmcli перезапуск сети в centos 8

Как настроить DNS в CentOS 8

Начиная с CentOS 6, основные настройки DNS стали прописываться в файлах /etc/sysconfig/network-scripts/, но в CentOS есть специальный файл куда попадают настройки из конфига интерфейса, называется он resolv.conf. Честно не знаю, почему так сделали. Resolv.conf — это имя компьютерного файла, используемого в различных операционных системах для настройки преобразователя системы доменных имен (DNS). Файл представляет собой простой текстовый файл, который обычно создается сетевым администратором или приложениями, которые управляют задачами конфигурации системы. Программа resolvconf — это одна из таких программ на FreeBSD или других Unix- машинах, которая управляет файлом resolv.conf.

ссылка на руководство resolf.conf http://man7.org/linux/man-pages/man5/resolv.conf.5.html

Хочу отметить, что если вы соберетесь редактировать отдельно файл Resolv.conf  и вносить альтернативные DNS сервера отличные от тех, что прописаны на сетевых интерфейсах, то после перезагрузки сервера они снова будут затерты на те, что прописаны в конфигурационных файлах сетевых интерфейсов. Давайте я для примера добавлю в это файл сервера Google 8.8.8.8 и 8.8.4.4.

Редактирование resolv.conf

systemctl restart NetworkManager.service

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

Просмотр файла resolf.cfg

Как изменить имя в CentOS 8

Давайте я покажу вам какой конфигурационный файл отвечает за имя хоста (Hostname). Если вы или не вы во время установки CENTOS 8 не удосужились задать правильное DNS имя вашего сервера, то у вас оно по умолчанию будет localhost.localdomain. Посмотреть, это можно командой uname или hostname.

В моем примере, это CentOS 8

поменять имя centos 8

Предположим, что я хочу сделать имя SuperCentOS01, для этого отредактируйте конфигурационный файл etc/hostname. Пишем команду;

Меняем имя в centos 8

либо вы можете воспользоваться и вот такой командой, чтобы задать нужное имя хоста в CentOS 8:

hostnamectl set-hostname SuperCentos01

Установка имени в CentOS 8

Настройка шлюза по-умолчанию в CentOS 8

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

Настройка шлюза по-умолчанию в CentOS 8

Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.253.2 0.0.0.0 UG 0 0 0 ens36
192.168.31.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
192.168.253.0 0.0.0.0 255.255.255.0 U 0 0 0 ens36

В итоге в моем примере есть основной шлюз 0.0.0.0 192.168.235.2. Напоминаю, что в системе может быть только один шлюз по умолчанию.

Если хотите поменять его, то для этого вы можете ввести команду:

route add default gw 192.168.31.1

Если нужно удалить шлюз или маршрут, то для этого есть ключ del.

route del default gw 192.168.31.1

Настройка сети CentOS 8 через Nmcli

Настройка сети CentOS 8 через Nmcli

Давайте теперь для интерфейса настроим сеть вот с такими параметрами:

  • Ip — поменяем на 192.168.31.10/24
  • Шлюзом сделаю 192.168.31.131
  • DNS 192.168.31.231

nmcli con mod ens33 ipv4.address 192.168.31.10/24

далее зададим шлюз:

nmcli con mod ens33 ipv4.gateway 192.168.31.131

nmcli con mod ens33 ipv4.dns 192.168.31.231

Теперь нужно перезапустить ваш сетевой интерфейс или сеть centOS 8. Сделать, это можно командой:

ifdown ens33 && ifup ens33

Эти изменения также будут сохранены в файле /etc/ sysconfig/network-scripts/ens33.

nmcli con mod ens33 +ipv4.addresses 192.168.31.32/24

Добавить дополнительный DNS:

nmcli con mod ens33 +ipv4.dns 8.8.8.8

Как видите утилита nmcli позволяет очень быстро задать статический IP или произвести полную настройку сети в CentOS 8.

В данной статье мы рассмотрим способы настройки сети в системах Linux CentOS 7/8, покажем, как настраивать сетевых интерфейсов через конфигурационные файлы, основные утилиты для настройки сети и многое другое. Это актуальная тема, так как изначально настройка любого сервера начинается с настройки на нем сети.

В статье мы покажем особенности настройки сети в CentOS 7 с помощью стандартного сервиса network. Посмотрим, как использовать для настройки сети NetworkManager (NM), который предлагается по-умолчанию в CentOS 8.

Оцените статью
Хостинги