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