Linux: блокировка IPv6 для определенных приложений / имен хостов

8

Проблема и цель

Мы не получаем IPv6 от нашего провайдера, поэтому у меня есть туннель IPv6, который работает нормально, но, конечно, не очень быстро. И не очень надежный. Мне нравится, чтобы IPv6 был доступен «на всякий случай», но я хочу, чтобы определенные хосты (домены) были связаны только с IPv4.

Протокол по умолчанию

Мне кажется, что все приложения сначала пробуют IPv6; это, вероятно, настройка glibc. Я был бы хорошо, если бы это значение по умолчанию было обращено (для всех приложений).

Netfilter

Было бы возможно заблокировать адреса / сети IPv6 с Netfilter, но есть две проблемы:

  1. Вызовет ли это задержку, поскольку приложение ожидает истечения времени ожидания IPv6, прежде чем оно попробует IPv4?
  2. Некоторые домены кажутся смешанными, что выглядит как хаос. Разделение google.com и youtube.com кажется чем-то, что вы не хотите делать, если можете избежать этого.

Я просто отмечаю, что страница руководства для ip routeговорит о типе маршрутизации unreachable:

Локальные отправители получают ошибку EHOSTUNREACH.

Происходит ли то же самое с Netfilter DROPs или REJECT? Такая ошибка не должна вызывать соответствующую задержку.

DNS фильтрация

Другое решение (довольно простое, если это возможно) будет фильтровать записи AAAA для определенных доменов. Если это (легко) невозможно: возможно ли подключить DNS-сервер и Netfilter, чтобы я знал, что «IP-адрес X принадлежит домену Y», чтобы я мог добавить его в Netfilter? Что-нибудь более изящное чем регистрация всего и просмотр журнала?

Путь?

Какие (другие) возможности есть и какие самые простые?

Хауке Лагинг
источник
2
Вы действительно не заметите ничего, что реализует Happy Eyeballs ( RFC 6555 ), например, современные веб-браузеры.
Майкл Хэмптон
DNS на самом деле не предназначен для такой работы. В любом случае вы можете попробовать более надежный туннельный сервис.
Майкл Хэмптон

Ответы:

16

Вы можете контролировать выбор адреса с помощью /etc/gai.conf. Файл конфигурации хорошо документирован и уже содержит значения по умолчанию, так что вы можете просто начать настройку.

Интересные значения по умолчанию:

label  ::1/128       0
label  ::/0          1
label  2002::/16     2
label ::/96          3
label ::ffff:0:0/96  4
precedence  ::1/128       50
precedence  ::/0          40
precedence  2002::/16     30
precedence ::/96          20
precedence ::ffff:0:0/96  10

Последняя строка дает наименьшее предпочтение всем адресам IPv4.

Если вы хотите дать более высокий приоритет всем IPv4, вы можете изменить его на:

precedence ::ffff:0:0/96  100

Если вы только хотите отдать предпочтение конкретным адресам или блокам IPv4, вы также можете указать их. Помните, что вы должны использовать IPv4-сопоставленный IPv6 в шестнадцатеричном формате.

Итак, чтобы отдать предпочтение 203.0.113.0/24 по всем IPv6, вы должны добавить:

label ::ffff:cb00:7100/120 5
precedence ::ffff:cb00:7100/120 100

Перезапустите запущенные приложения, чтобы они воспринимали внесенные вами изменения.


На производных системах Debian /etc/gai.confуже присутствует. В системах, производных от Red Hat, он отсутствует, но образец файла находится по адресу /usr/share/doc/glibc-common-*/gai.conf; просто скопируйте его в /etc.

Майкл Хэмптон
источник
Никогда не слышал об этом раньше; отличный совет, хотя это не решение DNS.
Хауке Лагинг
Вы просили самый простой способ ... :)
Майкл Хэмптон
4

Хорошо, вот совершенно другой ответ.

Поместите нарушающие узлы с дрянной связью IPv6 /etc/hostsс их соответствующим адресом IPv4.

Например:

199.7.53.74 whois.verisign-grs.com

Не забудьте удалить их, когда улучшится их (в данном случае) или подключение к IPv6.

Майкл Хэмптон
источник
1
Это было бы легко для одного хоста с одним IP. Как я уже говорил, это около **. Youtube.com. Таким образом, многие имена хостов затронуты. Теоретически это было бы легко с DNS: «Блокируйте записи AAAA для всего на .youtube.com». Ваш подход заключается в том, чтобы поместить все эти адреса (возможно, они часто не меняют ни структуру своего домена, ни свои IP-адреса, и было бы нормально проводить проверку сценариев каждый день) /etc/hosts. Если никто не придумает: «Программное обеспечение DNS-сервера XY может фильтровать таким образом !!» Я, вероятно, в конечном итоге с этим.
Хауке Лагинг
Я знаком почти со всеми известными пакетами DNS-серверов, и ни один из них не делает то, что вам кажется, легко или вообще. Теперь, если вы хотите написать свой собственный код ... но реальное решение, конечно же, заключается в улучшении вашего IPv6-соединения. Попробуйте другой туннельный брокер?
Майкл Хэмптон