Настройка DNS-сервера (bind) в CentOS/RHEL 7
BIND (Berkeley Internet Name Daemon) так же известен как named – это самый известный и самый используемый DNS-сервер в интернете. Я постараюсь описать процесс установки и настройки этого сервиса в chroot-окружении (chroot – операция изменения корневого каталога в Unix-подобных операционных системах. Программа, запущенная с изменённым корневым каталогом, будет иметь доступ только к файлам, содержащимся в данном каталоге. Поэтому, если нужно обеспечить программе доступ к другим каталогам или файловым системам (например, /proc
), нужно заранее примонтировать в целевом каталоге необходимые каталоги или устройства.).
- Сначала установим сам сервис и сопутствующие утилиты:
$ yum -y install bind bind-utils bind-chroot
$ /usr/libexec/setup-named-chroot.sh /var/named/chroot on $ chcon -u system_u /var/named/chroot/etc/localtime $ chcon -u system_u /var/named/chroot/dev/null $ chcon -u system_u /var/named/chroot/dev/random $ chcon -u system_u /var/named/chroot/dev/zero $ chmod g+w /var/named/chroot/var/named/ $ setsebool -P named_write_master_zones=1 $ nano -w /etc/sysconfig/named OPTIONS="-4" $ nano -w /var/named/chroot/etc/named.conf acl "trusted" { /* * You might put in here some ips which are allowed to use the cache or * recursive queries */ 127.0.0.0/8; ::1/128; }; acl "xfer" { /* * Deny transfers by default except for the listed hosts. * If we have other name servers, place them here. */ // relcom.ru and nic.ru 31.177.66.192/28; 91.217.20.0/26; 91.217.21.0/26; 193.124.22.65/32; 193.232.86.0/24; 194.226.96.192/28; 195.253.51.22/32; 195.253.54.22/32; }; options { listen-on port 53 { any; }; listen-on-v6 port 53 { none; }; ... allow-query { /* * Accept queries from our "trusted" ACL. We will * allow anyone to query our master zones below. * This prevents us from becoming a free DNS server * to the masses. */ trusted; }; allow-query-cache { /* Use the cache for the "trusted" ACL. */ trusted; }; allow-recursion { /* Only trusted addresses are allowed to use recursion. */ trusted; }; allow-transfer { /* Zone tranfers are denied by default. */ xfer; }; allow-update { /* Don't allow updates, e.g. via nsupdate. */ none; }; ... }
Note: в acl «xfer» я добавил IP-адреса серверов, которые будут secondary-серверами для моих зон. Если вы на своём DNS-сервере никакие зоны хостить не собираетесь – этот блок можно оставить пустым, иначе впишите туда IP-адреса secondary-серверов для ваших зон.
$ firewall-cmd --permanent --zone=public --add-service=dns $ firewall-cmd --reload
$ systemctl start named-chroot.service $ systemctl enable named-chroot.service $ nano -w /etc/sysconfig/network-scripts/ifcfg-eth0 PEERDNS=no DOMAIN="example.com example.org" DNS1=127.0.0.1 DNS2=8.8.8.8 DNS3=8.8.4.4 $ systemctl restart network
Note: в качестве 2-го и 3-го DNS-сервера лучше вписать IP-адрес DNS-серверов вашего провайдера, так резолвинг будет проходить чуть быстрее.
$ systemctl status named-chroot.service named-chroot.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; enabled) Active: active (running) since Thu 2014-11-20 13:45:06 MSK; 1h 32min ago Process: 31335 ExecReload=/bin/sh -c /usr/sbin/rndc reload > /dev/null 2>&1 || /bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS) Main PID: 24627 (named) CGroup: /system.slice/named-chroot.service └─24627 /usr/sbin/named -u named -t /var/named/chroot -4 Nov 20 14:28:09 example.com named[24627]: automatic empty zone: 8.B.D.0.1.0.0.2.IP6.ARPA Nov 20 14:28:09 example.com named[24627]: reloading configuration succeeded Nov 20 14:28:09 example.com named[24627]: reloading zones succeeded Nov 20 14:28:09 example.com systemd[1]: Reloaded Berkeley Internet Name Domain (DNS). Nov 20 14:28:09 example.com named[24627]: all zones loaded Nov 20 14:28:09 example.com named[24627]: running $ cat /etc/resolv.conf # Generated by NetworkManager search example.com example.org nameserver 127.0.0.1 $ dig ya.ru @localhost ; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> ya.ru @localhost ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29241 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;ya.ru. IN A ;; ANSWER SECTION: ya.ru. 1706 IN A 213.180.193.3 ya.ru. 1706 IN A 213.180.204.3 ya.ru. 1706 IN A 93.158.134.3 ;; AUTHORITY SECTION: ya.ru. 340105 IN NS ns1.yandex.ru. ya.ru. 340105 IN NS ns2.yandex.ru. ;; ADDITIONAL SECTION: ns1.yandex.ru. 340105 IN A 213.180.193.1 ns1.yandex.ru. 340105 IN AAAA 2a02:6b8::1 ns2.yandex.ru. 340105 IN A 93.158.134.1 ns2.yandex.ru. 340105 IN AAAA 2a02:6b8:0:1::1 ;; Query time: 1 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Nov 20 15:17:55 MSK 2014 ;; MSG SIZE rcvd: 213
$ nano -w /var/named/chroot/etc/named.conf ... include "/etc/named.zones"; $ nano -w /var/named/chroot/etc/named.zones zone "example.com" { type master; file "named.example.com.zone"; /* Anybody is allowed to query but transfer should be controlled by the master. */ allow-query { any; }; allow-transfer { xfer; }; }; zone "example.org" { type master; file "named.example.org.zone"; /* Anybody is allowed to query but transfer should be controlled by the master. */ allow-query { any; }; allow-transfer { xfer; }; }; $ chown root:named /var/named/chroot/etc/named.zones $ chmod 0640 /var/named/chroot/etc/named.zones $ chcon -u system_u -t named_conf_t /var/named/chroot/etc/named.zones $ ln -s /var/named/chroot/etc/named.zones /etc/named.zones $ nano -w /var/named/chroot/var/named/named.example.com.zone $ORIGIN . $TTL 86400 ; 1 day example.com IN SOA mail.example.com. admin.example.org. ( 2014112001 ; serial 10800 ; refresh (3 hours) 3600 ; retry (1 hour) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS mail.example.com. NS ns8-l2.nic.ru. NS ns4-l2.nic.ru. A 10.20.30.40 MX 10 mail.example.com. TXT "v=spf1 mx -all" SPF "v=spf1 mx -all" $ORIGIN example.com. mail A 10.20.30.40 www CNAME mail $ nano -w /var/named/chroot/var/named/named.example.org.zone $ORIGIN . $TTL 86400 ; 1 day example.org IN SOA mail.example.com. admin.example.org. ( 2014112001 ; serial 10800 ; refresh (3 hours) 3600 ; retry (1 hour) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS mail.example.com. NS ns8-l2.nic.ru. NS ns4-l2.nic.ru. A 10.20.30.40 MX 10 mail.example.org. TXT "v=spf1 a mx mx:mail.example.org ?all" SPF "v=spf1 a mx mx:mail.example.org ?all" $ORIGIN example.org. mail A 83.246.72.206 www CNAME mail $ chown root:named /var/named/chroot/var/named/named.*.zone $ chmod 0640 /var/named/chroot/var/named/named.*.zone $ chcon -u system_u -t named_zone_t /var/named/chroot/var/named/named.*.zone $ named-checkconf /etc/named.conf $ named-checkzone example.com /var/named/chroot/var/named/named.example.com.zone zone example.com/IN: loaded serial 2014112001 OK $ named-checkzone example.org /var/named/chroot/var/named/named.example.org.zone zone example.org/IN: loaded serial 2014112001 OK $ systemctl reload named-chroot.service $ systemctl status named-chroot.service
$ nano -w /var/named/chroot/etc/named.conf ... include "/etc/named.zones"; $ nano -w /var/named/chroot/etc/named.zones zone "example.com" { type slave; file "slaves/example.com.zone"; masters { 10.20.30.40; }; /* Anybody is allowed to query but transfer should be controlled by the master. */ allow-query { any; }; allow-transfer { xfer; }; /* The master should be the only one who notifies the slaves, shouldn't it? */ allow-notify { 10.20.30.40; }; notify no; }; zone "example.org" { type slave; file "slaves/example.org.zone"; masters { 10.20.30.40; }; /* Anybody is allowed to query but transfer should be controlled by the master. */ allow-query { any; }; allow-transfer { xfer; }; /* The master should be the only one who notifies the slaves, shouldn't it? */ allow-notify { 10.20.30.40; }; notify no; }; $ ln -s /var/named/chroot/etc/named.zones /etc/named.zones $ named-checkconf /etc/named.conf $ systemctl reload named-chroot.service $ systemctl status named-chroot.service
Вот и всё, DNS-сервер настроен и готов к работе!
Алексей
22.04.2015 - 21:45
Бегло пробежав по инструкции, оставлю немного критики:
1) Пакет named-chroot подразумевает что chroot окружение со всем необходимым будет создаваться и монтироваться само в директории /var/named/chroot
Следовательно все остальные манипуляции излишни. И редактировать файлы рекомендуется так же в /var/named, а не в /var/named/chroot. Главное — включать и запускать только лишь сервис named-chroot, но не named.
Плюс рекомендуется (и я не вникал почему, полагаю из соображений безопасности) редактировать зоны в chroot окружении используя копии, например
# vim -c «set backupcopy=yes» /etc/named.conf
Подробности о named-chroot в rhel 7 здесь https://access.redhat.com/articles/770133
2) setsebool -P named_write_master_zones=1 рекомендуется использовать только в случае динамических зон. Для slave зон у named разрешения и так есть, а это правило для перезаписи bind’ом мастер зон.
Часть с chcon вообще бессмысленна, так как если класть конфиги туда куда полагается — проблем и не будет, плюс chcon делает смену контекста временно, и если сделать restorecon то метка слетит на дефолтную (и это может случится без вашего участия, если системе, например, после восстановления ошибок фс понадобится переразметить контексты). В данном случае это вообще ну нужно, но контекст менять нужно через semanage.
3) Файлы включенные в основную конфигурацию named.conf рекомендуется помещать в директорию /etc/named/. В вашем случае будет /etc/named/named.zones. Подробности тут https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec-BIND.html
4) Рекомендуется использовать утилиту rndc для всего что она поддерживает, в том числе
rndc reconfig
rndc reload
rndc reload zone
и тд. Смысл в том что дёргать каждый раз systemctl reload named не стоит, плохая практика. Плюс в rhel\centos о конфигурации этого самого rndc позаботились до нас и настраивать для использования на этом хосте не нужно. И создать заготовок зоны так же можно через rndc
И кстати для удобства можно значения в SOA записи делать не в секундах, а в более понятных величинах — 1d 1h 1w и тд. Передаваться оно будет всё равно в секундах, но конфигурировать легче.
За исключением этих мелочей — это прекрасная статья, спасибо. И меня впечатлило следование RFC 4408 с TXT и SPF записями.
sergey
02.05.2015 - 19:47
Доброго времени!
столкнулся с непривычной задачкой, которую почти решил. Есть только одно но
Подробности тут http://forum.learncisco.ru/index.php/topic,405.0.html
Алексей
01.06.2015 - 13:55
Я тут прочитал заново rfc, и RFC7208 http://tools.ietf.org/html/rfc7208 полностью заменило RFC4408, SPF записи признаны deprecated. И SPF запись следует убрать из зон.
Николай
03.09.2019 - 18:25
Пока не во всём разобрался, но многое стало понятно, очень толково, подробно и с пояснениями. Большое спасибо. Если можно, хотел бы попросить автора, помочь мне с настройкой DNS сервера для домашнего сервера на CentOS 7.6. У меня одна сетевая карта с IP 192.168.8.3, сотовый роутер с IP 192.168.8.1, сеть проводная с концентратором Switch, адресация в сети статическая, всего 3 компьютера. Сейчас я настроил dnsmasq, но DNS не работает без подключения к интернет и, как следствие, без интернет я не могу из Linux подключиться к ресурсам Samba, подключение к серверу по SSH затягивается до 40 секунд, хотя из Windows подключение происходит без проблем. Ещёраз спасибо. Отличная статья.
Николай
18.01.2020 - 17:10
С проблемой разобрался тривиально. Просто при повторной установке CentOS 7 на сервер, снял флажки с пунктов установка DNS и DHCP. После установки и настройки сервер работает без соединения с интернет, только надо обязательно указывать IP адрес любого ресурса, но это меня не напрягает, в моей домашней сети всего 4 рабочих станции и запомнить их IP адреса — не проблема.