Задача заключается в том, что бы перенаправлять запросы из Росии на один веб-сервер, а всех остальных – на другой.
Для решения – вспользуемся 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