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

в 16:03, , рубрики: DNS, linux, администрирование, Песочница, метки: , ,

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

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

Покажем работу 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.
В браузере увидим следующее:
Фильтрация запросов на уровне DNS
Разумеется, мы можем сделать подмену на свой внутренний сервер, который, например, будет сообщать клиенту, что доступ на запрошенный домен запрещен политикой безопасности.

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:
Фильтрация запросов на уровне DNS
Нетрудно догадаться, что все субдомены домена blabla.com будут подменены на адрес 1.2.3.4, а все домены зоны xxx будут заменены на localhost.

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

А чтобы подобное безобразие не мозолило глаз более-менее грамотным пользователям, средствами веб-сервера (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/

Автор: demonmolo

Источник


  1. Max:

    Хорошая статья, вот только хотел узнать почему когда в файле зоны прописываешь
    “vk.com CNAME .”
    в firefox грузится главная страница сайта, только в firefox в других браузерах не грузится и не пингуется сам сайт

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js