LINUX.ORG.RU
ФорумAdmin

bind9 и dnsmasq

 , ,


0

1

Добрый день. Есть dns сервер, который выполняет две функции:

1. форвардинг резольва доменных имен на внешний DNS

2. блокировка доступа к неразрешенным ресурсам с помощью fakeroot зоны.

Схема:

client1 request A? $DOMAIN--------->dns(192.168.7.4)||
                                                    ||
                                                    ||
                                                    \/
                                                 iptables
                                                 ||    ||
                                                 \/    \/
      Если не найдено совпадение по string $DOMAIN     Если найдено совпадение по string $DOMAIN
                                                 ||    ||
                                                 \/    \/
           Запрос попадает на fakeroot на 53 порту     Делаем редирект на порт 53535(dnsmasq)
                                                 ||    ||
                                                 \/    \/
      Пользователь получает ip заглушки для $DOMAIN    dnsmasq в свою очередь делает запрос к внешнему DNS
                                                       ||
                                                       \/
                                                       Пользователь получает реальный ip $DOMAIN

И все бы хорошо, схема которая представлена выше работает, НО если bind, он же fakeroot, получает большое колличество запросов, то раз в 200-500 запросов он, каким то образом отдает этот запрос на dnsmasq и клиент получает реальный ip того ресурса вместо ip заглушки.

По tcpdump'у на стороне dns это выглядит так:

    CLIENT.48901 > DNS.53: [udp sum ok] 16699+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.48901: [bad udp cksum 0x907d -> 0x9fc4!] 16699* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.33950 > DNS.53: [udp sum ok] 63500+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.33950: [bad udp cksum 0x907d -> 0x235a!] 63500* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.57577 > DNS.53: [udp sum ok] 60095+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.57577: [bad udp cksum 0x907d -> 0xd45b!] 60095* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.51795 > DNS.53: [udp sum ok] 3168+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.51795: [bad udp cksum 0x907d -> 0xc951!] 3168* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.49608 > DNS.53: [udp sum ok] 17331+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.49608: [bad udp cksum 0x907d -> 0x9a89!] 17331* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.42635 > DNS.53: [udp sum ok] 32867+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.42635: [bad udp cksum 0x907d -> 0x7916!] 32867* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.51443 > DNS.53: [udp sum ok] 41557+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.51443: [bad udp cksum 0x907d -> 0x34bc!] 41557* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.32784 > DNS.53: [udp sum ok] 45525+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.32784: [bad udp cksum 0x907d -> 0x6e1f!] 45525* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.54748 > DNS.53: [udp sum ok] 62722+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.54748: [bad udp cksum 0x907d -> 0xd525!] 62722* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.52397 > DNS.53: [udp sum ok] 16436+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.52397: [bad udp cksum 0x907d -> 0x9323!] 16436* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.35031 > DNS.53: [udp sum ok] 63143+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.35031: [bad udp cksum 0x907d -> 0x2086!] 63143* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.40059 > DNS.53: [udp sum ok] 31360+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.40059: [bad udp cksum 0x907d -> 0x8909!] 31360* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.53161 > DNS.53: [udp sum ok] 10254+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.53161: [bad udp cksum 0x907d -> 0xa84d!] 10254* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.56387 > DNS.53: [udp sum ok] 36552+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.56387: [bad udp cksum 0x907d -> 0x34f9!] 36552* q: A? $DOMAIN. 1/1/1 $DOMAIN. [1d] A DUMMY_IP ns: . [1d] NS DUMMY_IP. ar: DUMMY_IP. [1d] A DUMMY_IP (79)
    CLIENT.36575 > DNS.53: [udp sum ok] 54890+ A? $DOMAIN. (23)
    DNS.53 > CLIENT.36575: [bad udp cksum 0x9055 -> 0xfc74!] 54890 q: A? $DOMAIN. 1/0/0 $DOMAIN. [3m] A REAL_IP (39)

На стороне клиента это выглядит также. При этом если вырубить dnsmasq, то раз в 200-500 запросов клиент получает сообщение о том, что DNS сервер не доступен, соответственно когда bind9 «захлебывается» он, каким то образом, передает запрос на dnsmasq. Это можно как то вылечить?

Для меня версия, что bind знает про dnsmasq и пернаправляет запрос туда звучит неправдоподобно. Но если он делает это, то черзе lo интерфейс и можно попробовать поймать эти пакеты tcpdump'ом.

А так, я бы написал в iptables в INPUT правило, логгирующее в filter INPUT все пакеты, идущие на порт 53 и содержащие этот самый string $DOMAIN, чтобы увидеть, откуда они приходят на dnsmasq, если вобще приходят. Возможно, что bind просто не отвечает и клиент идёт с другим доменом...

mky ★★★★★ ()
Последнее исправление: mky (всего исправлений: 1)
Ответ на: комментарий от mky

Да, скорее всего проблема где то в iptables, потому как с клиентом у которого нет правил все в порядке, да и ради эксперимента менял местами bind и dnsmasq и что самое интересное, проблема воспроизводится даже если запретить прямое обращение к порту 53535,т.е. разрешить только редиректы на этот порт. По поводу логирования, пробовал, но логируются почему то только пакеты идущие на убой в 53 порт, сами редиректы залогировать у меня почему-то не получается.

Sherman ()
Ответ на: комментарий от Sherman

Дальше - лучше. Решил что два dns-а не кошерно и решил изменить схему: удалил форвард-dns, оставил только заглушку, все запросы которые попадают под string DNAT-чу сразу на внешний dns и все это дело накрываю маскарадом, и тут опять пролетают реальные ip для тех доменов, которые должны тонуть в 53 порту. Как? Как это возможно? Ладно хоть периодичность уменьшилась - 1 косяк на 20к запросов.

Sherman ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.