Pull to refresh

Фильтрация запросов на уровне DNS

Reading time 4 min
Views 18K
Начиная с версии 9.8.1 DNS-сервера bind появилась новая возможность — DNS RPZ. Это интересный инструмент, который может оказаться весьма полезным для многих сисадминов. Странно, но в русскоязычном сегменте интернета эта тема совершенно не освещена. Спешу восполнить этот пробел.

Что это за зверь и с чем его едят?


Аббревиатура RPZ означает response policy zone — зона с политикой ответов. Это технология, разработанная ISC, которая предоставляет опрераторам связи простой способ блокирования DNS-запросов к некоторым ресурсам или перенаправления их на альтернативный адрес. RPZ — это зона, которая может передаваться между серверами (DNS AXFR/IXFR), защищена подписями транзакций (DNS TSIG) и обновляется в режиме реального времени (DNS NOTIFY).

Формат зоны


Как и для любой другой DNS-зоны, требуется SOA-запись и, как минимум, одна NS-запись. SOA — действительная, имеющая серийный номер и таймеры запись, используемая для делегирования зоны и указывающая времени жизни записей (TTL). NS-запись никогда не используется и служит для совместимости. Обычно, единственная NS-запись имеет фиктивное значение localhost. Остальная часть зоны — это выражения для DNS-политик. Политики могут применяться к именам доменов или к их шаблонам.

Как работает


Упрощенно работу RPZ можно представить следующей схемой:

В правой части показана схема работы с обычным кеширующим DNS-сервером, который возвращает клиенту все ответы от коневых серверов, как есть. В случае с RPZ появляется Security Policy Provider (провайдер политик безопасности) — DNS-сервер с которого мы берем политики разрешения доменных имен. Наличие стороннего провайдера совершенно не обязательно, мы можем сами задать свои локальные политики. Об этом чуть позже, в примерe.

Провайдеров может быть несколько, в том числе мы можем создать свой собственный сервер RPZ:

Более подробно о работе протокола можно прочитать в официальной документации (ссылки ниже) — думаю, те, кому нужны детали, осилят ее самостоятельно.

Покажем работу RPZ на примере рабочих конфигов. Здесь подразумевается что у вас уже есть настроенный DNS-сервер, я лишь покажу опции, которые нужно включить, чтобы все заработало. Действо разворачивается в Ubuntu 12.10.

Сперва в файле /etc/bind/named.conf.options опцией «response-policy» включаем RPZ:
response-policy { 
    zone "rpz.zone";
  };


Внутри «response-policy» зон может быть несколько, причем у каждой может быть своя политика (подробности см. в спецификации).

В файле /etc/bind/named.conf.local помещаем описание зоны:
zone "rpz.zone" {
       type master;
       file "/etc/bind/db.rpz.zone";
       allow-query {any;};
       allow-update {none;};
};


И, наконец, сама зона (файл /etc/bind/db.rpz.zone):
;RPZ
$TTL 10
@       IN SOA rpz.zone. rpz.zone. (
       5;
       3600;
       300;
       86400;
       60 )
       IN      NS      localhost.

vk.com          CNAME   habrahabr.ru.
*.gov.by        CNAME   .
gov.by          MX      0       gmail.com.
*.blabla.com    A       1.2.3.4
*.xxx           A       127.0.0.1 
1.by               CNAME   abcde-net.by.



Применяем новые настройки:
sudo rndc reload

и смотрим, что у нас вышло:
dig vk.com

; <<>> DiG 9.8.1-P1 <<>> vk.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11880
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;vk.com.                                IN      A

;; ANSWER SECTION:
vk.com.                 10      IN      CNAME   habrahabr.ru.
habrahabr.ru.           466     IN      A       212.24.43.44

;; Query time: 0 msec
;; SERVER: 192.168.3.204#53(192.168.3.204)
;; WHEN: Thu Apr 25 00:56:49 2013
;; MSG SIZE  rcvd: 66


Как видно из ответа сервера, адрес подменен на habrahabr.ru.
В браузере увидим следующее:

Разумеется, мы можем сделать подмену на свой внутренний сервер, который, например, будет сообщать клиенту, что доступ на запрошенный домен запрещен политикой безопасности.

dig gov.by

; <<>> DiG 9.8.1-P1 <<>> gov.by
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10961
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;gov.by.                                IN      A

;; AUTHORITY SECTION:
rpz.zone.               10      IN      SOA     rpz.zone. rpz.zone. 8 3600 300 86400 60

;; Query time: 11 msec
;; SERVER: 192.168.3.204#53(192.168.3.204)
;; WHEN: Thu Apr 25 00:59:18 2013
;; MSG SIZE  rcvd: 68


Здесь запрос остался без ответа. То же самое произойдет с любым поддоменом gov.by:

Нетрудно догадаться, что все субдомены домена blabla.com будут подменены на адрес 1.2.3.4, а все домены зоны xxx будут заменены на localhost.

Последнюю строчку зоны поясню отдельно. Являясь мелким провайдером в провинциальном городке, часто сталкиваемся с проблемой совершенно тугих юзеров, для которых набрать адрес нашей домашней странички является непосильной задачей (а это отправная точка для всех наших внутренних ресурсов).
Дело порой доходит до комических случаев, когда техподдержка бьется в истерике головой об стол. Именно для этого была создана эта запись. Клиенту достаточно набрать в адресной строке браузера «1.by» (без кавычек), и он попадает туда, куда нужно:


А чтобы подобное безобразие не мозолило глаз более-менее грамотным пользователям, средствами веб-сервера (RewriteRule в Apache) хост «1.by» перенаправляется на валидный адрес сервера.

Ссылки:
ftp.isc.org/isc/dnsrpz/isc-tn-2010-1.txt
kb.isc.org/category/110/0/10/Software-Products/BIND9/Features/DNSRPZ
Tags:
Hubs:
+18
Comments 11
Comments Comments 11

Articles