Blokowanie zapytań DNS za pomocą iptables
Napisał: Patryk Krawaczyński
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?