Блокировка сайтов при помощи 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

References