У меня есть сеть, которая объявляет адреса 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, которая соответствует всему). Вот что вы хотите сделать:
Таким образом, все эти адреса 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
так что они запускаются каждый раз, когда появляется интерфейс.