В этой статье я приведу простой пример настройки 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
>Можно также на NAT сервере переадресовать все запросы к DNS серверам на Bind9, чтобы пользователи не обошли блокировку сайтов указав у себя сторонние DNS:
Это вряд ли. Пример — vk.com )
По запросам да — будет 127.блаблабла, а по факты, если через браузер, фик. На микротике у себя сделал это через layer7, а под Ubuntu надо смотреть, что тут с layer7. Вообще не в теме.