Блокировка сайтов при помощи DNS
Материал из RSU WiKi
Содержание |
Введение
Данная статья описывает настройку DNS-сервера ISC Bind для ограничения доступа к нежелательным ресурсам машин в локальной сети на дистрибутиве SLES 10 SP2. Для работы нам потребуется named, apache2, несколько свободных ip-адресов и acl-файлы прокси-сервера squid с блокируемыми доменами. В примерах рассмотрим блокирование баннерной рекламы и сайтов популярных соц. сетей Vkontakte и Odnoklassniki.
DNS блокировка может пригодиться в случаях больших нагрузок на сеть, если планируется отказаться от прокси-сервера squid или перейти на использование технологии transparent-proxy.
Настройка ISC Bind
Для начала настроим named. Предположим, что у нас уже есть списки блокировки необходимых доменов в формате dstdomain для squid:
social.list
.odnoklassniki.ru .vkadre.ru .vkontakte.ru .vk.com
banners.list
.ads.sup.com .adv.aport.ru .adv.computerra.ru .ads.sixapart.com .a.gismeteo.ru .a.ucoz.net .ad.adriver.ru .adserver.yahoo.com .bin-layer.de .popuptraf.ru .doubleclick.net .rotabanner.auto.ru
Сконвертируем данные файлы в формат, пригодный для named при помощи следующего скрипта:
squid2named.sh
#!/bin/bash
echo "# Autogenerated blocking zones for bind. Data from squid domain blacklists." > blocks.conf
echo "#" `date` >> blocks.conf
echo "" >> blocks.conf
for j in `ls *.list`
do
NAME=`echo $j | awk -F "." '{ print $1; }' `
for i in `cat $j | tr -d "\r" | sed 's/^.//'`
do
echo zone "\"$i\"" \{ type master\; file \"master/block-$NAME\"\; allow-query \{ any\; \}\; \}\; >> blocks.conf
done
done
Получившийся файл blocks.conf кладем в /etc/named.d/, и прописываем его в /etc/sysconfig/named, меняя строку:
NAMED_CONF_INCLUDE_FILES=""
на
NAMED_CONF_INCLUDE_FILES="blocks.conf"
Не забываем запустить SuSEconfig!
Приступаем к созданию файлов-зон для named. Поскольку нам необходимы разные сообщения при блокировках, зон будет две: block-banners и block-social. Если различные сообщения не требуются, можно в принципе обойтись и одной.
Пример зоны-заглушки:
block-banners
$TTL 24h
@ IN SOA ns.example.com. hostmaster.example.com. (
2003052802 86400 300 604800 3600 )
@ IN NS ns.example.com.
@ IN A 192.0.2.200 ; домен
* IN A 1192.0.2.200 ; все поддомены
Кладем оба получившихся файла зон в каталог /var/lib/named/master. Наступает время заняться apache2.
Сетевая подсистема
Сконфигурируем web-сервер и сетевую подсистему на несколько виртуальных ip-based хостов, на которых у нас будут выводиться сообщения для пользователей.
Идем в /etc/sysconfig/network, находим интересующий нас интерфейс и прописываем необходимое количество alias'ов (в нашем примере 2 шт):
ETHERDEVICE='eth0'
IPADDR='192.0.2.1'
NETMASK='255.255.255.0'
NETWORK='192.0.2.0'
BROADCAST='192.0.2.255'
VLAN='YES'
STARTMODE='onboot'
IPADDR_banhit='192.0.2.200'
NETMASK='255.255.255.0'
LABEL_banhit='banhit'
IPADDR_sochit='192.0.2.201'
NETMASK='255.255.255.0'
LABEL_banhit='sochit'
Выполняем команду:
service network restart
и проверяем, поднялись ли интерфейсы:
ifconfig
Настройка web-сервера
Вариант I: Apache 2
В apache2 настраиваем ip-based virual hosts. В директории /etc/apache2/vhosts.d копируем файл-пример vhost.template в файлы 192.0.2.200.conf и 192.0.2.201.conf. Настроенный файл:
<VirtualHost 192.0.2.200:80>
ServerAdmin webmaster@example.com
ServerName hit-banner.example.com
DocumentRoot /srv/www/vhosts/192.0.2.200
ErrorLog /var/log/apache2/hit-banner.example.com-error_log
CustomLog /var/log/apache2/hit-banner.example.com-access_log combined
HostnameLookups Off
UseCanonicalName Off
ServerSignature Off
<Directory "/srv/www/vhosts/192.0.2.200">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Создаем в /srv/www/ поддиректории vhosts/192.0.2.200/ и vhosts/192.0.2.201/ и раскладываем по директориям файлы с описанием блокировок [1] не забывая переопределить ошибку 404 на /index.html:
.htaccess
ErrorDocument 404 /index.html
Вариант II: Nginx
В nginx настраиваем ip-based virual hosts. В директории /etc/nginx/vhosts.d создаем файлы 192.0.2.200.conf и 192.0.2.201.conf. Настроенный файл:
server {
listen 192.0.2.200:80;
server_name hit-banner.example.com;
location / {
root /srv/www/vhosts/192.0.2.200/;
index index.html;
}
error_page 404 /index.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /srv/www/htdocs/;
}
location ~ /\.ht {
deny all;
}
}
Создаем в /srv/www/ поддиректории vhosts/192.0.2.200/ и vhosts/192.0.2.201/ и раскладываем по директориям файлы с описанием блокировок [2]. Ошибка 404 уже переопределена на /index.html в конфигурационном файле виртуального хоста Nginx.
Перезапускаем named и apache2/nginx:
service apache2 restart service nginx restart service named reload
Для проверки необходимо очистить на клиентской машине кэш DNS (How_do_I_Flush_DNS?) и пропинговать интересующий хост:
ping vk.com

