dnsmasq: как увеличить TTL?

Есть ли способ переопределить и увеличить полученный TTL от вышестоящего DNS-сервера?

Есть ли параметр конфигурации в dnsmasq для этого?

3 ответа

Решение

Основываясь на моем ответе на ваши комментарии к Гарету (который действительно должен быть включен в ваш вопрос), я бы сказал, что наиболее вероятные причины вашей проблемы:

  1. Вы на самом деле не используете кеш, который вы думаете, или
  2. TTL для сайта, который вы посещаете, установлены достаточно низкими, обычно по какой-то причине, и вы ничего не можете с этим поделать (за исключением, возможно, определения основной причины частых сбоев поиска DNS и устранения их самостоятельно (если, например, причиной было перегруженное локальное подключение к Интернету) или ходатайство организации, ответственной за их устранение (если, например, проблема заключалась в том, что зона была делегирована ненадежному уполномоченному DNS-серверу))

Dnsmasq имеет --min-cache-ttl=[seconds] параметр, где seconds ≤ 3600 (1 час).

В действительности вы можете обойти 3600-секундную проверку --min-cache-ttl, воспользовавшись ошибкой переполнения целых чисел в исходном коде dnsmasq C, без необходимости перекомпиляции. Вот значение, которое работает:

Через CLI: --min-cache-ttl=6442450943

Через dnsmasq.conf: min-cache-ttl=6442450943

Почему это работает? Ну, код dnsmasq C указывает целочисленную константу со знаком со значением 3600 секунд, которая сравнивается и проверяется по сравнению с тем, что пользователь указывает в качестве значения переопределения. Если значение больше 3600, то пользовательский ввод будет игнорироваться, и вместо него будет использоваться константа 3600. Это значение переопределения также является int со знаком, но через несколько строк в коде входное значение ttl преобразуется в unsigned long int при инициализации демона.

На первый взгляд, вы можете удивиться, когда мы не просто установили значение -2 миллиарда во входном файле или файле конфигурации. Ну, есть начальная проверка ввода dnsmasq, которая прервет работу рано и завершится. Однако, если мы обернем целое число свыше +4 миллиардов, мы начнем с нуля. Добавьте еще +2 миллиарда + 1 к этому, и мы можем вернуться к эффективному отрицательному числу, все еще обходя начальную проверку.

Итак, почему это работает? Поскольку целые диапазоны со знаком составляют от примерно -2 миллиардов до +2 миллиардов, а целые числа без знака варьируются от 0 до +4 миллиардов. Нам нужно получить значение, равное примерно +2 млрд., Чтобы оно интерпретировалось как отрицательное значение проверкой dnsmasq после разбора ввода. По сути, проверка для ttl > 3600 пройдет, потому что значение интерпретируется отрицательно как -2 миллиарда. -2 миллиарда - это, конечно, < 3600. Но когда вторая часть кода перейдет на преобразование -2 миллиарда, он в конечном итоге преобразует наш входной ttl в эквивалент примерно 2^31 + 1 (без знака) вместо -2^31 + 1 (подписано).

Конечно, вы можете указывать только действительно большие значения ttl таким образом, и это может никому не пригодиться, потому что такие значения ttl вообще не очень разумны. Но это ловкий трюк (ошибка dnsmasq). Надеюсь, что это поможет кому-то, даже если это полезно только для отладки или возни в качестве временного решения. Не стесняйтесь комментировать, если это работает или не работает для вашей ситуации. Наслаждайтесь!:)

Вы имеете в виду TTL для отрицательного ответа от вышестоящего сервера? Это контролируется параметром --neg-ttl:

--neg-ttl = Отрицательные ответы от вышестоящих серверов обычно содержат информацию о времени жизни в записях SOA, которую dnsmasq использует для кэширования. Если ответы от вышестоящих серверов пропускают эту информацию, dnsmasq не кэширует ответ. Эта опция дает значение по умолчанию для времени жизни (в секундах), которое dnsmasq использует для кэширования отрицательных ответов даже в отсутствие записи SOA.

Другие вопросы по тегам