DNS в CentOS
Введение
Про DNS в целом вы можете прочитать в статье
« Domain Name System »
BIND - Berkeley Internet Name Domain. Самая популярная DNS в мире.
Подготовка к установке
Перед установкой bind обновите систему и убедитесь, что у вас установлен epel-release
sudo yum update
sudo yum upgrade
yum list epel-release
Loaded plugins: fastestmirror, langpacks Determining fastest mirrors * base: mirror.hosthink.net * epel: www.nic.funet.fi * extras: mirror.hosthink.net * updates: mirror.hosthink.net Installed Packages epel-release.noarch
Installed означает, что у меня epel-release установлен
Если вместо Installed вы видите Available - тогда установите командой
sudo yum install epel-release
Установка BIND
Проверить наличие bind можно выполнив
yum list bind
Loaded plugins: fastestmirror, langpacks Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast Determining fastest mirrors * base: mirror.hosthink.net * epel: mirror.yandex.ru * extras: mirror.hosthink.net * updates: mirror.hosthink.net Available Packages bind.x86_64 32:9.11.4-26.P2.el7_9.5 updates
Available означает, что пакет не установлен но доступен для установки.
Установить bind и bind-utils (нужен, например, для dig) можно командой
sudo yum install -y bind bind-utils
Loaded plugins: fastestmirror, langpacks You need to be root to perform this command. [andrei@localhost ~]$ sudo yum install -y bind bind-utils Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile epel/x86_64/metalink | 29 kB 00:00 * base: mirror.hosthink.net * epel: mirror.yandex.ru * extras: mirror.hosthink.net * updates: mirror.hosthink.net base | 3.6 kB 00:00 epel | 4.7 kB 00:00 extras | 2.9 kB 00:00 updates | 2.9 kB 00:00 (1/4): epel/x86_64/updateinfo | 1.0 MB 00:01 (2/4): extras/7/x86_64/primary_db | 243 kB 00:01 (3/4): epel/x86_64/primary_db | 7.0 MB 00:03 (4/4): updates/7/x86_64/primary_db | 11 MB 00:05 Resolving Dependencies --> Running transaction check ---> Package bind.x86_64 32:9.11.4-26.P2.el7_9.7 will be installed --> Processing Dependency: bind-libs-lite(x86-64) = 32:9.11.4-26.P2.el7_9.7 for package: 32:bind-9.11.4-26.P2.el7_9.7.x86_64 --> Processing Dependency: bind-libs(x86-64) = 32:9.11.4-26.P2.el7_9.7 for package: 32:bind-9.11.4-26.P2.el7_9.7.x86_64 ---> Package bind-utils.x86_64 32:9.11.4-26.P2.el7_9.5 will be updated ---> Package bind-utils.x86_64 32:9.11.4-26.P2.el7_9.7 will be an update --> Running transaction check ---> Package bind-libs.x86_64 32:9.11.4-26.P2.el7_9.5 will be updated ---> Package bind-libs.x86_64 32:9.11.4-26.P2.el7_9.7 will be an update --> Processing Dependency: bind-license = 32:9.11.4-26.P2.el7_9.7 for package: 32:bind-libs-9.11.4-26.P2.el7_9.7.x86_64 ---> Package bind-libs-lite.x86_64 32:9.11.4-26.P2.el7_9.5 will be updated ---> Package bind-libs-lite.x86_64 32:9.11.4-26.P2.el7_9.7 will be an update --> Running transaction check ---> Package bind-license.noarch 32:9.11.4-26.P2.el7_9.5 will be updated ---> Package bind-license.noarch 32:9.11.4-26.P2.el7_9.7 will be an update --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: bind x86_64 32:9.11.4-26.P2.el7_9.7 updates 2.3 M Updating: bind-utils x86_64 32:9.11.4-26.P2.el7_9.7 updates 261 k Updating for dependencies: bind-libs x86_64 32:9.11.4-26.P2.el7_9.7 updates 157 k bind-libs-lite x86_64 32:9.11.4-26.P2.el7_9.7 updates 1.1 M bind-license noarch 32:9.11.4-26.P2.el7_9.7 updates 91 k Transaction Summary ================================================================================ Install 1 Package Upgrade 1 Package (+3 Dependent packages) Total download size: 3.9 M Downloading packages: No Presto metadata available for updates (1/5): bind-libs-9.11.4-26.P2.el7_9.7.x86_64.rpm | 157 kB 00:00 (2/5): bind-9.11.4-26.P2.el7_9.7.x86_64.rpm | 2.3 MB 00:02 (3/5): bind-libs-lite-9.11.4-26.P2.el7_9.7.x86_64.rpm | 1.1 MB 00:01 (4/5): bind-license-9.11.4-26.P2.el7_9.7.noarch.rpm | 91 kB 00:00 (5/5): bind-utils-9.11.4-26.P2.el7_9.7.x86_64.rpm | 261 kB 00:00 -------------------------------------------------------------------------------- Total 1.8 MB/s | 3.9 MB 00:02 Running transaction check Running transaction test Transaction test succeeded Running transaction Updating : 32:bind-license-9.11.4-26.P2.el7_9.7.noarch 1/9 Updating : 32:bind-libs-lite-9.11.4-26.P2.el7_9.7.x86_64 2/9 Updating : 32:bind-libs-9.11.4-26.P2.el7_9.7.x86_64 3/9 Installing : 32:bind-9.11.4-26.P2.el7_9.7.x86_64 4/9 Updating : 32:bind-utils-9.11.4-26.P2.el7_9.7.x86_64 5/9 Cleanup : 32:bind-utils-9.11.4-26.P2.el7_9.5.x86_64 6/9 Cleanup : 32:bind-libs-9.11.4-26.P2.el7_9.5.x86_64 7/9 Cleanup : 32:bind-libs-lite-9.11.4-26.P2.el7_9.5.x86_64 8/9 Cleanup : 32:bind-license-9.11.4-26.P2.el7_9.5.noarch 9/9 Verifying : 32:bind-9.11.4-26.P2.el7_9.7.x86_64 1/9 Verifying : 32:bind-libs-9.11.4-26.P2.el7_9.7.x86_64 2/9 Verifying : 32:bind-utils-9.11.4-26.P2.el7_9.7.x86_64 3/9 Verifying : 32:bind-libs-lite-9.11.4-26.P2.el7_9.7.x86_64 4/9 Verifying : 32:bind-license-9.11.4-26.P2.el7_9.7.noarch 5/9 Verifying : 32:bind-libs-9.11.4-26.P2.el7_9.5.x86_64 6/9 Verifying : 32:bind-libs-lite-9.11.4-26.P2.el7_9.5.x86_64 7/9 Verifying : 32:bind-utils-9.11.4-26.P2.el7_9.5.x86_64 8/9 Verifying : 32:bind-license-9.11.4-26.P2.el7_9.5.noarch 9/9 Installed: bind.x86_64 32:9.11.4-26.P2.el7_9.7 Updated: bind-utils.x86_64 32:9.11.4-26.P2.el7_9.7 Dependency Updated: bind-libs.x86_64 32:9.11.4-26.P2.el7_9.7 bind-libs-lite.x86_64 32:9.11.4-26.P2.el7_9.7 bind-license.noarch 32:9.11.4-26.P2.el7_9.7 Complete!
Пакет, который мы установили называется bind но сервис назывется named
Поэтому для запуска сервиса при загрузке системы нужно выполнить
sudo systemctl enable named
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.
Пока он не запущен статус будет inactive (dead)
systemctl status named
● named.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled) Active: inactive (dead)
Запуск named
sudo systemctl start named
Перезапуск named
sudo systemctl restart named
РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе
Конец рекламы от Яндекса. Если в блоке пусто считайте это рекламой моей телеги
Проверка состояния named
sudo systemctl status -l named
● named.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2024-09-15 15:48:30; EEST; 1s ago Process: 3143 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS) Process: 3141 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS) Main PID: 3145 (named) Tasks: 4 CGroup: /system.slice/named.service └─3145 /usr/sbin/named -u named -c /etc/named.conf Sep 15 15:48:30 localhost.localdomain named[3145]: network unreachable resolving './DNSKEY/IN': 2001:500:2f::f#53 Sep 15 15:48:30 localhost.localdomain named[3145]: network unreachable resolving './NS/IN': 2001:500:2f::f#53 Sep 15 15:48:30 localhost.localdomain named[3145]: network unreachable resolving './DNSKEY/IN': 2001:500:12::d0d#53 Sep 15 15:48:30 localhost.localdomain named[3145]: network unreachable resolving './NS/IN': 2001:500:12::d0d#53 Sep 15 15:48:30 localhost.localdomain named[3145]: network unreachable resolving './DNSKEY/IN': 2001:503:c27::2:30#53 Sep 15 15:48:30 localhost.localdomain named[3145]: network unreachable resolving './DNSKEY/IN': 2001:500:12::d0d#53 Sep 15 15:48:30 localhost.localdomain named[3145]: network unreachable resolving './DNSKEY/IN': 2001:500:9f::42#53 Sep 15 15:48:30 localhost.localdomain named[3145]: network unreachable resolving './DNSKEY/IN': 2001:500:a8::e#53 Sep 15 15:48:30 localhost.localdomain named[3145]: resolver priming query complete Sep 15 15:48:30 localhost.localdomain named[3145]: managed-keys-zone: Key 20326 for zone . acceptance timer complete: key now trusted
Проверка iptables
sudo iptables -L
На чистой системе, скорее всего не будет никаких правил
Chain INPUT (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination
Если уже включен firewall то открыть нужно порт 53
Проверка netstat
Изучить, какие слушаютс порты можно с помощью netstat
netstat -ltn
Если named выключен
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN
Если named включен
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 ::1:53 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:953 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN
Порт 53 слушается для DNS lookup
Порт 953 используется для контроля за DNS сервером
Полный список TCP/UDP портов вы можете изучить
здесь
dig: Выполнить DNS запрос
На внешнем сервере
Чтобы выполнить dig достаточно установить bind-utils
dig www.eth1.ru
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7 <<>> www.eth1.ru ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23334 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4000 ;; QUESTION SECTION: ;www.eth1.ru. IN A ;; ANSWER SECTION: www.eth1.ru. 600 IN A 87.236.16.208 ;; Query time: 37 msec ;; SERVER: 10.10.10.1#53(10.10.10.1) ;; WHEN: Mon Sep 13 12:16:40 EEST 2021 ;; MSG SIZE rcvd: 67
На своём DNS сервере
Если bind установлен и запущен, можно делать dig на нём.
[root@dns-server ~]# dig www.eth1.ru @127.0.0.1
Если named выключен или bind не установлен - вы не сможете сделать dig на локальном хосте.
Получите, например ;; connection timed out; no servers could be reached
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7 <<>> www.eth1.ru @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4712 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 6, ADDITIONAL: 3 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.eth1.ru. IN A ;; ANSWER SECTION: www.eth1.ru. 600 IN A 87.236.16.208 ;; AUTHORITY SECTION: ANDREYOLEGOVICH.ru. 345600 IN NS ns1.beget.pro. ANDREYOLEGOVICH.ru. 345600 IN NS ns2.beget.com. ANDREYOLEGOVICH.ru. 345600 IN NS ns1.beget.RU. ANDREYOLEGOVICH.ru. 345600 IN NS ns2.beget.RU. ANDREYOLEGOVICH.ru. 345600 IN NS ns1.beget.com. ANDREYOLEGOVICH.ru. 345600 IN NS ns2.beget.pro. ;; ADDITIONAL SECTION: ns2.BEGET.ru. 345600 IN A 185.50.27.12 ns1.BEGET.ru. 345600 IN A 5.101.159.11 ;; Query time: 298 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sun Sep 15 15:48:30 EEST 2024 ;; MSG SIZE rcvd: 263
Обратите внимание - теперь в ответе содержится AUTHORITY SECTION.
Из неё можно узнать, что домен
eth1.ru
находится в зоне ответственности ns1.beget.pro. и ещё пяти beget серверов.
Подробности в статье DNS
Лично от себя рекомендую всем именно сервисы
beget.com. Как вы могли убедиться - сам ими пользуюсь.
dig mail.google.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7 <<>> mail.google.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5444 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;mail.google.com. IN A ;; ANSWER SECTION: mail.google.com. 61158 IN CNAME googlemail.l.google.com. googlemail.l.google.com. 258 IN A 216.58.207.197 ;; Query time: 2 msec ;; SERVER: 192.168.0.1#53(192.168.0.1) ;; WHEN: Sat Sep 11 22:04:54 EEST 2021 ;; MSG SIZE rcvd: 87
Типы DNS серверов: caching и forwarding
Кэширующий DNS-сервер работает, выполняя все DNS-запросы, выполняемые вашей системой, а затем сохраняя или кэшируя результаты в памяти.
Перенаправляющий DNS-сервер отправляет запрос другому серверу и ждёт пока тот сделает работу за него.
Подробнее изуть особенности caching и forwarding серверов вы можете в статье «Типы DNS серверов»
named.conf - файл с конфигурацией named
Файл с настройками называется named.conf и лежит в
/etc
Настройка caching DNS сервера
Внесём небольшие изменения в файл с конфигурацией
vi /etc/named.conf
// // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // // See the BIND Administrator's Reference Manual (ARM) for details about the // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html options { listen-on port 53 { 127.0.0.1; }; 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"; recursing-file "/var/named/data/named.recursing"; secroots-file "/var/named/data/named.secroots"; allow-query { localhost; }; /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. - If your recursive DNS server has a public IP address, you MUST enable access control to limit queries to your legitimate users. Failing to do so will cause your server to become part of large scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ recursion yes; dnssec-enable yes; dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.root.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
Внесём изменения
options { listen-on port 53 { any; }; listen-on-v6 port 53 { none; };
Проверка конфигурации
[root@dns-server ~]# named-checkconf
[root@dns-server ~]# named-checkconf -v
9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7
systemctl restart named
[root@dns-server ~]# netstat -ltn
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 192.168.56.149:53 0.0.0.0:* LISTEN tcp 0 0 10.0.2.49:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:953 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN
На IPv6 больше не слушается порт 53. Количество IPv4 адресов на которых теперь слушается порт 53 увеличилось - сравните с тем что было раньше если не запомнили.
query: Запросы
Разрешить запросы к серверу можно указав нужный хост или сеть в allow-query
options { listen-on port 53 { any; }; listen-on-v6 port 53 { none; }; 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"; recursing-file "/var/named/data/named.recursing"; secroots-file "/var/named/data/named.secroots"; allow-query { localhost; 192.168.56.0/24 };
РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет
Конец рекламы хостинга Beget, который я всем рекомендую.
Использовать DNS сервер из локальной сети
В данном примере в сети есть два хоста:
dns-server.andrei.com
с IP адресом
192.168.56.149
host113.andrei.com с IP адресом
192.168.56.113
Напоминаю, что в named.conf внесены следующие изменения
options { listen-on port 53 { any; }; listen-on-v6 port 53 { none; }; … allow-query { localhost; 192.168.56.0/24 };
На сервере 192.168.56.149 нужно открыть порт 53 для tcp и udp
[root@dns-server ~]# firewall-cmd --zone=public --add-port=53/tcp --permanent
[root@dns-server ~]# firewall-cmd --zone=public --add-port=53/udp --permanent
[root@dns-server ~]# firewall-cmd --reload
Полный список портов вы можете изучить в статье
« Компьютерные сети »
Подробнее про работу с Firewall читайте в статье
« CentOS Firewall »
На хосте 192.168.56.113 теперь можно выполнить dig @192.168.56.149
и если dns-server имеет нужные данные это должно сработать.
В этом примере по умолчанию установлено
recursion yes;
Если у вас это не сделано - для того, чтоб делать запросы к неизвестным именам - нужно разрешить серверу делать рекурсивные запросы .
[root@host113 ~]# dig www.heihei.ru @192.168.56.149
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7 <<>> www.heihei.ru @192.168.56.149 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44716 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.heihei.ru. IN A ;; ANSWER SECTION: www.heihei.ru. 598 IN A 87.236.16.208 ;; Query time: 84 msec ;; SERVER: 192.168.56.149#53(192.168.56.149) ;; WHEN: Mon Sep 13 14:30:39 EEST 2021 ;; MSG SIZE rcvd: 58
РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе
Конец рекламы от Яндекса. Если в блоке пусто считайте это рекламой моей телеги
Настройка forwarding DNS сервера
vi /etc/named.conf
Оставим конфиг из предыдущего примера и допишем в конец блока options
options { … forwarders { 8.8.8.8; 8.8.4.4; 1.1.1.1; 1.0.0.1; }; forward only;
8.8.8.8; 8.8.4.4; - это публичные DNS сервера Google
1.1.1.1; 1.0.0.1; - это публичные DNS сервера Cloudflare
Порядок перечисления не имеет значения - будет использоваться тот, от которого быстрее отклик.
forward может принимать одно из двух значений: first или only
Подробнее опции first и only вы можете изучить в статье forward
РЕКЛАМА от Google. Может быть недоступна в вашем регионе.
Конец рекламы от Google. Если в блоке пусто считайте это рекламой моей телеги