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

iptables - ограничить запросы к DNS одним/двумя доменами

Необходимо с помощью iptables ограничить запросы к DNS-серверу только нашими локальными доменами.

example.com и к реверсу.

 

Как это правильнее сделать? Пробовал всякие извраты, аля "-A INPUT -p udp -m udp --dport 53 -m string --string "example.com" --algo kmp --icase -j ACCEPT"

Но видимо что то делаю не так. Подскажите, как правильнее?

 

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

 

Share this post


Link to post
Share on other sites

~ # netstat -n -p -l | grep 53
tcp        0      0 127.0.0.0:53            0.0.0.0:*               LISTEN      258/dnsmasq
tcp        0      0 192.168.1.1:53          0.0.0.0:*               LISTEN      258/dnsmasq
udp        0      0 127.0.0.0:53            0.0.0.0:*                           258/dnsmasq
udp        0      0 192.168.1.1:53          0.0.0.0:*                           258/dnsmasq

 

Намёк ясен? =)

Share this post


Link to post
Share on other sites

Намек в том, что DNS работает еще и по TCP? Так там же вроде только zone transfer по TCP?

 

Или намек про dnsmasq?

Share this post


Link to post
Share on other sites
Намек в том, что DNS работает еще и по TCP? Так там же вроде только zone transfer по TCP?

Ну незнаю как бинд, но dnsmasq и pdnsd вполне себе по tcp работают с резолверами и винда до tcp стучиться с завидной переодичностью.

 

Или намек про dnsmasq?

Ну и на него тоже, там есть возможность порезать всё лишнее.

 

Share this post


Link to post
Share on other sites
Необходимо с помощью iptables ограничить запросы к DNS-серверу только нашими локальными доменами.

example.com и к реверсу.

 

Как это правильнее сделать? Пробовал всякие извраты, аля "-A INPUT -p udp -m udp --dport 53 -m string --string "example.com" --algo kmp --icase -j ACCEPT"

Но видимо что то делаю не так. Подскажите, как правильнее?

 

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

Наверное, правильнее всего сделать два view. Один для белых, другой для серых. Для серых нарулить конфигом ДНС как надо. Белым просто разрешить всё.

 

Share this post


Link to post
Share on other sites

Так и сделано. Задача именно отфильтровать "левые" запросы. До того, как они будут отработаны сервером. Неужели никто не решал такую задачу?

 

В любом случае, не могу понять, почему не работает такая конструкция: "-A INPUT -p udp -m udp --dport 53 -m string --string "example.com" --algo kmp --icase -j ACCEPT"...

Share this post


Link to post
Share on other sites

Учитывая, что это dnsmasq, проще запустить два экземпляра на разных портах

с разными настройками (общую часть подключать через include)

и файрволлом перенаправлять запросы от части клиентов на второй порт.

Share this post


Link to post
Share on other sites

dnsmasq помнится по tcp не кеширует ничего :(

Share this post


Link to post
Share on other sites
dnsmasq помнится по tcp не кеширует ничего :(
Во-первых, дайте пруфлинк. Какая кэшу разница, пришёл запрос через tcp или через udp?

 

Во-вторых, по статистике 99,(9)% запросов от клиентов приходит по udp.

Share this post


Link to post
Share on other sites

Видимо напутал или было версий 5 назад, сейчас TCP может мешает только логи ротейтить.

У меня после перехода на сислог перестал записывать кому что выдал/освободил :(

Share this post


Link to post
Share on other sites
Видимо напутал или было версий 5 назад, сейчас TCP может мешает только логи ротейтить.

У меня после перехода на сислог перестал записывать кому что выдал/освободил :(

Если Вы про DNS, то он ничего не освобождает.

Если про DHCP, то он работает по UDP.

В любом случае, все неочевидные моменты лучше уточнять здесь:

http://lists.thekelleys.org.uk/mailman/lis...dnsmasq-discuss

Share this post


Link to post
Share on other sites
Необходимо с помощью iptables ограничить запросы к DNS-серверу только нашими локальными доменами.

example.com и к реверсу.

 

Как это правильнее сделать? Пробовал всякие извраты, аля "-A INPUT -p udp -m udp --dport 53 -m string --string "example.com" --algo kmp --icase -j ACCEPT"

Но видимо что то делаю не так. Подскажите, как правильнее?

 

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

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

Какие с этим то проблемы? Давайте ещё напишем днс сервер на правилах иптаблеса.

Share this post


Link to post
Share on other sites
Необходимо с помощью iptables ограничить запросы к DNS-серверу только нашими локальными доменами.

example.com и к реверсу.

 

Как это правильнее сделать? Пробовал всякие извраты, аля "-A INPUT -p udp -m udp --dport 53 -m string --string "example.com" --algo kmp --icase -j ACCEPT"

Но видимо что то делаю не так. Подскажите, как правильнее?

 

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

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

Какие с этим то проблемы? Давайте ещё напишем днс сервер на правилах иптаблеса.

Все и так настроено и работает лет 5. Просто задолбали уже тысячи бесполезных запросов к DNS, типа, где тут у нас updates.kaspersky.com и т.п.

Еще сталкивался с вирусами у клиентов, которые умудряются генерировать запросы к DNS на скорости предоставленного им канала (жесткий флуд).

В результате чего, bind начинает дико тупить, что не есть хорошо...

Share this post


Link to post
Share on other sites
Необходимо с помощью iptables ограничить запросы к DNS-серверу только нашими локальными доменами.

example.com и к реверсу.

 

Как это правильнее сделать? Пробовал всякие извраты, аля "-A INPUT -p udp -m udp --dport 53 -m string --string "example.com" --algo kmp --icase -j ACCEPT"

Но видимо что то делаю не так. Подскажите, как правильнее?

 

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

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

Какие с этим то проблемы? Давайте ещё напишем днс сервер на правилах иптаблеса.

Ну да в теории звучит красиво, многие сервисы поддерживают access lists, но как-то спокойнее закрыть нужные порты/прочее через iptables или вообще на сетевом оборудовании, куда подключен сервер, потому что вероятность ошибки в iptables или в IOS маршрутизатора много меньше, чем в конкретном приложении. Кроме того, не всё можно сделать средствами приложения, например не отвечать конкретному клиенту рекурсию на MX-записи средствами bind9 нельзя, ни с помощью acl, ни с помощью view, а как уже написали выше, бывает вирусня, которая генерит запросы на скорости интерфейса и dns-сервер может заглючить. С помощью iptables почти всегда можно отфильтровать MX-запросы от конкретно IP-адреса.

Да, я тоже считаю, что фаервол это костыль, но на практике без него тяжко.

 

По теме:

Вот как правильно блокировать example.com:

 

iptables -A OUTPUT -p udp --dport 53 -m string --hex-string "|076578616d706c6503636f6d00|" --algo kmp -j DROP

 

(OUTPUT потому что на своей десктопной машине проверял).

Ну Вам надо перевернуть DROP на ACCEPT и т.д., это наверное, не нужно расписывать

 

Почему не работает -string "example.com" отдельная история, если интересно, то можно конечно объяснить, но думаю, что врядли будет интересно.

 

Share this post


Link to post
Share on other sites
Необходимо с помощью iptables ограничить запросы к DNS-серверу только нашими локальными доменами.

example.com и к реверсу.

 

Как это правильнее сделать? Пробовал всякие извраты, аля "-A INPUT -p udp -m udp --dport 53 -m string --string "example.com" --algo kmp --icase -j ACCEPT"

Но видимо что то делаю не так. Подскажите, как правильнее?

 

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

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

Какие с этим то проблемы? Давайте ещё напишем днс сервер на правилах иптаблеса.

Ну да в теории звучит красиво, многие сервисы поддерживают access lists, но как-то спокойнее закрыть нужные порты/прочее через iptables или вообще на сетевом оборудовании, куда подключен сервер, потому что вероятность ошибки в iptables или в IOS маршрутизатора много меньше, чем в конкретном приложении. Кроме того, не всё можно сделать средствами приложения, например не отвечать конкретному клиенту рекурсию на MX-записи средствами bind9 нельзя, ни с помощью acl, ни с помощью view, а как уже написали выше, бывает вирусня, которая генерит запросы на скорости интерфейса и dns-сервер может заглючить. С помощью iptables почти всегда можно отфильтровать MX-запросы от конкретно IP-адреса.

Да, я тоже считаю, что фаервол это костыль, но на практике без него тяжко.

 

По теме:

Вот как правильно блокировать example.com:

 

iptables -A OUTPUT -p udp --dport 53 -m string --hex-string "|076578616d706c6503636f6d00|" --algo kmp -j DROP

 

(OUTPUT потому что на своей десктопной машине проверял).

Ну Вам надо перевернуть DROP на ACCEPT и т.д., это наверное, не нужно расписывать

 

Почему не работает -string "example.com" отдельная история, если интересно, то можно конечно объяснить, но думаю, что врядли будет интересно.

Хм... Странно. Таки интересно, объясните, пожалуйста.

 

Спасибо за толковый ответ!

Share this post


Link to post
Share on other sites

"exapmle.com" в каноническом виде "example.com.", далее разбиваем на части с делимитером ".", получаем ("example","com",""), затем len("example")=7, значит пишем 07, затем "example" (в ASCII-коде), получается 076578616d706c65, тоже самое делаем с com, получается 03636f6d и с пустой строкой - длина 0, значит 00, самой строки нет. И всё это "склеиваем": 076578616d706c6503636f6d00

 

Кстати, с hex-string работает --icase.

Share this post


Link to post
Share on other sites
В 18.05.2010 в 00:20, s.lobanov сказал:

По теме:

Вот как правильно блокировать example.com:

 

iptables -A OUTPUT -p udp --dport 53 -m string --hex-string "|076578616d706c6503636f6d00|" --algo kmp -j DROP

 

(OUTPUT потому что на своей десктопной машине проверял).

Ну Вам надо перевернуть DROP на ACCEPT и т.д., это наверное, не нужно расписывать

 

Почему не работает -string "example.com" отдельная история, если интересно, то можно конечно объяснить, но думаю, что врядли будет интересно.

 

# iptables -V
iptables v1.8.3 (legacy)

# uname -a
Linux _ 5.0.19-un-def-alt1 #1 SMP PREEMPT __ x86_64 GNU/Linux

# cat /etc/altlinux-release
ALT Sisyphus Sisyphus (unstable) (sisyphus)
 

Работает вот так (заблокировать себе доступ к example.com)

iptables  -A OUTPUT -m string --hex-string "example.com" --algo bm --to 65535 -j DROP

 

т.е. для примера, из первого сообщения 

iptabless -A INPUT -p udp -m udp --dport 53 -m string --hex-string "example.com" --algo kmp --icase -j ACCEPT

 

P.s.: сорри за некропостинг - вдруг кому надо

Edited by gochankot

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this