Debian: настройка GeoIP для BIND

Автор: | 20/03/2013

bind-named-logoЗадача заключается в том, что бы перенаправлять запросы из Росии на один веб-сервер, а всех остальных – на другой.

Для решения – вспользуемся GeoIP, но не стандартным, описанным тут>>>, а более простым вариантом, построенным на Acess Control List (ACL).

В каталоге /etc/bind создадим папку для GeoIP:

# mkdir geoip

Переходим в него, и в нём создаём файл, например, geoip.sh с таким содержимым:

# cat /etc/bind/geoip/geoip.sh
#!/bin/bash

[ -f GeoIPCountryCSV.zip ] || wget -T 5 -t 1 http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

echo -n “Creating CBE (Country,Begin,End) CSV file…”
unzip -p GeoIPCountryCSV.zip GeoIPCountryWhois.csv | awk -F ” ‘{print $10″,”$6″,”$8}’ > cbe.csv
echo -ne “DONEnGenerating BIND GeoIP.acl file…”

(for c in $(awk -F , ‘{print $1}’ cbe.csv | sort -u)
do
echo “acl “$c” {”
grep “^$c,” cbe.csv | awk -F , ‘function s(b,e,l,m,n) {l = int(log(e-b+1)/log(2)); m = 2^32-2^l; n = and(m,e); if (n == and(m,b)) printf “t%u.%u.%u.%u/%u;n”,b/2^24%256,b/2^16%256,b/2^8%256,b%256,32-l; else {s(b,n-1); s(n,e)}} s($2,$3)’
echo -e “};n”
done) > GeoIP.acl

rm -f cbe.csv
echo “DONE”

exit 0

Устанавливаем права на выполнение файла:

# chmod +x geoip.sh

Находясь в каталоге /etc/bind/geoip – запускаем файл:

# ./geoip/geoip.sh
–2013-03-20 12:15:25–  http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
Resolving geolite.maxmind.com… 174.36.207.186
Connecting to geolite.maxmind.com|174.36.207.186|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 2572208 (2.5M) [application/zip]
Saving to: “GeoIPCountryCSV.zip”

100%[==================================================================================================================================================================================================>] 2,572,208   1.35M/s   in 1.8s

2013-03-20 12:15:27 (1.35 MB/s) – “GeoIPCountryCSV.zip” saved [2572208/2572208]

Creating CBE (Country,Begin,End) CSV file…-ne DONE
Generating BIND GeoIP.acl file…
DONE

В результате – получаем два файла:

# ls
GeoIP.acl  GeoIPCountryCSV.zip

Теперь нам необходимо создать отдельные файлы зон для разных клиентов. Можно просто скопировать существующий, и изменить в нём IN A поле:

# ls -l
total 12
-rw-r–r– 1 root bind 716 Mar 20 11:48 domain.org.ua
-rw-r–r– 1 root bind 715 Mar 20 11:47 domain.org.ua.ru

Переходим к настройке самого BIND. Предполагается, что он установлен и настроен по обычной схеме, описанной, например, в статье Debian: установка и настройка DNS — BIND.

Редактируем файл /etc/bind/named.conf, в него добавляем строку:

include “/etc/bind/geoip/GeoIP.acl”;

Далее, редактируем файл /etc/bind/named.conf.zones. В него, вместо записи вида:

zone “domain.org.ua” {
type master;
file “/etc/bind/zones/master/domain.org.ua”;
};

Добавляем:

view “RU” {
match-clients { RU; };
recursion no;
zone “domain.org.ua” {
type master;
file “/etc/bind/zones/master/domain.org.ua.ru”;
};
};

view “NotMatched” {
match-clients { any; };
recursion no;
zone “domain.org.ua” {
type master;
file “/etc/bind/zones/master/domain.org.ua”;
};
};

ВАЖНО: не забывайте обновлять поле Serial в файлах зон.

Содержимое файлов зон одинаковое, за исключением поля IN A – для Росси отдаётся адрес 77.120.***.40, а для всех остальных – 195.***.***.97.

Далее, во избежание ошибки:

# rndc reload
rndc: ‘reload’ failed: failure

20-Mar-2013 12:27:04.762 /etc/bind/named.conf.default-zones:4: when using ‘view’ statements, all zones must be in views

Необходимо отредактировать файл /etc/bind/named.conf.default-zones. В нём редактируем записи о зонах.

Вместо:

zone “.” {
type hint;
file “/etc/bind/db.root”;
};

Указываем:

view “root” {
zone “.” {
type hint;
file “/etc/bind/db.root”;
};
};

Имя “root” – может быть произвольным. Важно, что бы эти имена не повторялись. Иначе будет ошибка такого плана:

20-Mar-2013 12:28:39.812 /etc/bind/named.conf.default-zones:13: view ‘root’: already exists previous definition: /etc/bind/named.conf.default-zones:3

Другой вариант – просто убрать строку:

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

из файла /etc/bind/named.conf.default-zones.

Перезагружаем:

# rndc reload
server reload successful

Проверяем.

Запрос из Украины – попадает под “фильтр” NotMatched, т.к. сеть не определна:

$ dig @ns1.setevoy.kiev.ua domain.org.ua

;; QUESTION SECTION:
;domain.org.ua. IN A

;; ANSWER SECTION:
domain.org.ua. 3600 IN A 195.191.226.97

И запрос из России – попадает под “фильтр” match-clients { RU; }:

$ dig @ns1.setevoy.kiev.ua domain.org.ua

;; QUESTION SECTION:
;domain.org.ua. IN A

;; ANSWER SECTION:
domain.org.ua. 3600 IN A 77.120.106.40