Bociek PLD - Pisarz
I. Informacje podstawowe
II. Instalacja
III. Podręcznik użytkownika
IV. Podręcznik administratora
Usługi dostępne w PLD
PDNS (Power DNS) - Serwer Nazw
V. Tworzenie PLD - Praktyczny poradnik
VI. O podręczniku
O tej książce
Spis treści
Inne wersje tego dokumentu
PDF
HTML (jeden plik)
TXT
Odnośniki
Tworzymy dokumentację PLD
Strona PLD
Listy dyskusyjne PLD

PDNS (Power DNS) - Serwer Nazw

<- ->
 

Power DNS zwany w dalszej części tego dokumentu jako PDNS jest zaawansowanym i bardzo efektywnym serwerem nazw. Jego możliwości współpracy z LDAP lub bazami SQL (Mysql i Postgresql) dają szerokie możliwości tworzenia skryptów lub interface zarządzających. Sam PDNS jest uważany za zdecydowanie bezpieczniejszy niż Bind, a także od niego szybszy - zwłaszcza przy większej ilości obsługiwanych domen.

Wstęp

W tym rozdziale zostanie omówiona podstawowa instalacja, konfiguracja z bazą Postgresql, a także wstępna konfiguracja przykładowej domeny. Oczywiście więcej szczegółów możemy znaleźć w oryginalnej dokumentacji.

Instalacja

Instalacja przebiega standardowo za pomocą poldka.

poldek> install pdns

Do poprawnego działania naszej bazy potrzebujemy także postgresql (możemy także wykorzystać mysql lub ldap, a nawet pliki konfiguracyjne Bind-a). Tak więc jeżeli nie mamy Postgresql to instalujemy go i poprawnie konfigurujemy.

Konfiguracja Postgresql dla PDNS

Następnym krokiem będzie stworzenie bazy obsługiwanej przez PDNS w Postgresql. W tym celu możemy wykorzystać klienta dostarczanego razem z Postgresql - psql. Możemy także do tego celu użyć innych wygodnych narzędzi np. phpPgAdmin

Najpierw z konta użytkownika uprawnionego do operacji na bazie tworzymy bazę:

$ createdb -U postgres powerdns

Tworzymy także użytkownika dla w/w bazy:

$ createuser -P -U postgres pdns
Enter password for user "pdns":
Enter it again:
Shall the new user be allowed to create databases?
(y/n) n
Shall the new user be allowed to create more new
users? (y/n) n
CREATE USER

Teraz za pomocą swojego ulubionego klienta Postgresql wykonujemy poniższe polecenia SQL w celu stworzenia szkieletu bazy:

create table domains (
id		 SERIAL PRIMARY KEY,
name		 VARCHAR(255) NOT NULL,
master		 VARCHAR(20) DEFAULT NULL,
last_check	 INT DEFAULT NULL,
type		 VARCHAR(6) NOT NULL,
notified_serial	INT DEFAULT NULL, 
account         VARCHAR(40) DEFAULT NULL
);
CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
id              SERIAL PRIMARY KEY,
domain_id       INT DEFAULT NULL,
name            VARCHAR(255) DEFAULT NULL,
type            VARCHAR(6) DEFAULT NULL,
content         VARCHAR(255) DEFAULT NULL,
ttl             INT DEFAULT NULL,
prio            INT DEFAULT NULL,
change_date	INT DEFAULT NULL, 
CONSTRAINT	domain_exists 
FOREIGN		KEY(domain_id) REFERENCES domains(id)
ON DELETE CASCADE
);

CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);

create table supermasters (
ip VARCHAR(25) NOT NULL, 
nameserver VARCHAR(255) NOT NULL, 
account VARCHAR(40) DEFAULT NULL
);

GRANT SELECT ON supermasters TO pdns;
GRANT ALL ON domains TO pdns;
GRANT ALL ON domains_id_seq TO pdns;
GRANT ALL ON records TO pdns;
GRANT ALL ON records_id_seq TO pdns;

Konfiguracja PDNS

W /etc/pdns/pdns.conf konfigurujemy działanie programu PDNS. Przykładowa konfiguracja PDNSa współpracującego z bazą Postgresql może wyglądać następująco:

#chroot=/some/where	# If set, chroot to this directory for more security
config-dir=/etc/pdns/      # Location of configuration directory (pdns.conf)
launch=gpgsql              # Launch this backend 

#gpgsql-socket=/var/lib/pgsql/postmaster.pid
gpgsql-dbname=powerdns     # Nazwa bazy danych w psql
gpgsql-user=pdns	   # Użytkownik bazy w psql
gpgsql-password=hasło_do_bazy_pdns

module-dir=/usr/lib/pdns   # Default directory for modules
#load-modules=             # Load this module - supply absolute or relative path
#local-address=0.0.0.0     # Local IPv4 address to which we bind
#local-ipv6=::               # Local IPv6 address to which we bind
#use-logfile=no            # Use a log file or syslog
#logfile=var/log/pdns.log  # Logfile to use
allow-recursion=IP_ZEWN_DNS/maska,IP_ZEWN_DNS/maska	   # Tu podajemy adresy zewn. serwerów DNS np.
# allow-recursion=194.204.152.34/24,194.204.159.1/24
# nameserver
setgid=djbdns              # If set, change group id to this gid for more security
setuid=pdns                # If set, change user id to this uid for more security
#slave=no                  # Act as a slave (Ustawiamy na YES w przypadku
			   # pracy serwera PDNS jako SLAVE)
			   
socket-dir=/var/run        # Where the controlsocket will live
webserver=yes              # Włączenie usługi monitorowania pracy PDNS przez WWW
webserver-address=10.1.1.1 # Adres IP strony monitorującej pracę PDNS
webserver-password=hasło_do_strony_monitorującej
webserver-port=8088	   # port strony monitorującej

Krzyżyk "#" na początku oznacza komentarz bądź wyłączenie danej opcji. Oryginalne teksty komentarzy są na tyle czytelne, że tylko niektóre opcje skomentowalismy po polsku.

Domeny

Praktycznie PDNS jest gotowy do pracy. Musimy jeszcze wypełnić treścią bazę - czyli dodać domenę (domeny). Przykładową domenę zaprezentujemy w formie tzw. "dump-a" bazy. Jest to na tyle czytelne, że skomentowane zostaną tylko niektóre aspekty.

--
-- PostgreSQL database dump
--

SET client_encoding = 'UNICODE';
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

--
-- Name: domains_id_seq; Type: SEQUENCE SET; Schema: public; Owner: pdns
--

SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('domains', 'id'), 1, true);

--
-- Name: records_id_seq; Type: SEQUENCE SET; Schema: public; Owner: pdns
--

SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('records', 'id'), 16, true);

--
-- Data for Name: domains; Type: TABLE DATA; Schema: public; Owner: pdns
--

INSERT INTO domains VALUES (1, 'foo.com', NULL,	NULL, 'NATIVE', NULL, NULL); 
INSERT INTO domains VALUES (2, '1.1.10.in-addr.arpa', NULL, NULL, 'NATIVE', NULL, NULL);
-- W pierwszym ID podajemy domenę 'foo.com'
-- W drugim ID definiujemy domenę odwrotną dla danego IP

--
-- Data for Name: records; Type: TABLE DATA; Schema: public; Owner: pdns
--
-- Poniżej zgodnie z określonymi ID definiowane są kolejno strefy

INSERT INTO records VALUES (2, 1, 'localhost.foo.com', 'A', '127.0.0.1', 120, NULL, NULL);
INSERT INTO records VALUES (3, 1, 'www.foo.com', 'A', '10.1.1.1', 120, NULL, NULL);
INSERT INTO records VALUES (5, 1, 'dns.foo.com', 'A', '10.1.1.1', 120, NULL, NULL);
INSERT INTO records VALUES (6, 1, 'ftp.foo.com', 'A', '10.1.1.1', 120, NULL, NULL);
INSERT INTO records VALUES (7, 1, 'poczta.foo.com', 'A', '10.1.1.1', 120, NULL, NULL);
INSERT INTO records VALUES (8, 1, 'pop3.foo.com', 'A', '10.1.1.1', 120, NULL, NULL);
INSERT INTO records VALUES (9, 1, 'smtp.foo.com', 'A', '10.1.1.1', 120, NULL, NULL);
INSERT INTO records VALUES (10, 1, 'ssh.foo.com', 'A', '10.1.1.1', 120, NULL, NULL);
INSERT INTO records VALUES (11, 1, 'jabber.foo.com', 'A', '10.1.1.1', 120, NULL, NULL);
INSERT INTO records VALUES (1, 1, 'foo.com', 'SOA', 'localhost user.foo.com 1', 86400, NULL, NULL);
INSERT INTO records VALUES (16, 1, 'foo.com', 'TXT', 'Serwer PDNS', 300, NULL, NULL);
INSERT INTO records VALUES (17, 1, 'foo.com', 'NS', 'ns.foo.com', 300, NULL, NULL);
INSERT INTO records VALUES (4, 1, 'mail.foo.com', 'A', '10.1.1.1', 120, NULL, NULL);
INSERT INTO records VALUES (18, 1, 'foo.com', 'MX', 'mail.foo.com', 300, 5, NULL);
INSERT INTO records VALUES (19, 1, 'foo.com', 'A', '10.1.1.1', 300, 0, NULL);

-- Poniżej definiujemy rekordy SRV dla serwera Jabber 
INSERT INTO records VALUES (12, 1, '_jabber._tcp.jabber.foo.com', 
	'SRV', '0 5269 foo.com', 300, 10, NULL);
INSERT INTO records VALUES (13, 1, '_xmpp-server._tcp.jabber.foo.com', 
	'SRV', '0 5269 foo.com', 300, 10, NULL);
INSERT INTO records VALUES (14, 1, '_xmpp-client._tcp.jabber.foo.com', 
	'SRV', '0 5222 foo.com', 300, 10, NULL);

-- Domena odwrotna
INSERT INTO records VALUES (15, 2, '1.1.1.10.in-addr.arpa', 'PTR', 'foo.com', 86400, NULL, NULL);
INSERT INTO records VALUES (20, 2, '1.1.10.in-addr.arpa', 
	'SOA', 'localhost root.localhost', 86400, NULL, NULL);
INSERT INTO records VALUES (21, 2, '1.1.10.in-addr.arpa', 'NS', 'nc.foo.com', 86400, NULL, NULL);

--
-- Data for Name: supermasters; Type: TABLE DATA; Schema: public; Owner: pdns
--

--
-- PostgreSQL database dump complete
--

Wszelkie zmiany lub dodawanie nowych domen możemy wykonywać na bazie danych lub wykorzystując do tego odpowiednie skrypty. Teraz możemy uruchomić demona PDNS wykorzystując skrypt:

# /etc/init.d/pdns start

Należy pamiętać, że jeżeli wcześniej używalismy BINDa bądź innnego demona do obsługi nazw domenowych, należy go przed uruchomieniem PDNS wyłączyć.

Po uruchomieniu serwisu możemy za pomocą przeglądarki http wejść na stronę monitorującą pracę PDNS (odpowiednie opcje dotyczące tej usługi znajdziemy w /etc/pdns/pdns.conf). Wywołanie zgodne z przykładowym wpisem w pdns.conf to http://10.1.1.1:8088. Na stronie tej możemy odnaleźć wiele cennych informacji dotyczących pracy naszego serwera nazw.

 
<- ->