Использовать IPv6 я начал давно. Сначала это было просто любопытство, тем более что всегда использовал компьютер с Linux в качестве маршрутизатора, так что дополнительно настроить IPv6 туннель до HE было несложно. Да, со временем использование IPv6 стало иметь прямой смысл.
Да, в заметке речь конечно идёт о dual stack, одновременном использовании IPv4 и IPv6, до использования “чистого” IPv6 придётся подождать.
Про подключение IPv6 и настройку на habr достаточно статей, так что на этом останавливаться не буду. Мой опыт основан на использовании туннеля от Hurricane Electric, но предложенное решение годится для любых способов подключения.
Проблемы
В процессе использования IPv6 стали накапливаться некоторые проблемы. Некоторые сайты, у которых появились AAAA — записи в DNS, на самом деле не работали через IPv6. Потом обнаружилось, что поиск в google постоянно выдаёт капчу, тоже самое с yandex.
Последнее, то заставило меня как-то решать проблему с IPv6 — к моему удивлению, обнаружилось, что на приставке Apple TV приоритизирован IPv4, и соответственно, youtube работает через него, хотя под Windows/MacOS/Linux/iOS/Android всё как обычно — IPv6 имеет приоритет над IPv4, и если для какого-либо сервиса есть AAAA записи в DNS, то он будет работать через IPv6.
Решение
Решение лежит на поверхности. Для bind9 есть плагины для фильтрации A или AAAA записей в ответах на запрос разрешения имени сайта (filter-aaaa.so). Плагин filter-aaaa удаляет AAAA-записи домена. Плагин filter-a соответственно удаляет-записи. Можно удалять записи для любого запроса, либо для отдельных клиентов, выделяемых по IP-адресу.
При небольшой доработке плагинов появляется возможность фильтровать записи только для определённых доменов. Доработанные плагины расположены здесь:
GitHub — DimaRU/bind9-filter: Selective filtering of AAAA or A records. Plugin for BIND9. · GitHub
Сразу пример конфигурации для плагинов:
plugin query "filter-a-cond.so" { filter-a-on-v6 yes; filter-a-on-v4 yes; filter-a { any; }; only-for-domains { "youtube.com."; "accounts.youtube.com"; "i.ytimg.com."; "wide-youtube.l.google.com."; "www3.l.google.com."; "clients.l.google.com."; "yt3.googleusercontent.com."; "googlevideo.com."; "accounts.google.com."; "youtube-ui.l.google.com.";};};plugin query "filter-aaaa-cond.so" { filter-aaaa-on-v6 yes; filter-aaaa-on-v4 yes; filter-aaaa { any; }; only-for-domains_exact { "www.google.com."; };};
Тут мы фильтруем A-записи для доменов необходимых для работы youtube, соответственно оно работает только через IPv6, что и требовалось для Apple TV. Для www.google.com фильтруются AAAA-записи, это решает проблему с капчей.
Собственно, при доработке плагинов добавлены 2 опции:
only-for-domains_exact: Список доменов, для которых будет выполнена фильтрация записей.
only-for-domains: Список доменов, для которых будет выполнена фильтрация записей. В отличие от опции only-for-domains_exact, фильтрация будет выполнена так же для всех субдоменов из перечисленных в списке доменов.
Сборка
Сборка плагинов осуществляется через докер, детали есть в README репозитория. В настоящее время сборка сконфигурирована для bind9 stable version для Ubuntu 24.04. Если нужно что-то другое, пишите в issue репозитория.
В целом конфигурирование bind9 — не тривиальная, но выполнимая задача, особенно для тех, кто заморочился на конфигурирование домашней IPv6 сети.
Буду рад, если это решение будет кому-либо полезно.
ссылка на оригинал статьи https://habr.com/ru/articles/1033568/