Linux: блокировка IPv6 для определенных приложений / имен хостов
Проблема и цель
Мы не получаем IPv6 от нашего провайдера, поэтому у меня есть туннель IPv6, который работает нормально, но, конечно, не очень быстро. И не очень надежный. Мне нравится, чтобы IPv6 был доступен "на всякий случай", но я хочу, чтобы определенные хосты (домены) были связаны только с IPv4.
Протокол по умолчанию
Мне кажется, что все приложения сначала пробуют IPv6; это, вероятно, настройка glibc. Я был бы хорошо, если бы это значение по умолчанию было обращено (для всех приложений).
Netfilter
Было бы возможно заблокировать адреса / сети IPv6 с Netfilter, но есть две проблемы:
- Вызовет ли это задержку, поскольку приложение ожидает истечения времени ожидания IPv6, прежде чем оно попробует IPv4?
- Некоторые домены кажутся смешанными, что выглядит как хаос. Разделение 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.