Настройка сервера Bind для разрешения имен в зависимости от геолокации

Обновлено и опубликовано Опубликовано:

Используемые термины: Bind, Linux, DNS.

Предположим, наш DNS сервер должен отдавать разные ответы в зависимости от того, с какой страны к нему пришло обращение. Это можно сделать с помощью Bind + GeoIP (база от MaxMind) + View (Split DNS). В данной инструкции мы настроим:

  • Совместную работу Bind с базой GeoIP формата MaxMind DB.
  • Автоматическое получение и обновление базы IP адресов с привязкой к странам.
  • Split DNS для выдачи разных ответов в зависимости от местоположения источника запроса.

Рассмотрим процесс на примере Linux (Deb и RPM). Сервер Bind уже должен быть установлен. Ссылки на соответствующую и другие инструкции будут приведены в конце страницы.

Требования к Bind

Сервер bind должен поддерживать геозапросы. Для этого он собирается с опцией --with-maxminddb. Начиная с версии 9.16 данная опция уже включена по умолчанию.

Посмотреть версию сервера dns можно командой:

named -v

Или можно сразу проверить, собран ли bind с нужной ли нам опцией:

named -V |& grep -i "maxminddb"

Если наш сервер не поддерживает запросы к базе GeoIP, то нам необходимо либо обновить пакет до версии 9.16 и выше, либо пересобрать named из исходников.

Загрузка базы MaxMind DB и настройка ее обновления

Компания MaxMind предоставляет базу IP-адресов как по платной, так и бесплатной подписке. В любом случае, необходимо пройти процедуру регистрации на их сайте и получить конфигурационный файл с прописанным токеном.

Переходим на страницу регистрации и заполняем формы на сайте. В результате мы должны получить возможность скачать персональную конфигурацию. Загружаем файл. Он нам понадобится позже.

Переходим на страницу в Github с релизами утилиты geoipupdate. Смотрим последнюю версию приложения и создаем переменную:

VER=7.1.0

* в моем предполагается, что 7.1.0 — самая свежая версия geoipupdate.

На сервере bind загружаем пакет для установки утилиты и устанавливаем ее. В зависимости от типа Linux, наши действия будут немного отличаться.

а) Для Deb (Debian / Ubuntu / Astra):

curl -sLO https://github.com/maxmind/geoipupdate/releases/download/v${VER}/geoipupdate_${VER}_linux_amd64.deb

dpkg -i geoipupdate_${VER}_linux_amd64.deb

б) Для RPM (Rocky / CentOS / РЕД ОС):

curl -sLO https://github.com/maxmind/geoipupdate/releases/download/v${VER}/geoipupdate_${VER}_linux_amd64.rpm

rpm -i geoipupdate_${VER}_linux_amd64.rpm

После установки приложения нам остается его настроить и добавить его запуск в планировщик.

Открываем или создаем файл:

vi /etc/GeoIP.conf

Добавляем в него содержимое загруженного с сайта MaxMind файла.

Запускаем утилиту:

geoipupdate

После ее работы мы должны увидеть скачанные файлы с базой IP адресов и привязкой к локациям:

ls -la /usr/share/GeoIP/

В каталоге будет несколько файлов — нам важен файл Country:

GeoLite2-Country.mmdb

Последний штрих — настройка планировщика для автоматического обновления геобазы:

crontab -e

0 0 * * * /usr/bin/geoipupdate

* в данном примере мы будем запускать процесс проверки обновлений каждый день в 00:00. Обновлять базу необходимо, так как информация о IP-адресах постоянно меняется.

Можно переходить к настройке DNS сервера.

Настройка Bind

Открываем основной конфигурационный файл с настройками bind. В зависимости от типа Linux, данный файл находится по разным путям.

а) Для Deb (Debian / Ubuntu / Astra):

vi /etc/bind/named.conf.options

б) Для RPM (Rocky / CentOS / РЕД ОС):

vi /etc/named.conf

В раздел options необходимо добавить директиву geoip-directory, которая должна указывать на путь с базой geoip.

Добавим:

options {
    geoip-directory "/usr/share/GeoIP";
    ...
};

* в нашем случае база находится в каталоге /usr/share/GeoIP.

Теперь откроем файл с настройками списка зон.

а) Для Deb (Debian / Ubuntu / Astra):

vi /etc/bind/named.conf.local

б) Для RPM (Rocky / CentOS / РЕД ОС):

vi /etc/named.conf

Мы должны определить списки acl (Access Control List), которые будут включать в себя геоданные с пометкой кода страны.

Например:

acl "acl-russia" {
    geoip country RU;
};

acl "acl-belarus" {
    geoip country BY;
};

acl "acl-kazakhstan" {
    geoip country KZ;
};

* в данном случае мы определили три ACL для России (RU), Беларуси (BY) и Казахстана (KZ).
** список кодов и стран можно посмотреть на странице в Github.

Теперь в этом же файле мы должны определить view с привязкой к определенному ACL. Внутри данного view мы можем перечислить зоны:

view "view-sng" {
    match-clients { acl-russia; acl-kazakhstan; acl-belarus; };

    zone "dmosk.ru" {
        file "master/dmosk.ru.sng";
        type master;
    };
};

view "default" {
    zone "dmosk.ru" {
        file "master/dmosk.ru.default";
        type master;
    };
};

* где:

  • view — определяет контекст, который содержит свои настройки зон. Каждый запрос к DNS будет обрабатываться только одним контекстом. В нашем случае создано 2 группы: view-sng и default.
  • match-clients — условие, при выполнении которого будет обрабатываться данный view. В нашем случае, если запрос приходит из RUBY или KZ (в соответствии с ACL), то будет обрабатываться контекст view-sng. Все остальные запросы будут обслуживаться с использованием блока настроек default.
  • zone — стандартная директива, определяющая настройки зоны. В нашем случае обслуживается домен dmosk.ru. В контексте view-sng записи зоны хранятся в файле dmosk.ru.sng, для default будет файл dmosk.ru.default. Таким образом, наполняя данные файлы разным содержимым мы разделяем результаты, которые получат пользователя одних стран от других.

В системах на базе DEB нужно открыть файл:

vi /etc/bind/named.conf

И закомментировать строку:

//include "/etc/bind/named.conf.default-zones";

В противном случае, мы получим ошибку, так как при использовании view у нас не может быть никаких зон вне данных view.

Перезапускаем bind.

а) Для Deb (Debian / Ubuntu / Astra):

systemctl reload bind9

б) Для RPM (Rocky / CentOS / РЕД ОС):

systemctl reload named

Сервер готов к работе. Теперь создадим файлы с описанием зоны.

Создание файла с записями зоны

В нашем примере файлы зон находятся в каталоге master. Убедимся, что он создан. После создаем сам файлы зоны.

а) Для Deb (Debian / Ubuntu / Astra):

mkdir -p /var/cache/bind/master

vi /var/cache/bind/master/dmosk.ru.russia

vi /var/cache/bind/master/dmosk.ru.default

б) Для RPM (Rocky / CentOS / РЕД ОС):

mkdir -p /var/named/master

vi /var/named/master/dmosk.ru.russia

vi /var/named/master/dmosk.ru.default

В рамках данной инструкции мы не будет останавливаться на самих файлах, хранящих записи зоны. Подробнее про это можно почитать в инструкциях Создание и настройка первичной зоны в BIND и Как создать и настроить вторичную (slave) зону.

После правки файла зоны не забываем перечитать его:

rndc reload

Наш сервер DNS готов к обслуживанию домена с учетом геолокации запроса.

Проверка настройки

Чтобы убедиться в корректности настройки DNS и возможности разрешать имена в IP на основе геолокации, нам нужно выполнить запросы из различных источников. В этом может помочь различные порталы, например, whatsmydns.net.

Если у нас есть возможность выполнить самостоятельно запросы с компьютеров, находящихся в разных странах, то можно использовать утилиту nslookup, например:

nslookup dmosk.ru

Читайте также

В дополнение к текущему материалу может быть полезно:

1. Как установить и настроить DNS-сервер BIND на CentOS или Rocky Linux.

2. Установка и настройка bind на Ubuntu.

3. Настройка Split DNS на одном сервере Bind.

4. Создание и настройка первичной зоны в BIND.

5. Как создать и настроить вторичную (slave) зону.

6. Настройка Stub и Forward зон на сервере Bind.

# Linux # Интернет # Серверы # Сети
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет