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

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

Мы не получаем 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 ответа

Вы можете контролировать выбор адреса с /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,

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

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

Например:

199.7.53.74 whois.verisign-grs.com

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

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