Назад | Перейти на главную страницу

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 или REJECTs? Такая ошибка не должна вызывать соответствующей задержки.

DNS фильтрация

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

Как идти?

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

Вы можете контролировать выбор адреса с помощью /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, вы также можете указать их. Помните, что вам нужно использовать IPv6-сопоставленный 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 улучшится.