Pełna konfiguracja serwera BIND i DNS na nowym serwerze
Po wykupieniu serwera dedykowanego czy VPS u jakiegoś dostawcy zwykle otrzymujemy adres IP i nazwę hosta, która bardziej przypomina kolejny numer porządkowy, w domenie dostawcy. Natomiast dziś przedstawię w jaki sposób zainstalować i skonfigurować serwer BIND do obsługi domen.
CEL:
Konfiguracja serwera DNS.
Podstawowy będzie na moim serwerze VPS, natomiast do stworzenia zapasowego wykorzystam jeden z darmowych serwisów utrzymywania DNS freedns.42.pl.
Zmiana nazwy hosta
Nazwę nowego serwera można sprawdzić komendą:
1 | hostname -f |
Konfiguracja hostname:
Edytujemy plik nano /etc/hosts
1 | nano nano /etc/hosts |
Plik powinien wyglądać następująco:
1 2 3 4 5 6 7 | 127.0.0.1 localhost.localdomain localhost 185.38.250.250 node.serwerweb.pl node # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
kolejnym krokiem to edycja pliku nano /etc/hostname
1 | nano nano /etc/hostname |
I wpisujemy nasz hostname node
Dokonujemy restartu serwera.
Po ponownym zalogowaniu do konsoli całość możemy zweryfikować poleceniami:
1 2 | hostname hostname -f |
1 2 3 4 | root@node:/tmp# hostname node root@node:/tmp# hostname -f node.serwerweb.pl |
Przechodzimy do głównej konfiguracji Binda.
Na początku należy się upewnić, że jest zainstalowany serwer nazw BIND. W razie jakby go jeszcze nie było, to instalacja wygląda tak:
1 | apt-get install bind9 |
Zabezpieczenie BINDa
BIND jest dość powszechnym programem, dlatego w dobrym tonie jest zastosowanie zabezpieczeń, a mianowicie zamknięcie go w chrootowalnym środowisku. Najpierw należy zatrzymać całą usługę
1 | /etc/init.d/bind9 stop |
Następnie należy edytować plik /etc/default/bind9 i zmienić w nim wartość parametru OPTIONS, żeby wyglądała tak jak poniżej:
1 | OPTIONS="-u bind -t /var/lib/named" |
Dalej trzeba stworzyć nowe katalogi i poprzenosić domyślnie utworzone przez program katalogi do nowych lokalizacji:
1 2 3 4 5 | # Utworzenie katalogów mkdir -p /var/lib/named/etc mkdir -p /var/lib/named/var/cache/bind mkdir /var/lib/named/var/run mkdir /var/lib/named/dev |
1 2 | # Przeniesienie plików konfiguracyjnych BINDa mv /etc/bind /var/lib/named/etc |
Pozostawiam w razie czego w miejscu przeniesionych katalogów link symboliczny:
1 | ln -s /var/lib/named/etc/bind /etc/bind |
Niezbędne jest również utworzenie urządzeń null i random oraz nadanie odpowiednich praw:
1 2 3 | # Urządzenia mknod /var/lib/named/dev/null c 1 3 mknod /var/lib/named/dev/random c 1 8 |
1 2 3 4 | # Uprawnienia do plików i katalogów chmod 666 /var/lib/named/dev/null /var/lib/named/dev/random chown -R bind:bind /var/lib/named/var/* chown -R bind:bind /var/lib/named/etc/bind |
BIND jest już zamknięty w chrootowalnym środowisku. Pozostaje jeszcze rozwiązanie problemu logowania zdarzeń. Aby zdarzenia były logowane do systemowych logów należy nieco zmodyfikować plik /etc/default/syslogd. Należy tam znaleźć linię z parametrem SYSLOGD i zmodyfikować ją, żeby wyglądała tak:
1 | SYSLOGD="-a /var/lib/named/dev/log" |
Teraz pozostaje tylko zrestartowanie usługi sysklogd oraz uruchomienie bind9.
1 | /etc/init.d/sysklogd restart |
1 | /etc/init.d/bind9 start |
W logu /var/log/syslog można sobie podejrzeć czy wszystko się uruchomiło prawidłowo.
A teraz można przejść do ustawień właściwych
Na początku należy sprawdzić plik /etc/bind/named.conf
W moim przypadku widać, że jest on podzielony na podrzędne części includowane z plików: named.conf.options i named.conf.local
Zaczynamy od sprawdzenia pliku named.conf.options, gdyż w zasadzie w moim przypadku domyślne ustawienia są na razie jak najbardziej wystarczające, a wygląda to mniej więcej tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | options { directory "/var/cache/bind"; // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. // forwarders { // 0.0.0.0; // }; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; }; |
W dalszej kolejności trzeba będzie już coś napisać i edytować plik named.conf.local, gdzie definiuje się strefy obsługiwane przez serwer. Na końcu pliku dopisuje moją strefę:
1 2 3 4 5 6 7 8 9 | zone "serwerweb.pl" { type master; file "/etc/bind/serwerweb.pl"; notify yes; allow-transfer { 195.80.237.194; 193.70.13.218; }; }; |
Type master oznaczna, że jest to typ podstawowy.
File wskazuje plik ze szczegółami dla tej domeny. Podany tutaj jest adres bezwzględny do pliku, który będzie trzeba za chwilę stworzyć. Podając tutaj samą nazwę pliku, katalogiem gdzie powinien się ten plik znaleźć jest katalog podany w pliku named.conf.options w parametrze directory.
Notify yes powoduje, że o wszelki zmianach we wpisie podstawowym powiadamiane są również zapasowe DNSy.
Allow-transfer określa adresy IP, które będą miały pozwolenie na pobranie tej strefy, tutaj akurat są konkretne adresy serwerów DNS z wspomnianego na początku serwisu freedns.42.pl, które będą stanowić tutaj serwery zapasowe (secondary)
Następnie należy utworzyć wskazany powyżej plik z wpisami dla domeny /etc/bind/serwerweb.pl
1 | nano /etc/bind/serwerweb.pl |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | $TTL 86400 $ORIGIN serwerweb.pl. @ IN SOA ns1.serwerweb.pl. boss.serwerweb.pl. ( 2018040301 ;; serial 10800 ;; refresh 3600 ;; retry 604800 ;; expire 10800 ;; TTL ) @ IN NS ns1.serwerweb.pl. @ IN NS ns2.serwerweb.pl. @ IN NS ns3.serwerweb.pl. @ IN A XX.XX.XX.XX ns1 IN A XX.XX.XX.XX ns2 IN A 193.70.13.218 ns3 IN A 195.80.237.194 ;; poczta @ IN MX 10 mail mail IN A XX.XX.XX.XX ;; serwer www www IN A XX.XX.XX.XX ftp IN CNAME @ |
W skrócie:
$TTL – określa czas ważności rekordów (w sekundach)
$ORIGIN – nazwa domeny. W dalszej części @ oznacza właśnie tą wartość.
Gdy gdzieś w pliku pojawia się nazwa domeny to trzeba zakończyć ją kropką, gdyż w przeciwnym wypadku doklejana jest nazwa domeny (wartość $ORIGIN)
@ IN SOA… – Start Of Authority informuje o podstawowym serwerze DNS i kto nim zarządza (e-mail zapisany z kropką w miejscu małpy)
Jak wynika z pliku zdefiniowałem dla swojej domeny aż trzy serwery DNS. W zupełności wystarczyłyby tutaj dwa.
Pierwszy ns1.serwerweb.pl podstawowy obsługiwany przez mój serwer, na którym będzie domena również zainstalowana, dwa kolejne (ns2.serwerweb.pl i ns3.serwerweb.pl) to adresy zapasowe utworzone w serwisie freedns.42.pl.
Przed przejściem do konfiguracji strefy zapasowej, należałoby zatwierdzić dokonane zmiany restartując usługę bind9
1 | service bind9 restart |
Można jeszcze sprawdzić czy wszystkie dokonane przed chwilą wpisy dla strefy są poprawne wywołując taki program:
1 2 3 | named-checkzone serwerweb.pl /etc/bind/serwerweb.pl zone serwerweb.pl/IN: loaded serial 2018040301 OK |
Jakby się coś nie zgadzało albo popełniona została jakaś drastyczna literówka to program poinformuje, gdzie mniej więcej szukać błędu.
Ponadto poniższą komendą można sobie sprawdzić czy domena została poprawnie dodana (powinna się pojawić po wykonaniu)
1
1 | named -g 2>&1 | grep loaded |
To wszystko, mamy poprawnie w pełni skonfigurowany serwer BIND.
named-checkzone sysadmin.info.pl /etc/bind/sysadmin.info.pl
dns_rdata_fromtext: /etc/bind/sysadmin.info.pl:14: near 'XX.XX.XX.XX’: bad dotted quad
dns_rdata_fromtext: /etc/bind/sysadmin.info.pl:15: near 'XX.XX.XX.XX’: bad dotted quad
dns_rdata_fromtext: /etc/bind/sysadmin.info.pl:21: near 'XX.XX.XX.XX’: bad dotted quad
dns_rdata_fromtext: /etc/bind/sysadmin.info.pl:24: near 'XX.XX.XX.XX’: bad dotted quad
zone sysadmin.info.pl/IN: loading from master file /etc/bind/sysadmin.info.pl failed: bad dotted quad
zone sysadmin.info.pl/IN: not loaded due to errors.
Jak to naprawić?
XX.XX.XX.XX zastapilem publicznym adresem IP od dostawcy uslug internetowych (ISP). Dziala.
Hej,
Tak jak najbardziej jednak zalecał bym ci kupić serwer w jakiejś konkretnej firmie wtedy masz stały adres ip i pewność że się on nie zmieni .
O ile twój ISP jest w stanie dać stały to nie ma problemu możesz sobie tak działać.
root@node:/# systemctl status bind9.service
● bind9.service – BIND Domain Name Server
Loaded: loaded (/lib/systemd/system/bind9.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sat 2020-10-10 02:50:03 CEST; 13s ago
Docs: man:named(8)
Process: 1659 ExecStart=/usr/sbin/named $OPTIONS (code=exited, status=1/FAILURE)
paź 10 02:50:03 node named[1660]: couldn’t mkdir '//run’: Permission denied
paź 10 02:50:03 node named[1660]: could not create //run/named/session.key
paź 10 02:50:03 node named[1660]: failed to generate session key for dynamic DNS: permission denied
paź 10 02:50:03 node named[1660]: sizing zone task pool based on 5 zones
paź 10 02:50:03 node named[1660]: could not configure root hints from '/usr/share/dns/root.hints’: f
paź 10 02:50:03 node named[1660]: loading configuration: file not found
paź 10 02:50:03 node named[1660]: exiting (due to fatal error)
paź 10 02:50:03 node systemd[1]: bind9.service: Control process exited, code=exited, status=1/FAILUR
paź 10 02:50:03 node systemd[1]: bind9.service: Failed with result 'exit-code’.
paź 10 02:50:03 node systemd[1]: Failed to start BIND Domain Name Server.
Zrobiłeś wszystkie kroki na pewno jak być powinny?
paź 10 02:50:03 node named[1660]: couldn’t mkdir ‘//run’: Permission denied
paź 10 02:50:03 node named[1660]: could not create //run/named/session.key
Już pierwszy komunikat wskazuje że nie masz uprawnień i nie możesz stworzyć piku.