Создаем собственный фильтрующий DNS-сервер на базе Pi-hole

  • Автор:

Pi-hole-000.pngСовременный интернет таит множество угроз, и каждый администратор задумывается о фильтрации контента отдаваемого пользователям. Однако многое из того, что хорошо работало раньше стало сейчас неактуальным, основная причина этого - массовый переход на защищённые соединения, которые не дают возможности просматривать трафик пользователя в промежуточных узлах. Поэтому в новых условиях следует применять новые подходы, наиболее эффективным методом на сегодняшний день является фильтрация DNS-запросов. И именно этим мы и займемся.

Применение фильтрующих DNS-серверов получило широкое распространение в последние годы, существует множество сервисов, преимущественно платных, предоставляющих возможность фильтрации запросов по определенным правилам. Обычно это блокировка рекламы, вредоносных сайтов и сайтов с нежелательным содержимым. Также пользователь может добавлять собственные фильтры. Но используя подобные сервисы следует понимать, что они могут собирать и использовать ваши запросы в собственных целях, например, для показа таргетированной рекламы. Особенно это касается бесплатных служб.

Хорошим выходом из данной ситуации будет использование собственного фильтрующего DNS-сервера, такую возможность предоставляет программное обеспечение с открытым исходным кодом - Pi-hole. Продукт распространяется под лицензией European Union Public License (EUPL) v 1.2, которая совестима с другими видами свободных лицензий, включая GPL. Работа Pi-hole основана на широко известных и проверенных программных продуктах: dnsmasq, lighttpd и SQLite, а сам продукт является по сути удобным высокоуровневым интерфейсом для управления фильтрующим DNS-сервером, включая возможность работать через веб-интерфейс.

Установка Pi-hole

Pi-hole обладает достаточно скромными системными требованиями и, как можно предположить из названия, изначально предполагалась к установке на Raspberry Pi, это возможно и сегодня. Кроме того, поддерживается гораздо более широкий набор платформ, включая Docker. Из интересующих нас это Ubuntu 16.x / 18.x / 20.x архитектуры ARM / x86_64 и Debian 9 / 10 архитектуры ARM / x86_64 / i386. Из требований от 2 ГБ свободного пространства (рекомендуется 4 ГБ) и от 512 МБ ОЗУ.

Перед установкой поднимем права до суперпользователя командой:

sudo -s

Затем обновим список пакетов и выполним апгрейд системы:

apt update
apt dist-upgrade

И установим, если это не было сделано ранее, пакет curl:

apt install curl

Также обязательно настройте на вашем сервере статический IP-адрес. В последних версиях Ubuntu для этого следует использовать netplan.

Выполнив все предварительные настройки приступим к установке Pi-hole:

curl -sSL https://install.pi-hole.net | bash

Данная команда скачает и запустит скрипт установки, после чего вы увидите псевдографический инсталлятор, который последовательно проведет вас через все этапы установки продукта. Сначала вам потребуется указать сетевой интерфейс, на котором DNS-сервер будет принимать запросы, будьте внимательны и указывайте только внутренние интерфейсы.

Pi-hole-001.pngЗатем укажите желаемого DNS-провайдера, который будете использовать в качестве вышестоящего сервера, в списке присутствуют основные публичные DNS-сервера, но после установки вы всегда сможете изменить эти настройки, в т.ч. указав собственные адреса.

Pi-hole-002.pngЗатем предлагается выбрать списки для блокировки рекламы (основное назначение Pi-hole по задумке разработчиков), в настоящий момент доступен только один список.

Pi-hole-003.png

Соглашаемся с установкой веб-интерфейса:

Pi-hole-004.pngИ предлагаемым режимом работы веб-сервера, в качестве которого выбран легковесный, но производительный lighttpd:

Pi-hole-005.png

Разрешаем ведение лога запросов:

Pi-hole-006.pngИ выбираем уровень приватности. Доступны несколько значений: от полного логирования (уровень 0), до полной анонимности (уровень 3). Так как у нас сервер будет обслуживать собственную сеть и нам надо видеть кто, куда, зачем и почему - то ставим нулевой уровень.

Pi-hole-007.pngПосле окончания работы инсталлятора установим пароль для веб-интерфейса:

pihole -a -p

Командный интерфейс Pi-hole достаточно информативный и наглядно показывает результат той или иной операции.

Pi-hole-008.pngДля нормальной работы веб-интерфейса выполним еще ряд операций. Прежде всего установим владельца и новый набор прав на конфигурационные файлы и базы данных, если этого не сделать, то веб-интерфейс будет работать только на чтение, а при попытке создать любой новый объект вы получите ошибку: Error, something went wrong! While executing: attempt to write a readonly database.

chown -R pihole:pihole /etc/pihole
chmod -R g+rw,u+rw /etc/pihole

Затем включим пользователя веб-сервера в группу pihole:

usermod -aG www-data pihole

На этом установку можно считать законченной.

Начало работы с Pi-hole

Далее мы будем рассматривать работу через веб-интерфейс, который достаточно удобен и позволяет использовать все возможности продукта, не прибегая к командной строке. Чтобы попасть в панель управления наберем в адресной строке браузера http://IP_ADDRESS/admin

Pi-hole-009.png

Начнем с раздела Settings, где расположены общие настройки сервера. Вкладка System содержит информацию о системе, кнопки для ее выключения и перезагрузки, выключения и очистки логов, перезагрузки DNS-сервера и очистки сетевой таблицы, куда помещаются MAC-адреса клиентских устройств.

Pi-hole-010.pngНа вкладке DNS можно изменить настройки вышестоящих DNS-серверов, мы можем как выбрать их из списка, так и указать собственные. В списке каждой ячейке соответствует один сервер, а сами ячейки соответствуют основному и дополнительному DNS, если подвести мышку - то появится всплывающая подсказка с адресом сервера. Ниже расположены дополнительные опции, они достаточно хорошо документированы прямо в интерфейсе, и мы не видим смысла дополнительно приводить их описание.

Pi-hole-011.pngТак как Pi-hole содержит под капотом хорошо известный нашим читателям dnsmasq, то кроме функции DNS-сервера он может также выступать DHCP-сервером вашей сети. По умолчанию DHCP-сервер выключен, вы можете включить и настроить его на одноименной вкладке, запутаться там определенно негде, настройки не сложнее чем в бытовом роутере.

Pi-hole-012.pngИ наконец на вкладке Teleporter можно выполнить резервное копирование и восстановление сервера, причем восстановление можно производить выборочно, например, восстановить только определенные списки или записи.

Pi-hole-013.pngЕсли вы будете использовать Pi-hole в качестве основного DNS-сервера сети, то в разделе Local DNS можно добавлять собственные записи типа A или CNAME, после добавления не забывайте перезапустить DNS-сервер.

Pi-hole-014.png

Теперь перейдем к основному назначению нашего сервера - фильтрации. В ее основе лежат списки, это - основная ценность данных систем, для качественной фильтрации списки должны быть актуальными и своевременно обновляться. Ознакомиться с подключенными списками можно в разделе Group Managment - Adlists, по умолчанию там подключен только один список, от разработчиков. Однако, прежде чем браться за фильтрацию, мы советуем отключить все списки и проверить работу сервера в обычном режиме, убедившись, что все работает как надо.

Pi-hole-015.png

Затем можно включить список и оценить результат. Рекламы на страницах практически не станет, в этом плане список достаточно эффективный и его одного будет вполне достаточно. Но вы можете подключить и другие списки. Их в достатке можно найти на просторах сети, существуют даже сборники таких листов: pihole-ads-list. Чтобы добавить лист достаточно внести в соответствующее поле его адрес, также не забывайте давать осмысленные комментарии. Но лист - это всего лишь адрес, чтобы начать работу его содержимое нужно получить и добавить в базу данных Pi-hole. Пока это не сделано - напротив листа будет стоять серый кружок со знаком вопроса, у загруженных листов стоит зеленая галочка.

Pi-hole-016.pngДля обновления следует либо выполнить в консоли команду:

pihole -g

Либо перейти в раздел Tools - Update Gravity и нажать кнопку Update.

Pi-hole-017.pngДля обновления самого Pi-hole следует выполнить консольную команду:

pihole -up

Делать это можно даже из-под обычной учетной записи, в этом случае будет запрошен пароль sudo и повышение прав произойдет автоматически.

Pi-hole-018.png

Разделяй и властвуй - создаем и настраиваем списки

После того, как сделаны базовые настройки и подключены первые списки обязательно встает вопрос о выборочном применении фильтрации. Следует понимать, что Pi-hole фильтрует DNS-запросы и мы не можем, как в популярных браузерных плагинах, настроить выборочный показ рекламы для определенных доменов, всё чем мы можем оперировать - это доменное имя и адрес источника. Но и это дает многое.

Прежде всего определимся с политикой по умолчанию, у Pi-hole имеется встроенная группа Default в которую попадают все клиенты, которые явно не отнесены к другим группам. Затем следует выделить отдельные узлы и распределить их по группам. Для этого перейдем в Group Managment - Groups и создадим сами группы, ничего сложного там нет, указываем имя группы и описание (по желанию). Затем перейдем в Group Managment - Clients и выберем нужный адрес из выпадающего списка. Для того, чтобы клиент попал в этот список он должен сделать хотя бы один запрос через наш сервер. Также его можно очистить кнопкой Flush network table в Settings - System.

Pi-hole-019.pngЗатем внизу, в списке уже добавленных клиентов, в поле Group assignment укажите членство в желаемых группах. Возможен множественный выбор.

Pi-hole-020.pngТакже вы можете просто указать MAC или IP-адрес клиента, имя хоста, подсеть или интерфейс. Например, если у вас подключено несколько сетевых карт, то можно явно указать, что все запросы от клиентов с eth0 попадают в одну группу, а запросы с eth1 в другую. Затем перейдем к подключенным спискам и точно также укажем для каких групп они применяются.

Pi-hole-021.pngКроме списков в Adlists можно вести собственные белые и черные списки, расположенные в разделах Whitelist и Blacklist соответственно, кроме того, все добавленные в эти списки домены будут отображаться в Group Managment - Domains, где ими можно также управлять. Это открывает широкие возможности по фильтрации не только рекламы, но и любого интернет содержимого.

Допустим, мы хотим заблокировать соцсети для определенной группы клиентов. Для этого создадим отдельную группу BlockSocial и поместим в нее нужных клиентов. После чего перейдем в раздел Group Managment - Domain management и добавим в черный список - Add to Blacklist - адреса социальных сетей, которые мы хотим заблокировать, при этом не забудьте поставить флаг Add domain as wildcard, в этом случае запись будет добавлена в виде регулярного выражения, включающего как домен, так и все его поддомены. Для созданной записи сразу указываем группы, к которым она будет применяться.

Pi-hole-022.pngТочно также мы можем добавить домены в белый список, который будет исключать их из блокировки вне зависимости от наличия в списках. Добавить домены в списки вы можете также в разделах Whitelist и Blacklist, но для того, чтобы назначить их группам вам все равно придется вернуться в Domain management, поэтому лучше все действия изначально выполнять здесь.

Добавили, проверяем. Как видим, все отлично работает.

Pi-hole-023.png

На что следует обратить внимание? Все добавляемые записи могут быть двух типов: Regex - регулярное выражение и Exact - точное совпадение. Для составления и проверки первых советуем воспользоваться специальными сервисами, один из которых Regex101.

Следующий важный момент - наложение списков. Один клиент может одновременно входить в несколько групп и к каждой группе могут быть привязаны различные списки. Каким образом будет происходить фильтрация? В этом случае будет выполнено несколько комбинаций, которые мы перечислим по возрастанию приоритета. Сначала для каждой группы клиента будут получены списки Adlists и объединены, затем они будут дополнены черными списками для каждой группы, а потом к ним будут применены исключения из сопоставленных с группами белых списков. На первый взгляд вроде бы несложно, но мы не советуем делать сложных пересечений, потому как можно получить совершенно неожиданный результат для совершенно неожиданной группы клиентов.

Не только лишь все - доступ по белому списку

Мы уже неоднократно говорили, что современные сайты - это весьма сложные программные комплексы, которые могут подгружать необходимые для своего функционирования ресурсы со сторонних узлов, чаще всего это скрипты, стили, шрифты, изображения и т.д. и т.п. Но в наших реалиях есть ряд сценариев когда доступ к сети следует ограничить строго определенным списком сайтов и Боже упаси, если проверка сумеет выйти за пределы этого списка. Такая политика, например, действует во многих учебных заведениях. Pi-hole и здесь сможет помочь.

Прежде всего заведем отдельную группу, которая будет выходить только по белому списку, при этом помним, что Pi-hole позволяет включать пользователей в группы по входящему интерфейсу, что в данном случае очень удобно - любое устройство, подключенное к определенной сети, автоматически попадет под ограничения.

Затем перейдем в Group Managment - Domain management и на закладке RegEx filter в поле Regular Expression поставим символ * (звездочка), добавим эту запись в черный список и назначим ее созданной группе. После этого для всех участников этой группы будут блокироваться все DNS-запросы, фактически мы отключили ее от глобальной сети.

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

Pi-hole-024.pngНо не все сайты будут нормально работать в таком режиме. Где-то поедет верстка, где-то пропадет важная функциональность. В этом случае нужно выявить связанные ресурсы и также добавить их в белый список. Например, на нашем сайте используется внешняя система комментариев Disqus, чтобы разблокировать ее перейдем в Query Log и внимательно изучим лог запросов, в котором обязательно обнаружатся связанные с интересующим нас узлом записи. Прямо отсюда добавляем их в белый лист, проверяем работу сайта и снова изучаем лог, последовательно разрешая связанные ресурсы до тех пор, пока сайт не начнет работать так, как нам надо.

Pi-hole-025.pngРабота эта достаточно кропотливая и трудоемкая, но большинство связанных ресурсов находится на крупных международных хостингах и проделав весь труд для одного сайта, вы, скорее всего, получите удовлетворительный результат и для остальных. Но затраченные усилия непременно отобьются - фактически вы получите непробиваемую защиту, ни один пользователь не сможет пройти дальше белого списка.

Заключение

Как мы могли убедиться, Pi-hole это гораздо больше, чем просто блокировка рекламы. Фактически вам в руки попадает удобный и мощный фильтрующий DNS-сервер, который можно использовать в самых различных сценариях управления доступом к сети интернет, включая самые жесткие. Управлять всем этим полноценно можно из удобной веб-панели, что позволяет значительно снизить порог входа для освоения продукта и не требовать от оператора обязательного знания Linux-систем. В тоже время под капотом находятся понятные и привычные инструменты, а следовательно, опытный администратор будет иметь полный контроль над собственной системой.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал