- bind,
- dns,
- nat,
- networking
DNS, NAT и проброс портов
Стандартная ситуация: локальная сеть с маршрутизатором, один публичный IP, для выхода в мир используется NAT. Плюс на маршрутизаторе работает кеширующий DNS-сервер для локальной сети. Всё работает.
Однажды на одном из хостов локальной сети поселяется сервис, которому требуется пробросить статический диапазон портов UDP с внешнего IP. Казалось бы, какие могут быть проблемы?
А ведь DNS-сервер, выполняя запросы к внешним серверам, для исходящих запросов сам использует динамические UDP-порты и ожидает ответ на них. Например, ISC BIND под FreeBSD использует sysctl net.inet.ip.portrange.hifirst и net.inet.ip.portrange.hilast для определения диапазона таких эфемерных портов, по умолчанию это 49152-65535. Пока этот диапазон не пересекается с диапазоном проброшенных внутрь локалки портов, всё будет в порядке. Но стоит лишь пробросить, скажем, порты 40000-65535, и наступает катастрофа. В случае FreeBSD проброс портов "имеет приоритет выше" (выполняется раньше, чем доставка локальным приложениям) и проброс-то работать будет, но DNS-сервер остается без DNS-ответов на свои запросы, которые теперь уходят по пробросу локальному хосту, которому они и не нужны вовсе. И вся локальная сеть остаётся без локального DNS-сервиса.
Решением будет либо изменить диапазон проброшенных портов, если это допустимо для сервера в локальной сети, а если нет - изменить диапазон эфемерных портов для DNS-сервера. Кроме изменения системного дефолта, ISC BIND позволяет задать этот диапазон в собственной конфигурации:use-v4-udp-ports { range 10000 30000; };
Аналогично для IPv6. Для защиты от некоторых типов атак, BIND каждый раз выбирает случайный порт из диапазона и рекомендуется, чтобы диапазон был достаточно большим, минимум 16384 портов (14 бит энтропии).
no subject
А не пробрасывать udp с src port 53 не проще будет?
no subject
Но развести по непересекающимся диапазонам мне как-то больше нравится.
no subject
многие сервера уже более 5 лет как блокируют запросы с порта 53
no subject
no subject
ip тех серверов, что стали фильтровать такие запросы я не записывал. это было не повально, но достаточно для того, что бы мне пришлось убирать опцию query-source address * port 53;
no subject
Непонятно, какое это имеет отношение к предмету обсуждения.
no subject
ну вот же.
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
проблема будет с отсутвием ответов от некоторых серверов, если делать запросы с порта 53.
no subject
PS: Слава, уболтал, ты зануднее :)
no subject
http://dadv.livejournal.com/207897.html?thread=844569&style=mine#t844569
а, я тебя прочитал неправильно.
всё равно у тебя плохой вариант -- из локалки нельзя будет к внешним dns серверам обращаться, даже для тестирования.
no subject
То, что мы не пробрасываем определенные пакеты, не отменяет обычной работы NAT.
no subject
можешь более конкретно высказаться?
no subject
no subject
Практически ipfw nat такого не умеет.
no subject
Впрочем могу ошибаться - я туда уже лет десять не смотрел.
У pfnat все проще -
rdr on $ext_if proto udp from any port != 53 to ....
no subject
no subject
no subject
no subject
Что это за "многие" сервера, что блокируют DNS-запросы с порта-источника 53?
no subject
я ip не записывал, но наткнулся -- не мог отресолвить какие-то домены -- ответы на мои запросы не приходили