Jump to content
Калькуляторы

Блокировка по DNS

Здравствуйте.

Есть задача - организовать блокировку сайтов для определенных клиентов. Блокировку по определенным причинам решили делать через DNS.

В итоге нужно получить DNS сервер, который на основании IP клиента будет применять один из белых\черных списков.

Есть какое-нибудь готовое решение? Сейчас пытаюсь реализовать с помощью PowerDNS + скрипт на Python - но схема работает крайне криво.

Share this post


Link to post
Share on other sites

В итоге нужно получить DNS сервер, который на основании IP клиента будет применять один из белых\черных списков.

Есть какое-нибудь готовое решение?

bind + view

 

https://kb.isc.org/article/AA-00851/0/Understanding-views-in-BIND-9-by-example.html

Share this post


Link to post
Share on other sites

В итоге нужно получить DNS сервер, который на основании IP клиента будет применять один из белых\черных списков.

Есть какое-нибудь готовое решение?

bind + view

 

https://kb.isc.org/article/AA-00851/0/Understanding-views-in-BIND-9-by-example.html

Поковырял - но пока не удается реализовать белый список - максимум всё блокируется, но не удается разрешить рекурсивную работу для отдельных зон.

Edited by xaker1

Share this post


Link to post
Share on other sites

Ещё как вариант - поднять второй DNS сервер (с блокировками) на нестандартном порту. И нужных клиентов заворачивать на него через iptables + ipset.

Share this post


Link to post
Share on other sites

По сути и делается отдельный DNS сервер. Просто нужно через Web интерфейс указывать кому и какие ограничения выставляются. Далее генерируюся конфиги.

Но на данный момент затык с белыми списками. Конфиг такой:

acl acl9{ 192.168.1.206/32; };

view view9 {

match-clients { acl9; };

allow-recursion { any; };

zone "." {

type master;

file "/etc/bind/blockeddomain.db";

};

zone "localhost" {

type master;

file "/etc/bind/db.local";

};

zone "127.in-addr.arpa" {

type master;

file "/etc/bind/db.127";

};

zone "0.in-addr.arpa" {

type master;

file "/etc/bind/db.0";

};

zone "255.in-addr.arpa" {

type master;

file "/etc/bind/db.255";

};

 

zone "ya.ru" {

type forward;

forward only;

forwarders { 8.8.8.8; };

};

};

При данной конфигурации блокируются все сайты, ya.ru не работает. Если убрать зону "." - то ya.ru открывается, другие сайты не работают - но для запрещенных сайтах не происходит подмены DNS (которая и описана в /etc/bind/blockeddomain.db и нужна для демонстрации уведомления о блокировке сайта).

Share this post


Link to post
Share on other sites

Попробуйте поиграться вот так :

 

cat /etc/bind/named.conf:

 

options {
       directory "/var/cache/bind";
       dump-file "/var/log/named/cache_dump.db";
       statistics-file "/var/log/named/named_stats.txt";
       auth-nxdomain no ;
       allow-recursion { none; };
       allow-query { none; };
       allow-transfer { none; };
       notify no;
       recursion no;
       version "REFUSED";
       query-source address x.x.x.x;
       check-names master ignore;
       check-names slave ignore;
       recursive-clients 10000;
listen-on  {
8.8.8.8;
8.8.4.4;
127.0.0.1;
};
       listen-on-v6 { none; };
};
include "/etc/bind/logging";
include "/etc/bind/rndc.key";
controls {
       inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
};
//////////////////////////////////////////////////////////////////////////////////////
acl our_net {
       192.168.0.0/16;
       10.0.0.0/8;
       172.16.0.0/12;
192.0.2.0/24;
       127.0.0.1;
};
view "our_net" {
match-clients { "our_net"; };
allow-recursion { our_net; };
allow-query { our_net; };
include "/etc/bind/local_zones";
include "/etc/bind/common_zones";
recursion yes;
};
///////////////////////////////////////////
view "all" {
match-clients { any ; } ;
allow-query { none ; } ;
recursion no;
allow-recursion { none; };
include "/etc/bind/local_zones";
};

 

список наших зон, за которые мы авторитарны по определению. ( "белые" cписки )

 

cat /etc/bind/local_zones:

 


zone "." {        type hint;        file "/etc/bind/db.root"; };
//
zone "10.in-addr.arpa"      { type master; file "/etc/bind/db.empty"; };
//
zone "16.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "17.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "18.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "19.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "20.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "21.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "22.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "23.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "24.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "25.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "26.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "27.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "28.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "29.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "30.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
zone "31.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };
//
zone "121.168.192.in-addr.arpa" { type master; file "/etc/bind/192.168.121.rev"; } ;
//
zone "168.192.in-addr.arpa" { type master; file "/etc/bind/db.empty"; } ;
//
zone "localhost" {        type master;        file "/etc/bind/db.localhost" ; } ;
zone "local" {        type master;        file "/etc/bind/db.local" ; } ;
zone "127.in-addr.arpa" {        type master;        file "/etc/bind/db.127" ; } ;
zone "0.in-addr.arpa" {        type master;        file "/etc/bind/db.0" ; } ;
zone "255.in-addr.arpa" {        type master;        file "/etc/bind/db.255" ; } ;
//
zone "sdsdsffsf.ru"              {       type master;       file "fsfsfsfsfsf.ru.ip"; };
zone "xxx.xxx.xx.in-addr.arpa" {       type master;       file "xxx.xxx.xxx.0.rev"; };
zone "xxx.xxx.xx.in-addr.arpa" {       type master;       file "xxx.xxx.xxx.0.rev"; };
zone "xxx.xxx.xx.in-addr.arpa"  {       type master;       file "xxx.xxx.xxxx.0.rev" ; };
zone "xxx.xxx.xx.in-addr.arpa"  {       type master;       file "xxx.xxx.xxx.0.rev" ; };
zone "fdgdfgdfgdfgdfg.ru" {  type master;     file "dfgdfsfdgdf.ru.ip";        };
zone "fdgfefddfgdfgdfg.ru" {  type master;     file "dfgsdfsdfssfdgdf.ru.ip";        };
................
.............
.............

 

шаблон файла зоны для домена из чёрного списка:

 


$ttl 300
@       IN      SOA     dns.0.com. admin.0.com. (
                       XXXXXXXXXX
                       10800
                       3600
                       604800
                       38400 )
@       IN      NS      dns.0.com.
@       IN      MX      10 mail.0.com.
@       IN      A       192.168.121.183 // на этом ип сидит http cо страничкой "Доступ запрещён типа..."
*       IN      A       192.168.121.183 // на этом ип сидит http cо страничкой "Доступ запрещён типа..."

 

"черный" список доменов, для которых мы как-бы авторитарны:

 

cat -n /etc/bind/common_zones|(head -n 10 && seq 3 | xargs -Iz echo "...." && tail -n 10) :

 

    1  zone "03magnet.ru" {   type master;    file "03magnet.ru.hosts";      };
    2  zone "1001casino.com" {   type master;    file "1001casino.com.hosts";      };
    3  zone "100casino.net" {   type master;    file "100casino.net.hosts";      };
    4  zone "100diplom.com" {   type master;    file "100diplom.com.hosts";      };
    5  zone "100diplomov.com" {   type master;    file "100diplomov.com.hosts";      };
    6  zone "100medspravok.ru" {   type master;    file "100medspravok.ru.hosts";      };
    7  zone "101slot.com" {   type master;    file "101slot.com.hosts";      };
    8  zone "1039luxury.com" {   type master;    file "1039luxury.com.hosts";      };
    9  zone "103luxury9.com" {   type master;    file "103luxury9.com.hosts";      };
   10  zone "10betcom.sbtech.com" {   type master;    file "10betcom.sbtech.com.hosts";      };
....
....
....
 7964  zone "zolotoi-baton.com" {   type master;    file "zolotoi-baton.com.hosts";      };
 7965  zone "zombi909.dyndns.tv" {   type master;    file "zombi909.dyndns.tv.hosts";      };
 7966  zone "zombie-legal.com" {   type master;    file "zombie-legal.com.hosts";      };
 7967  zone "zomzom.biz" {   type master;    file "zomzom.biz.hosts";      };
 7968  zone "zoo4u.ru" {   type master;    file "zoo4u.ru.hosts";      };
 7969  zone "zoorc24.biz" {   type master;    file "zoorc24.biz.hosts";      };
 7970  zone "zubromix.com" {   type master;    file "zubromix.com.hosts";      };
 7971  zone "zubrrotzdg2m2uy7.onion.to" {   type master;    file "zubrrotzdg2m2uy7.onion.to.hosts";      };
 7972  zone "zuu9ieth.cserver.tv" {   type master;    file "zuu9ieth.cserver.tv.hosts";      };
 7973  zone "zz.jofra.biz" {   type master;    file "zz.jofra.biz.hosts";      };

 

Сия конструкция помогает работать замечательному творению от max1976, отправляя на его nfq-filter тока урлы, которые надо блокировать, домены блокируем по днс.

Edited by OK-2004

Share this post


Link to post
Share on other sites

Тогда было бы не плохо рассказать до конца про такой метод :) в nfqfilter соответственно фильтрацию по domains вырезали в БД и файлах?

Edited by hsvt

Share this post


Link to post
Share on other sites

Поди днат делает

 

Поди - да.

 

Накидал собственный скрипт, который берёт dump.xml , полученный с помощью https://github.com/yegorov-p/python-zapret-info.

Далее вырезаю из него домены, которые блокирую на ДНС.( blocktype=domain + "короткие" урлы)

Edited by OK-2004

Share this post


Link to post
Share on other sites

Попробуйте поиграться вот так :

...

и опять же - получается черный список. У меня же сейчас проблема с белым списком.

Получается выдавать только нужные зоны, но как только пытаюсь реализовывать подмену DNS записей, что бы показывать для запрещенных сайтов (те, которые не входят в список разрешенных т.е.) загрушку - подмена записей происходит для всех зон (даже для тех, которые нужно разрешать.)

Share this post


Link to post
Share on other sites

Для начала с конфиге своём попробуйте

zone "." {
type master;
file "/etc/bind/blockeddomain.db";
};

Вставить в конце после зоны ya.ru, и посмотреть реакцию бинда.

И не плохо бы было озвучить версию bind.

 

А вообще если вы обозначаете зону мастер для ".", то всегда будет обрабатываться только она ибо приоритет, все остальные зоны будут игнорироваться (будь то форвард, мастер и т.д.).

Вариант делать forward для "." на какой то ещё свой днс где как раз будет возвращаться днс заглушки (можно же поднять 2 днс на этом же компе но с другим портом, например 5353 и туда форвардить).

Edited by polmax

Share this post


Link to post
Share on other sites

version: 9.9.5-9+deb8u6-Debian <id:f9b8a50e>

 

Текущий конфиг:

 

acl acl9{ 192.168.1.0/24; };

view view9 {

match-clients { acl9; };

allow-recursion { any; };

 

zone "ya.ru" {

type forward;

forward only;

forwarders { 8.8.8.8; };

//file "/etc/bind/db.root";

};

zone "localhost" {

type master;

file "/etc/bind/db.local";

};

zone "127.in-addr.arpa" {

type master;

file "/etc/bind/db.127";

};

zone "0.in-addr.arpa" {

type master;

file "/etc/bind/db.0";

};

zone "255.in-addr.arpa" {

type master;

file "/etc/bind/db.255";

};

zone "." {

type master;

file "/etc/bind/blockeddomain.db";

};

};

 

 

$ dig +short habr.ru @10.1.1.1

10.1.1.1

$ dig +short ya.ru @10.1.1.1

10.1.1.1

Edited by xaker1

Share this post


Link to post
Share on other sites

xaker1 в общем вариант или блочить конкретные имена (чёрный список) или вариант который я описал выше: forward для "." на какой то ещё свой днс где как раз будет возвращаться днс заглушки (можно же поднять 2 днс на этом же компе но с другим портом, например 5353 и туда форвардить).

Edited by polmax

Share this post


Link to post
Share on other sites

Сделать 1 зону .

для ya.ru в ней указать их (ya.ru) NSы и их имена тоже описать (glue). при разрешенной рекурсии, мне так кажется, должно работать. для нерутовой зоны работало подобное..

 

не?

 

ps

ну в общем да..

 

$TTL 1h
@ SOA @ nobody.localhost. 42 1d 12h 1w 3h

@   NS  a.

; Silence a BIND warning
a   A   1.1.1.1

*   A   1.1.1.1

ru. A   1.1.1.1
*.ru    A   1.1.1.1
ya.ru.  NS  gm1.

gm1.    A   8.8.8.8

nag.ru. A   8.8.8.8

gov.    A   1.1.1.1
*.gov   A   1.1.1.1
nasa.gov.   NS  gm1.

 

zone "." { type master; file "/etc/namedb/named.root"; };

 

dig +short www.ya.ru @192.168.72.55
ya.ru.
213.180.204.3
213.180.193.3
93.158.134.3

dig +short www.yandex.ru @192.168.72.55
1.1.1.1

dig +short www.microsoft.com @192.168.72.55
1.1.1.1

dig www.nasa.gov @192.168.72.55
;; ANSWER SECTION:
www.nasa.gov.           543     IN      CNAME   www.nasawestprime.com.
www.nasawestprime.com.  3600    IN      A       1.1.1.1

 

с последним облом, тотому как там cname в за пределы песочницы

Share this post


Link to post
Share on other sites

Почему 3 ?

Огласите весь список пожалуйста.... ©

 

Вариант от st_re можно дополнить view с acl. Для первой группы ( c ограничениям по белым и черным спискам ) - зона "." как мастер ; для второй группы ( без ограничений ) - стандартная как hint. Для второй группы - файлы зон стандартные, для первой - всё придётся запихивать в одну зону.

 

Пы.Сы.

Только у меня вариант от st_re почему то сработал только когда в файле зоны поменял местами некоторые строки:

 

............
ya.ru.  NS  gm1.
gm1.    A   8.8.8.8
ru. A   1.1.1.1
*.ru    A   1.1.1.1
..............

Edited by OK-2004

Share this post


Link to post
Share on other sites

Почему 3 ?

Огласите весь список пожалуйста.... ©

bind9, получает запросы от клиентов, и если нужно обрабатывать по белому списку - определяет кому дальше отсылать unbound или powerdns (на все запросы отдает один и тот же ответ, с IP заглушки).

Если же попадаем в черный список - bind занимается всем сам.

Share this post


Link to post
Share on other sites

 

Только у меня вариант от st_re почему то сработал только когда в файле зоны поменял местами некоторые строки:

порядок у меня был именно как привел, я прямо файл и скопировал.

 

Надо опции сборки смотреть.. у меня фря и бинд из портов. Тот джейл в котором пускал тест, что выше, я уже разобрал, там 10.3 фря была, вот тут на 9.3 параметры. Я так понимаю тут ничего не должно отличаться от теста, кроме 9.3. Они у меня в одной "пудреннице" собираются с одинаковыми конфигами.

built by make with '--localstatedir=/var' '--disable-linux-caps' '--disable-symtable' '--with-randomdev=/dev/random' '--with-libxml2=/usr/local' '--with-readline=-ledit' '--sysconfdir=/usr/local/etc/namedb' '--disable-fetchlimit' '--disable-filter-aaaa' '--disable-fixed-rrset' '--without-geoip' '--with-idn=/usr/local' '--with-libiconv=/usr/local' '--enable-ipv6' '--disable-largefile' '--disable-newstats' '--without-python' '--disable-querytrace' '--disable-rpz-nsdname' '--disable-rpz-nsip' '--enable-rrl' 'STD_CDEFINES=-DDIG_SIGCHASE=1' '--without-gssapi' '--with-openssl=/usr' '--disable-native-pkcs11' '--without-gost' '--enable-threads' '--prefix=/usr/local' '--mandir=/usr/local/man' '--infodir=/usr/local/info/' '--build=amd64-portbld-freebsd9.3'

[code]

 

Зоны со * я использую местами, чтобы им прядок был важен не замечал. Но собиратели пакетов в дистрибутивах Линукса временами такие затейники :) У меня то обычно фря на таких задачах.

Share this post


Link to post
Share on other sites

Посмотрите на проект DNS proxy https://github.com/looterz/grimd

блокирует домены из списка.

создавался как блокировщик рекламы и малвара, но что мешает ему дать список запрещенных сайтов?

Share this post


Link to post
Share on other sites

Посмотрите на проект DNS proxy https://github.com/looterz/grimd блокирует домены из списка. создавался как блокировщик рекламы и малвара, но что мешает ему дать список запрещенных сайтов?

Он же на GO!

Список доменов можно легко и в unbound запихать.

Share this post


Link to post
Share on other sites

# Windows Internet emulator: Network Connectivity Status Indicator (NCSI)

# https://technet.micr...v=ws.10%29.aspx

local-data: "dns.msftncsi.com 30 IN A 131.107.255.255"

local-data: "dns.msftncsi.com 3600 IN AAAA fd3e:4f5a:5b81:0:0:0:0:1"

 

# Block WSUS stats

local-data: "statsfe2.update.microsoft.com 30 IN A 0.0.0.0"

local-data: "statsfe2.update.microsoft.com 30 IN AAAA ::0"

local-data: "ctldl.windowsupdate.com 30 IN A 0.0.0.0"

local-data: "ctldl.windowsupdate.com 30 IN AAAA ::0"

 

# Block IE crap

local-data: "ieonline.microsoft.com 30 IN A 0.0.0.0"

local-data: "ieonline.microsoft.com 30 IN AAAA ::0"

local-data: "iecvlist.microsoft.com 30 IN A 0.0.0.0"

local-data: "iecvlist.microsoft.com 30 IN AAAA ::0"

Share this post


Link to post
Share on other sites

Ivan_83

Cпасибо, только я заметил, что у вас local-zone нет, http://www.it-wars.com/dns-back-to-the-roots/ описано с local-zone

 

local-zone: "doubleclick.net" redirect

local-data: "doubleclick.net A 127.0.0.1"

 

нужна ли local-zone?

Edited by Lariosik

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.