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