Настройка RPZ в Bind9 (блокировка сайтов)

В этой статье я приведу простой пример настройки RPZ в Bind9.
RPZ (Response Policy Zone) позволяет блокировать доступ к вредоносным и запрещенным сайтам, по имени домена, по IP адресу или сети, блокировать DNS сервера.

Откроем следующий файл конфигурации в текстовом редакторе:

nano /etc/bind/named.conf.options

Активируем RPZ добавив строки ниже в блок options:

response-policy { 
    zone "rpz.local"; 
};

Еще примеры с указанием политик:

response-policy {zone "whitelist" policy passthru; zone "rpz.local" policy disabled;};

Опишу возможные политики:
given — является по умолчанию, можно не указывать, выполняет действия указанные в файле зоны.
disabled — отключает действия указанные в файле зоны и логирует запросы.
passthru — не модифицировать ответ DNS сервера, запросы также логируются.
drop — не отвечать клиенту.
nxdomain — ответ о несуществующем домене.
nodata — ответ об отсутствии данных.
tcp-only — вынуждает клиента выполнить запрос по TCP вместо UDP.
cname domain-name — ответ записью CNAME с указанным доменом на любой запрос указанный в файле зоны.

Откроем следующий файл конфигурации в текстовом редакторе:

nano /etc/bind/named.conf.local

Добавим зону RPZ:

zone "rpz.local" {
    type master;
    file "/etc/bind/db.rpz.local";
    allow-query { "none"; };
    allow-transfer { "none"; };
    //allow-transfer { 1.2.3.4; };
};

Создадим файл зоны из шаблона пустого файла:

cp /etc/bind/db.empty /etc/bind/db.rpz.local
nano /etc/bind/db.rpz.local

Обычно он имеет такое содержимое:

$TTL    86400
@       IN      SOA     localhost. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL
;
@       IN      NS      localhost.

Теперь в конце этого файла можно добавлять блокируемые домены, например (точка означает ответ NXDOMAIN, то есть о несуществующем домене):

vk.com      CNAME  .
ok.ru       CNAME  .

Пример с ответом NODATA:

example.com       CNAME   *.

Можно изменить IP адрес A записи (например вместо 127.0.0.1 можно указать IP адрес HTTP страницы на которой сообщить причину блокировки сайта):

example2.com       A   127.0.0.1

Для удобства можно писать RPZ логи в отдельный файл, покажу пример настройки:

nano /etc/bind/named.conf

logging {
       channel rpzlog {
        file "/var/lib/bind/rpz.log" versions 3 size 3m;
        print-time yes;
        print-category yes;
        print-severity yes;
        severity info;
        //severity notice;
    };
    category rpz { rpzlog; };
};

sudo ln -s /var/lib/bind/ /var/log/

Пример просмотра логов:

tail /var/lib/bind/rpz.log

Проверим корректность конфигурации, если ничего не отобразилось, значит все хорошо:

named-checkconf

После каждого изменения файла нужно изменять Serial, например делаем +1 к текущему значению, чтобы Bind знал что были сделаны изменения иначе изменения не вступят в силу, а также обязательно проверим файл зоны, если например есть неподдерживаемые символы, то будет отображена ошибка и номер строки:

named-checkzone rpz /etc/bind/db.rpz.local

Чтобы применить изменения заставим Bind9 перечитать конфигурацию или просто перезапустим его:

rndc reload
systemctl restart bind9
systemctl status bind9

Проверим:

dig A example.com @127.0.0.1

Можно также на NAT сервере переадресовать все запросы к DNS серверам на Bind9, чтобы пользователи не обошли блокировку сайтов указав у себя сторонние DNS:

iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p udp --dport 53 -j DNAT --to-destination 192.168.2.5
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 53 -j DNAT --to-destination 192.168.2.5

Или можно еще заблокировать клиентам 53 порт и разрешить только к своим DNS.

Смотрите также мою статью:
Установка и настройка DNS-сервера BIND9

Вливайтесь в общение

1 комментарий

Добавить комментарий

  1. >Можно также на NAT сервере переадресовать все запросы к DNS серверам на Bind9, чтобы пользователи не обошли блокировку сайтов указав у себя сторонние DNS:

    Это вряд ли. Пример — vk.com )
    По запросам да — будет 127.блаблабла, а по факты, если через браузер, фик. На микротике у себя сделал это через layer7, а под Ubuntu надо смотреть, что тут с layer7. Вообще не в теме.