V nedávnej dobe som sa stretol (bohužiaľ na vlastnej koži:) s problémom vyťaženia DNS serverov. DNS servery dokázali resolvnúť IP adresu zvyčajne až na 2-3 krát. Niekedy sa im to ani nepodarilo.


Po preštudovaní logov som dospel k záveru, že sú zahltené požiadavkami z vonkajšej siete. A k tomu ešte aj mimo domén, ktorým sú doménovými servermi. Niekto z vonkajšej siete si proste nastavil moje DNS serveri a takých bolo zrejme viacej.
O zabezpečení DNS serverov sa toho píše na internete pomenej, aspoň ja som mal problém niečo relevantné nájsť. Nakoniec sa podarilo na: www.cymru.com

To, čo sa snažíme dosiahnuť, sú v podstate 2 veci:
1. z vonkajšej siete povoliť dotazy iba na naše domény
2. z vnútornej siete samozrejme povoliť všetko

Vyššie uvedený stav dosiahneme pomocou ACL (Access Control Listov). Príklad štandardnej konfigurácie BIND9 uvedený v named.conf nám teda veľmi nepomôže :) Poďme teda na to..

Majme jednu C-čkovú sieť verejných IP adries, jednu C-čkovú sieť privátnych IP adries, dva vnútorné a jeden vonkajší DNS server:

230.220.210.0/24 – naša vonkajšia sieť
192.168.1.0/24 – naša vnútorná sieť
230.220.210.3, 230.220.210.4 – naše DNS servery
232.222.212.3 – vonkajší DNS server

Uvediem konfiguráciu master DNS servera s tým, že tento server bude zároveň routrom našej vnútornej siete (iba kvôli príkladu konfigurácie :). chroot() BIND9 je samozrejmosťou a nebudem sa ňou zaoberať (naštudujte si sami ;).

/var/bind/etc/bind/named.conf:

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include “/etc/bind/named.conf.options”;

// prime the server with knowledge of the root servers
//zone “.” {
// type hint;
// file “/etc/bind/db.root”;
//};

// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912

//zone “localhost” {
// type master;
// file “/etc/bind/db.local”;
//};

//zone “127.in-addr.arpa” {
// type master;
// file “/etc/bind/db.127”;
//};

//zone “0.in-addr.arpa” {
// type master;
// file “/etc/bind/db.0”;
//};

//zone “255.in-addr.arpa” {
// type master;
// file “/etc/bind/db.255”;
//};

// zone “com” { type delegation-only; };
// zone “net” { type delegation-only; };

// From the release notes:
// Because many of our users are uncomfortable receiving undelegated answers
// from root or top level domains, other than a few for whom that behaviour
// has been trusted and expected for quite some length of time, we have now
// introduced the “root-delegations-only” feature which applies delegation-only
// logic to all top level domains, and to the root domain. An exception list
// should be specified, including “MUSEUM” and “DE”, and any other top level
// domains from whom undelegated responses are expected and trusted.
// root-delegation-only exclude { “DE”; “MUSEUM”; };

include “/etc/bind/named.conf.local”;

/var/bind/etc/bind/named.conf.options:

acl “xfer” {
// sem uvedieme slave DNS servery, na ktoré sa bude robiť transfer našich zón
230.220.210.4;
232.222.212.3;
localhost;
};

acl “trusted” {
// naša sieť, ktorej povolíme všetky dotazy
230.220.210.0/24;
192.168.1.0/24;
};

acl “bogon” {
// IP adresy, z ktorých by sme dotazy dostať nemali, keďže ale náš DNS server
// robí aj router, musíme tu odkomentovať sieť zodpovedajúcu našej vnútornej
// sieti
0.0.0.0/8;
1.0.0.0/8;
2.0.0.0/8;
5.0.0.0/8;
7.0.0.0/8;
10.0.0.0/8;
23.0.0.0/8;
27.0.0.0/8;
31.0.0.0/8;
36.0.0.0/8;
37.0.0.0/8;
39.0.0.0/8;
41.0.0.0/8;
42.0.0.0/8;
49.0.0.0/8;
50.0.0.0/8;
58.0.0.0/8;
59.0.0.0/8;
71.0.0.0/8;
72.0.0.0/8;
73.0.0.0/8;
74.0.0.0/8;
75.0.0.0/8;
76.0.0.0/8;
77.0.0.0/8;
78.0.0.0/8;
79.0.0.0/8;
85.0.0.0/8;
86.0.0.0/8;
87.0.0.0/8;
88.0.0.0/8;
89.0.0.0/8;
90.0.0.0/8;
91.0.0.0/8;
92.0.0.0/8;
93.0.0.0/8;
94.0.0.0/8;
95.0.0.0/8;
96.0.0.0/8;
97.0.0.0/8;
98.0.0.0/8;
99.0.0.0/8;
100.0.0.0/8;
101.0.0.0/8;
102.0.0.0/8;
103.0.0.0/8;
104.0.0.0/8;
105.0.0.0/8;
106.0.0.0/8;
107.0.0.0/8;
108.0.0.0/8;
109.0.0.0/8;
110.0.0.0/8;
111.0.0.0/8;
112.0.0.0/8;
113.0.0.0/8;
114.0.0.0/8;
115.0.0.0/8;
116.0.0.0/8;
117.0.0.0/8;
118.0.0.0/8;
119.0.0.0/8;
120.0.0.0/8;
121.0.0.0/8;
122.0.0.0/8;
123.0.0.0/8;
124.0.0.0/8;
125.0.0.0/8;
126.0.0.0/8;
127.0.0.0/8;
169.254.0.0/16;
172.16.0.0/12;
173.0.0.0/8;
174.0.0.0/8;
175.0.0.0/8;
176.0.0.0/8;
177.0.0.0/8;
178.0.0.0/8;
179.0.0.0/8;
180.0.0.0/8;
181.0.0.0/8;
182.0.0.0/8;
183.0.0.0/8;
184.0.0.0/8;
185.0.0.0/8;
186.0.0.0/8;
187.0.0.0/8;
189.0.0.0/8;
190.0.0.0/8;
192.0.2.0/24;
//192.168.0.0/16;
197.0.0.0/8;
223.0.0.0/8;
224.0.0.0/3;
};

logging {
// bezpečnostné logy budeme zapisovať do osobitného súboru
channel “default_syslog” {
file “/var/log/named.syslog”;
severity debug;
print-time yes;
};
channel audit_log {
file “/var/log/named.log”;
severity debug;
print-time yes;
};
category default { default_syslog; };
category general { default_syslog; };
category security { audit_log; default_syslog; };
category config { default_syslog; };
category resolver { audit_log; };
category xfer-in { audit_log; };
category xfer-out { audit_log; };
category notify { audit_log; };
category client { audit_log; };
category network { audit_log; };
category update { audit_log; };
category queries { audit_log; };
category lame-servers { audit_log; };
};

options {
// všeobecné nastavenia
directory “/var/cache/bind”;
statistics-file “/var/cache/bind/named.stats”;
dump-file “/var/cache/bind/named.dump”;
zone-statistics yes;
notify yes;
transfer-format many-answers;
max-transfer-time-in 60;
interface-interval 0;
allow-transfer { xfer; };
allow-query { any; };
blackhole { bogon; };
auth-nxdomain no;
transfers-per-ns 2;
};

/var/bind/etc/bind/named.conf.local:

view “internal-in” in {
// v tejto časti definujeme zóny, ktoré budú viditeľné z našej vnútornej siete
match-clients { trusted; };
recursion yes;
additional-from-auth yes;
additional-from-cache yes;

zone “.” {
type hint;
file “/etc/bind/db.root”;
};
zone “localhost” {
type master;
file “/etc/bind/db.local”;
allow-query { any; };
allow-transfer { none; };
};
zone “127.in-addr.arpa” {
type master;
file “/etc/bind/db.127”;
allow-query { any; };
allow-transfer { none; };
};
zone “0.in-addr.arpa” {
type master;
file “/etc/bind/db.0”;
allow-query { any; };
allow-transfer { none; };
};
zone “255.in-addr.arpa” {
type master;
file “/etc/bind/db.255”;
allow-query { any; };
allow-transfer { none; };
};
zone “210.220.230.in-addr.arpa” {
type master;
file “db.firma”;
allow-query { any; };
};
zone “internadomena.sk” {
type master;
file “internadomena.sk”;
allow-query { any; };
allow-transfer { xfer; };
};
zone “externadomena.sk” {
type master;
file “externadomena.sk”;
allow-query { any; };
allow-transfer { xfer; };
};
};

view “external-in” in {
// v tejto časti definujeme zóny, ktoré budú viditeľné z vonkajšej siete
match-clients { any; };
recursion yes;
additional-from-auth no;
additional-from-cache no;

zone “.” {
type hint;
file “/etc/bind/db.root”;
};
zone “210.220.230.in-addr.arpa” {
type master;
file “db.firma”;
allow-query { any; };
};
zone “externadomena.sk” {
type master;
file “externadomena.sk”;
allow-query { any; };
allow-transfer { xfer; };
};
};

view “external-chaos” chaos {
// na zmätenie vnútorného nepriateľa ;)
match-clients { any; };
recursion no;

zone “.” {
type hint;
file “/dev/null”;
};
zone “bind” {
type master;
file “db.bind”;
allow-query { trusted; };
allow-transfer { xfer; };
};
};

/var/bind/var/cache/bind/db.bind:

$TTL 1D
$ORIGIN bind.
@ 1D CHAOS SOA localhost. root.localhost. (
2004032800 ; serial
3H ; refresh
1H ; retry
1W ; expiry
1D ) ; minimum
CHAOS NS localhost.

version.bind. CHAOS TXT “BIND 1.1.1”
authors.bind. CHAOS TXT “are better coders than I. :)”

Toto je iba jednoduchá konfigurácia, ktorá riešila môj problém. BIND9
samozrejme ponúka ďaleko rozsiahlejšie možnosti nastavenia konfigurácie.
Tie si ale musíte nájsť v /usr/share/doc/bind9-doc/ ;)

Leave a Reply