NFsec Logo

Blokowanie zapytań DNS za pomocą iptables

29/11/2014 w Administracja Brak komentarzy.  (artykuł nr 467, ilość słów: 453)

Z

ałóżmy, że do naszego serwera DNS, który jest otwarty tylko dla sieci wewnętrznej zaczyna przychodzić niechciany ruch (od setek do tysięcy zapytań na sekundę) pochodzący od szkodliwego oprogramowania / złej konfiguracji serwerów. W zależności od oprogramowania jakiego używamy do obsługi zapytań DNS – zablokowanie konkretnego rodzaju zapytań może stać się dość trudne. Pierwszym rozwiązaniem tego problemu wydaje się zablokowanie wszystkich żądań DNS, które posiadają konkretne wyrażenie w zawartości pakietu.

Do tego rodzaju zadania – iptables wraz z inspekcją zawartości pakietów wydaje się dobrym rozwiązaniem. Przeszkodą w prostej implementacji tego sposobu jest fakt, że zapytania DNS nie posiadają czystego ciągu, który możemy dopasować, lecz są zakodowane w następujący sposób: X domena Y TLD. Gdzie X to liczba bajtów w części nazwy domeny i Y to liczba bajtów w części domeny najwyższego poziomu. Dlatego jeśli chcemy zablokować na przykład domenę 123.com (X = 3, Y = 3) w zapisie iptables będzie to miało postać:

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --hex-string "|03|123|03|com" \
--algo bm -j DROP

Idąc dalej – możemy również odwołać się do konkretnego rodzaju zapytania DNS. Techniczne wygląda to tak:
X domena Y TLD 0, gdzie liczba zero wskazuje, że nie ma więcej części domeny. Po tym znaku bezpośrednio następują dwa bajty wskazujące rodzaj zapytania DNS według schematu:

+=======+======+
|  Typ  | Kod  |
+=======+======+
| Każdy | 00ff |
+-------+------+
| A     | 0011 |
+-------+------+
| CNAME | 0005 |
+-------+------+
| MX    | 000f |
+-------+------+
| AAAA  | 001c |
+-------+------+
| NS    | 0002 |
+-------+------+
| SOA   | 0006 |
+-------+------+

Zgodnie z konwencją przyjętą według powyższego schematu – chcąc zablokować wszystkie zapytania o rekord MX dla domeny wp.pl w zapisie iptables będzie to miało postać:

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --hex-string "|02|wp|02|pl|00000f|" \
--algo bm -j DROP -m comment --comment 'Block wp.pl MX'

W tym przykładzie dodatkowo został wykorzystany moduł comment iptables, ponieważ wszystkie regułki jakie dodamy zostaną i tak skonwertowane do kodu HEX, co przy większej ilości takich wpisów spowoduje zanik czytelności (iptables -vnL).

udp dpt:53 STRING match  "|02777002706c00000f|" ALGO name bm TO 65535 /* Block wp.pl MX */

Działanie reguły możemy przetestować za pomocą polecenia host:

root@darkstar:~# host -t mx domena.pl 192.168.1.1
Using domain server:
Name: 192.168.1.1
Address: 192.168.1.1#53
Aliases:

domena.pl mail is handled by 5 mail.domena.pl.

root@darkstar:~# host -t mx wp.pl 192.168.1.1
;; connection timed out; no servers could be reached

Po przekroczeniu czasu odpowiedzi polecenie host zwróci nam odpowiedni komunikat błędu.

Więcej informacji: Block DNS queries for specific zone with IPTables, Can iptables allow DNS queries only for a certain domain name?

Kategorie K a t e g o r i e : Administracja

Tagi T a g i : , , , ,

Komentowanie tego wpisu jest zablokowane.