Есть ли способ переопределить и увеличить полученный TTL от восходящего DNS-сервера?
Есть ли для этого параметр конфигурации в dnsmasq?
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. Это переопределенное значение также является целым числом со знаком, но несколькими строками позже в коде входное значение ttl приводится к беззнаковому длинному 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.