продолжение темы:после долгих поисков DNS-серверов с поддержкой TCP Query, остановился на следующем варианте:
это замечательный python-скрипт
Tcp-DNS-proxy.
забирать тут:
https://github.com/henices/Tcp-DNS-proxyделает следующее:
слушает на локалхосте 53 UDP-порт, все запросы перенаправляет на внешние сервера dns, которые поддерживают запросы по TCP (в скрипте уже есть готовый список 8.8.8.8, 8.8.4.4 и др., можно прописать свои сервера), ответ возвращает клиенту.
пример работы:
root@server1:~# sudo python tcpdns.py>> Please wait program init....
>> Init finished!
>> Now you can set dns server to 127.0.0.1
domain:yandex.ru, qtype:1, thread:1
в это время на другой консоли запускаем
av@server1:~$ nslookup yandex.ru 127.0.0.1Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: yandex.ru
Address: 213.180.204.11
Name: yandex.ru
Address: 77.88.21.11
Name: yandex.ru
Address: 87.250.250.11
Name: yandex.ru
Address: 93.158.134.11
Name: yandex.ru
Address: 213.180.193.11
работает!
т.к. скрипт не кэширует запросы, само собой возникло желание поставить
шокирующийкэширующий DNS-сервер BIND9.
чтобы не было конфликтов с bind9 на локалхосте, правим скрипт
tcpdns.pyнаходим
server = ThreadedUDPServer(('127.0.0.1', 53), ThreadedUDPRequestHandler)
меняем порт 53 на 5300
server = ThreadedUDPServer(('127.0.0.1', 5300), ThreadedUDPRequestHandler)
сохраняем. идем дальше.
правим конфиг
/etc/bind/named.conf.optionsroot@server1:~# cat /etc/bind/named.conf.optionsoptions {
directory "/var/cache/bind";
forwarders {127.0.0.1 port 5300;};
forward first;
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { none; };
};
для автоматизации, запускаем скрипт через кронтаб:
root@server1:~# crontab -l@reboot python /root/tcpdns.py | tee -a /var/log/tcpdns.log > /dev/null 2>&1
(не забывайте оставить пробел или перевод на новую строку)/var/log/tcpdns.log для просмотра работы скрипта.
теперь настраиваем
/etc/network/interfacesdns-nameservers указать 127.0.0.1.
root@server1:~# cat /etc/network/interfaces# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth1
iface eth1 inet static
address 46.48.***.***
netmask 255.255.255.0
network 46.48.*.0
broadcast 46.48.*.*
gateway 46.48.*.*
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 127.0.0.1
dns-search ****.ru
при перезагрузке обновится файл
/etc/resolv.conf и там должны стоять адреса указанные в
dns-nameservers.
root@server1:~# cat /etc/resolv.conf# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
search ****.ru
если этого не произошло, настройте resolv.conf вручную.
получается простейшая схема:bind9: если такой-то запрос уже запрашивался и есть в кэше, выдаем ответ клиенту.
если запрос новый, запрашиваем 127.0.0.1:5300 и кэшируем ответ, выдаем ответ клиенту.
из минусов:
такой механизм работает немного медленнее чем обычный UDP Query.
скрипт не проверялся на переполнение буфера или еще чего)
ЗЫ: скорее данная статья заметка для себя, но буду рад если кому-то помогло
