![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Стандартная ситуация: локальная сеть с маршрутизатором, один публичный 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
Date: 2016-10-04 09:35 (UTC)no subject
Date: 2016-10-04 09:38 (UTC)проблема будет с отсутвием ответов от некоторых серверов, если делать запросы с порта 53.
no subject
Date: 2016-10-04 09:39 (UTC)PS: Слава, уболтал, ты зануднее :)
no subject
Date: 2016-10-04 09:41 (UTC)http://dadv.livejournal.com/207897.html?thread=844569&style=mine#t844569
а, я тебя прочитал неправильно.
всё равно у тебя плохой вариант -- из локалки нельзя будет к внешним dns серверам обращаться, даже для тестирования.
no subject
Date: 2016-10-04 09:47 (UTC)То, что мы не пробрасываем определенные пакеты, не отменяет обычной работы NAT.
no subject
Date: 2016-10-04 09:50 (UTC)можешь более конкретно высказаться?
no subject
Date: 2016-10-04 09:53 (UTC)no subject
Date: 2016-10-04 09:57 (UTC)Практически ipfw nat такого не умеет.
no subject
Date: 2016-10-04 10:15 (UTC)Впрочем могу ошибаться - я туда уже лет десять не смотрел.
У pfnat все проще -
rdr on $ext_if proto udp from any port != 53 to ....
no subject
Date: 2016-10-04 10:37 (UTC)