Налаштування первинного DNS-сервера на базі NSD
18 Вересень 2016
Setting master DNS server using NSD
Як відомо, основною функцією DNS-сервера є перетворення текстових імен вузлів в мережі Інтернет ( доменів ) В числові IP-адреси, з допомогою яких і здійснюється маршрутизація даних. Крім цього на базі тієї ж технології Domian Name System в даний час реалізуються багато технологій, пов'язані із забезпеченням безпеки, аутентифікації і політики доступу, а також автоматизації налаштувань клієнтського програмного забезпечення.
Для вирішення цих проблем розумним рішенням представляється організація свого власного первинного DNS на базі програмного рішення, яке буде підтримувати сучасні технології. До числа подібних, безумовно, відноситься і DNS-сервер NSD .
Розглянемо приклад налаштування DNS-зони для домену kostikov.co, який використовує цей сайт .
Всі настройки будуть проводитися на базі FreeBSD .
root @ beta: ~ # uname -v FreeBSD 11.0-RC2 # 0 r304729: Wed Aug 24 6:59:03 UTC 2016 [email protected]: / usr / obj / usr / src / sys / GENERICДля початку необхідно встановити сам пакет NSD. З огляду на те, що опції за замовчуванням підібрані розумно, можна встановити його з пакетів. Але я скористаюся традиційної складанням з виходячи текстів через систему портів Freebsd , Додавши функціонал збірки статистики і відключивши відсутня в даній системі IPv6.
root @ beta: ~ # cd / usr / ports / dns / nsd / root @ beta: / usr / ports / dns / nsd # make config ... root @ beta: / usr / ports / dns / nsd # make showconfig = ==> The following configuration options are available for nsd-4.1.12: BIND8_STATS = off: BIND8-like NSTATS & XSTATS CHECKING = off: Internal run-time checks DOCS = on: Build and / or install documentation IPV6 = off: IPv6 protocol support LARGEFILE = on: Largefile support MINRESPSIZE = on: Minimial response sizing MMAP = off: Use mmap instead of malloc (experimental) MUNIN_PLUGIN = off: Install Munin plugin (requires BIND8_STATS) NSEC3 = on: NSEC3 support ROOT_SERVER = off: Configure as a root server RRL = on: Response Rate Limiting ZONE_STATS = on: Separate statistics for each zone ===> Use 'make config' to modify these settings root @ beta: / usr / ports / dns / nsd # make install clean == => License BSD3CLAUSE accepted by the user ===> Found saved configuration for nsd-4.1.12 ===> nsd-4.1.12 depends on file: / usr / local / sbin / pkg - found ===> Fetching all distfiles required by nsd-4.1.12 for building ===> Extracting for nsd-4.1.12 => SHA256 Checksum OK for nsd-4.1.12.tar.gz. ...Не відкладаючи справу на потім, треба прописати запуск демона NSD в файл початкової ініціалізації системи rc.conf.
root @ beta: / usr / ports / dns / nsd # cat /etc/rc.conf | grep nsd nsd_enable = "YES"Тепер створимо структуру робочих каталогів для нашого DNS-сервера в спеціально створеному в процесі установки каталозі / usr / local / etc / nsd /. Це робиться для забезпечення додаткової безпеки нашої системи через запуск NSD в chroot .
root @ beta: / usr / ports / dns / nsd # cd / usr / local / etc / nsd / root @ beta: / usr / local / etc / nsd # ll total 2 -rw-r - r-- 1 root wheel 1874 17 сент. 17:41 nsd.conf -rw-r - r-- 1 root wheel 10299 17 сент. 17:41 nsd.conf.sample root @ beta: / usr / local / etc / nsd # mkdir -p var / db / nsd root @ beta: / usr / local / etc / nsd # mkdir -p var / run / nsd root @ beta: / usr / local / etc / nsd # mkdir var / log root @ beta: / usr / local / etc / nsd # mkdir tmpЗ огляду на те, що демон NSD буде працювати від імені nsd, слід дати йому права на щойно створені каталоги.
root @ beta: / usr / local / etc / nsd # chown nsd: nsd / usr / local / etc / nsd root @ beta: / usr / local / etc / nsd # chown -R nsd: nsd var / root @ beta: / usr / local / etc / nsd # chown -R nsd: nsd tmp /Тепер слід створити базову настройку для щойно встановленого DNS-сервера. Це робиться на базі встановленого в робочий каталог зразка конфігураційного файлу nsd.conf. Однак, для початку, слід згенерувати ключі для віддаленого управління сервером за допомогою утиліти nsd-control-setup, яка включена до складу пакета NSD.
root @ beta: / usr / local / etc / nsd # nsd-control-setup setup in directory / usr / local / etc / nsd generating nsd_server.key Generating RSA private key, 1536 bit long modulus .... ++++ . ++++ e is 65537 (0x10001) generating nsd_control.key Generating RSA private key, 1536 bit long modulus ................. ++++ ..... .................................................. ....... ++++ e is 65537 (0x10001) create nsd_server.pem (self signed certificate) create nsd_control.pem (signed client certificate) Signature ok subject = / CN = nsd-control Getting CA Private Key Setup success. Certificates created. Enable in nsd.conf file to useДля даного сайту файл конфігурації буде мати наступний вигляд.
root @ beta: / usr / local / etc / nsd # cat nsd.conf # # nsd.conf - the NSD (8) configuration file, nsd.conf (5). # # Copyright (c) 2001-2011, NLnet Labs. All rights reserved. # # See LICENSE for the license. # # - by Max Kostikov 2016-09-17 server: ip-address: 10.10.10.10 debug-mode: no do-ip6: no verbosity: 3 chroot: "/ usr / local / etc / nsd" zonesdir: "/ usr / local / etc / nsd / zones "zonelistfile:" /usr/local/etc/nsd/var/db/nsd/zone.list "database:" / usr / local / etc / nsd / var / db / nsd / nsd.db "logfile:" /usr/local/etc/nsd/var/log/nsd.log "pidfile:" /usr/local/etc/nsd/var/run/nsd/nsd.pid "xfrdfile:" / usr / local / etc / nsd / var / db / nsd / xfrd.state "xfrdir:" / usr / local / etc / nsd / tmp "remote-control: control-enable: yes server-key-file:" / usr /local/etc/nsd/nsd_server.key "server-cert-file:" /usr/local/etc/nsd/nsd_server.pem "control-key-file:" /usr/local/etc/nsd/nsd_control.key "control-cert-file:" /usr/local/etc/nsd/nsd_control.pem "# - for secondary @ dns.he.net pattern: name:" xfr-he "zonefile:"% s /% s. zone "notify: 216.218.130.2 NOKEY provide-xfr: 216.218.133.2 NOKEY zone: name:" kostikov.co "include-pattern:" xfr-he "У приниципе, коментувати призначення параметрів потреби немає, оскільки це цілком зрозуміло з їх назв. Опишу лише використовувані секції:
- server відповідає за базові настройки сервера;
- remote-control дозволяє віддалене управління по ключам за допомогою спеціальної утиліти nsd-control;
- використання pattern дозволяє використовувати типові настройки для будь-якої кількості доменних імен;
- і, нарешті, zone описує мій домен з використанням раніше прописаного шаблону xfr-he.
Зверніть увагу, що наш первинний DNS-сервер буде обслуговувати домен kostikov.co, а вторинні DNS-сервери будуть підтримуватися на базі популярного сервісу публічних DNS від американського провайдера Hurricane Electric . Для вирішення синхронізації зон на вторинні сервери в шаблоні xfr-he прописані IP-адреси серверів - окремий для запиту AXFR зони в параметрі xfr-he (IP відповідає імені сервера slave.dns.he.net), і окремий для нотифікації про оновлення зони в параметрі notify (відповідає сервера ns1.he.net). Параметр NOKEY указаивает на відсутність додаткової аутентифікації для сіхнронізаціі зон, оскільки публічний DNS від Hurricane Electric в даний час не підтримує механізм TSIG .
Також слід врахувати ще один тонкий момент, який стосується типових інсталяцій FreeBSD. Починаючи з версії 10.0 до її складу включений рекурсивний кешуючий DNS-сервер Unbound , Який написаний тим же автором, що і NSD - компанією NLnet labs . У зв'язку з цим, якщо передбачається використання обох цих серверів в рамках однієї серверної інталляціі, то слід подбати про поділ інтефрейсов, на яких вони будуть слухати і відповідати на DNS-запити. У моєму випадку Undound працює на інтерфейсі локального хоста з IP 127.0.0.1, а NSD - на зовнішньому, адреса якого прописаний в параметрі конфігурації ip-address.
Тепер залишається лише прописати файл зони для домену kostikov.co. Формат його файлу, який, як випливає з простого налаштування, буде розташовано безпосередньо в робочому каталозі зон NSD zones в окремому підкаталозі іменованих так само як і домен kostikov.co під ім'ям kostikov.co.zone.
root @ beta: / usr / local / etc / nsd # cat zones / kostikov.co / kostikov.co.zone $ ORIGIN kostikov.co. $ TTL 86400 @ IN SOA my.server. hostmaster.my.server. (2016091705; serial 10800; refresh 1800; retry 604800; expire 86400); minimum; NS IN NS my.server. IN NS ns1.he.net. IN NS ns2.he.net. IN NS ns3.he.net. IN NS ns4.he.net. IN NS ns5.he.net. ; MX IN MX 10 my.server. IN SPF "v = spf1 + mx -all" IN TXT "v = spf1 + mx -all" dkim._domainkey.kostikov.co. IN TXT "k = rsa; p = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJjSZ1Fd0ZbE8V0t6V + / 7GZ + DNaj5qJT0fQcXVxWeo3uKJ85kpZ0AbLExu50tbZuz1AiPwhv9inqXltHWi5aqsSfiFODQH8McjWttFx0iM8cyBHw + DJ5CXAONUXFfSFPNOF7 + J5BKpcx4hyu0j8z2HQIzQCHR9Q7Rky / C + uFxIxwIDAQAB" _adsp._domainkey.kostikov.co. IN TXT "dkim = all" _dmarc.kostikov.co. IN TXT "v = DMARC1; p = quarantine; pct = 100; rua = mailto: [email protected]"; WWW @ IN A 10.10.10.10 www IN CNAME kostikov.co.Формат його близький до стандартного формату BIND . Для зручності читання блоки DNS-записів розділені на относящіемя до опису DNS (; NS), поштою (; MX) і веб-сервісів (; WWW). Зверніть також увагу на перше число в записі SOA (; serial). При кожному ізмненія налаштувань DNS-зони для домену його слід змінювати в бік збільшення. Це служить індикатором його поновлення і викликає початок процесу його передачі на вторинні сервери.
Тепер залишилося запустити сам демон нашого DNS-сервера і переконатися в його працездатності.
root @ beta: / usr / local / etc / nsd # service nsd start Starting nsd. root @ beta: / usr / local / etc / nsd # netstat -anfinet | grep '.53' tcp4 0 0 10.10.10.10.53 *. * LISTEN tcp4 0 0 127.0.0.1.53 *. * LISTEN udp4 0 0 10.10.10.10.53 *. * udp4 0 0 127.0.0.1.53 *. *У висновку мережевий статистики видно, що в даній системі є два працюють DNS-сервера - перший, авторитативні NSD, слухає на зовнішньому інтерфейсі з IP-адресою 10.10.10.10, а другий - кешуючий Unbound працює виключно на localhost.
Тепер слід додати вторинний сервер на сервісі від Hurricane Electric і переконатися, що сталася успішна синхронізація зон і вторинні сервери коректно відповідають на запит нашого домену.
root @ beta: / usr / local / etc / nsd # cat var / log / nsd.log [2016-09-17 17: 02: 31.807] nsd [73485]: notice: nsd starting (NSD 4.1.12) [2016 -09-17 17: 02: 31.816] nsd [73485]: info: setup SSL certificates [2016-09-17 17: 02: 31.897] nsd [73487]: info: zone kostikov.co read with success [2016-09 -17 17: 02: 31.900] nsd [73487]: info: zone kostikov.co written to db [2016-09-17 17: 06: 04.557] nsd [73529]: info: axfr for kostikov.co. from 216.218.133.2 ... root @ beta: / usr / local / etc / nsd # root @ beta: / usr / local / etc / nsd # host -a kostikov.co ns1.he.net Trying "kostikov.co" Using domain server: Name: ns1.he.net Address: 216.218.130.2 # 53 Aliases: ;; - >> HEADER << - opcode: QUERY, status: NOERROR, id: 28926 ;; flags: qr aa rd; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 9 ;; QUESTION SECTION:; kostikov.co. IN TYPE255 ;; ANSWER SECTION: kostikov.co. 86400 IN NS ns5.he.net. kostikov.co. 86400 IN NS my.server. kostikov.co. 86400 IN SPF "v = spf1 + mx -all" kostikov.co. 86400 IN NS ns3.he.net. kostikov.co. 86400 IN SOA my.server. hostmaster.my.server. 2016091705 10800 1800 604800 86400 kostikov.co. 86400 IN TXT "v = spf1 + mx -all" kostikov.co. 86400 IN NS ns1.he.net. kostikov.co. 86400 IN MX 10 my.server. kostikov.co. 86400 IN NS ns4.he.net. kostikov.co. 86400 IN A 10.10.10.10 kostikov.co. 86400 IN NS ns2.he.net. ;; ADDITIONAL SECTION: ns3.he.net. 86400 IN A 216.218.132.2 ns2.he.net. 86400 IN A 216.218.131.2 my.server. 86400 IN A 10.10.10.10 ns5.he.net. 86400 IN A 216.66.80.18 ns1.he.net. 86400 IN A 216.218.130.2 ns4.he.net. 86400 IN A 216.66.1.2 ns3.he.net. 86400 IN AAAA 2001: 470: 300 :: 2 ns2.he.net. 86400 IN AAAA 2001: 470: 200 :: 2 ns5.he.net. 86400 IN AAAA 2001: 470: 500 :: 2 Received 466 bytes from 216.218.130.2 # 53 in 69 msЯк видно, все пройшло вдало. NSD запущений без помилок, зона синхронізувалася з вторинними серверами і вони коректно відповідають на запити.
І, нарешті, слід повідомити реєстратору нашого домену про зміну DNS-серверів, які його підтримують - вони вказані в типі DNS-записи NS в описі зони.
Стаття була корисною? Тоді прошу не соромитися і грошима або біткоіни .
Стаття була корисною?