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

Реклама статического IPv6-адреса и автоконфигурация IPv6 в Debian / Ubuntu

У меня есть сеть, которая объявляет адреса IPv6 через автоконфигурацию IPv6. Чтобы разрешить поиск DNS и иметь необычные IP-адреса, мы устанавливаем «статические» IPv6-адреса через / etc / network / interfaces:

auto eth0
iface eth0 inet dhcp
iface eth0 inet6 static
    address a:b:c:d:e::f 
    netmask 64

Всякий раз, когда мы теперь подключаемся через IPv6, Linux использует адрес автоконфигурации IPv6:

 a:b:c:d:21d:60ff:fe4a:479

а не статический IPv6-адрес:

 a:b:c:d:e::f

Сервер на другой стороне видит только адрес автоконфигурации.

Есть ли способ заставить Linux (Debian / Ubuntu) использовать статический адрес для исходящих пакетов? Это особенно интересно для настроек обратного DNS и брандмауэра.

Я не хочу отключать автоконфигурацию IPv6, так как я не могу контролировать настройки, которые объявляет маршрутизатор.

Конечно, самый простой способ предотвратить использование адресов autoconf - это запретить ядру создавать их, выполнив что-то вроде этого:

echo 0 >/proc/sys/net/ipv6/conf/eth0/autoconf

Обратите внимание, что это не требует от вас перенастройки маршрутизатора, чтобы он перестал отправлять рекламные объявления для префикса.

НОТА в комментариях вы говорите о /etc/gai.conf, но это не применимо. Это файл конфигурации glibc, а не ядра, и он влияет на выбор адреса назначения, а не на выбор адреса источника.

Если вы все еще хотите, чтобы адреса autoconf присутствовали, но не хотите, чтобы они использовались, то читайте дальше ...

Для связи между хостами в одной сети

Я не смог найти хороший способ заставить выбор адреса отдавать предпочтение статическому адресу, а не autoconf. Глядя на все правила RFC 3484 никто из них не помог.

Вы можете попробовать изменить маршрут / 64 в своей таблице маршрутизации для подключенной подсети так, чтобы он имел атрибут «src», но он автоматически генерируется ядром, когда любой из адресов в подсети добавляется к интерфейсу, и я был не удалось его отредактировать постфактум.

Для связи с хостами в остальной части Интернета

Есть несколько способов повлиять на выбор адреса для исходящих соединений. Наиболее очевидным является использование src атрибут на маршрутах. Например:

ip route add ::/0 via <gateway> src <desired-source-IP-address>

Но, возможно, ваш маршрут по умолчанию исходит из рекламного сообщения маршрутизатора и автоматически вставляется ядром. В этом случае вы не можете указать для маршрута атрибут «src». Итак, вот еще один метод, основанный на настройке адресных меток.

По умолчанию в Linux таблица меток адресов ядра выглядит так:

prefix ::1/128 label 0
prefix ::/96 label 3
prefix ::ffff:0.0.0.0/96 label 4
prefix 2001::/32 label 6
prefix 2001:10::/28 label 7
prefix 2002::/16 label 2
prefix fc00::/7 label 5
prefix ::/0 label 1

Идея заключается в том, что при отправке пакета на адрес назначения с меткой x, ядро ​​предпочитает использовать адрес источника с той же меткой x. Так, например, если вы отправляете пакет на хост с адресом 6to4 (это адрес в 2002 :: / 16), метка для этого равна 2, и ядро ​​предпочтет выбрать адрес источника 6to4 для исходящего пакета. , если есть.

Обычным адресатам IPv6 присваивается метка 1 (:: / 0, которая соответствует всему). Вот что вы хотите сделать:

  • Переопределите назначение метки для локальной подсети, чтобы адреса в локальной подсети получали «марсианскую» метку (метку, которая не используется ничем другим). Это правило будет соответствовать всей подсети, поэтому будет / 64.
  • Повторно переопределите присвоение метки для желаемого статического адреса, чтобы вернуть его в 1 (то есть ту же метку, что и остальные адреса в Интернете). Это правило будет соответствовать только конкретному желаемому адресу, поэтому он будет / 128.

Таким образом, все эти адреса autoconf в локальной подсети получат марсианскую метку, которая не будет совпадать с меткой чего-либо еще в Интернете, поэтому они не будут предпочтительны, в то время как метка для желаемого исходного адреса будет 1, поэтому он совпадет с адресом назначения и будет выбран.

Если ваш префикс - 2001: db8 :: / 64, а выбранный статический адрес - 2001: db8 :: aaaa / 128, тогда:

ip addrlabel add prefix 2001:db8::/64 label 99
ip addrlabel add prefix 2001:db8::aaaa/128 label 1

Вы можете добавить эти две команды как up команды в /etc/network/interfaces так что они запускаются каждый раз, когда появляется интерфейс.