Наконец, выдался свободный денек, решил настроить доступ к нативному ipv6 хетцнера со своих домашних машин.
Завел там виртуальную машину во внутренней сети машины, попытался настроить ipv6...Мучался довольно долго.
В итоге со следующей конфигурацией:
на dom0:
ip addr add ffff:ffff:ffff:ffff::1/128 dev eth0 #eth0 - интерфейс, смотрящий в сеть провайдера
ip route add default via fe80::1 dev eth0 #что за адрес - понятия не имеет - прочитал в вики хетцнера
ip addr add ffff:ffff:ffff:ffff::1/64 dev lan1 #lan1 - виртуальный бридж, к которому подключаются domU
на domu:
ip addr add ffff:ffff:ffff:ffff::2/64 dev eth0
ip route add default via ffff:ffff:ffff:ffff::1
Разумеется, сразу видно, что в такой конфигурации что-то не так. А не так там вот что:
настроено там все таким образом, что маршрутизатор провайдера думает, что вся подсеть /64, выданная мне, напрямую торчит на порту моего сервера, что удобно для большинства применений(например, если виртуалки сажать бриджем на eth0), но не для моего случая.
Однако, здесь можно выкрутиться стандартными способами:
ip -6 neighbor add proxy ffff:ffff:ffff:ffff::2 dev eth0 - активирует ndp(замена arp для ipv6) прокси для этого адреса. нода делает вид, что такой адрес у нее на интерфейсе есть, принимает пакет и отправляет его дальше. Основная неприятность в том, что невозможно назначить прокси сразу для целой подсети, только для отдельного ip.
Уже потом, на следующее утро, написал в техподдержку с просьбой выделить "routed" ipv6 подсеть. И выдали!
Выдали подсеть, написали, что гейтвеем на ней будет один из адресов старой подсети:
ip addr add ffff:ffff:ffff:ffff::1/128 dev eth0 #eth0 - интерфейс, смотрящий в сеть провайдера
ip route add default via fe80::1 dev eth0 #что за адрес - понятия не имеет - прочитал в вики хетцнера
ip addr add ffff:ffff:ffff:fffa::1/64 dev lan1 #lan1 - виртуальный бридж, к которому подключаются domU
на domu:
ip addr add ffff:ffff:ffff:fffa::2/64 dev eth0
ip route add default via ffff:ffff:ffff:fffa::1
И все заработало. И тут-то я и захотел, раз у меня есть подсеть, нарезать ее на мелкие. Нарезал на пару подсетей /112(два байта на подсеть - более чем перебор). Одну сделал между dom0 и domu, другую пропихнул в openvpn tap туннель между domu на хостинге и роутере дома, еще по одной дал на каждый сегмент дома...И все было хорошо, пока не пошел перенастраивать radvd. Настроил его корректно, он работал, но адреса у машин в сети не появлялись. На одной из них догадался посмотреть в dmesg:
Код: Выделить всё
[3310687.641410] IPv6 addrconf: prefix with wrong length 112
[3310906.505319] IPv6 addrconf: prefix with wrong length 112
[3310906.540163] IPv6 addrconf: prefix with wrong length 80
[3310922.540411] IPv6 addrconf: prefix with wrong length 80
[3310938.540727] IPv6 addrconf: prefix with wrong length 80
[3310954.540996] IPv6 addrconf: prefix with wrong length 80
[3311001.889479] IPv6 addrconf: prefix with wrong length 80
[3311001.924876] IPv6 addrconf: prefix with wrong length 96
[3311017.925144] IPv6 addrconf: prefix with wrong length 96
Стал гуглить, и оказалось, что stateless автоконфигурация возможна только на сетях с префиксом /64, а также то, что, по RFC, именно /64 - максимальный префикс для выдаваемого блока(хотя, понятное дело, технически все работает и с более длинными префиксами).
И тут сразу показалось логичным ранее казавшееся нелогичным выделение аж /64(этож сколько айпишников!) блока не как маршрутизируемой подсети, а как просто подсети на порту. Ведь это ж минимальный блок IP :)
Почитал, еще, рекомендуют людям со многими подсетями брать аж /48 блок и пилить его на /64. Кстати, можно попробовать попросить /48 блок на хетцнере, что скажут? :)
Вот лично я никак не могу понять, зачем закладывать в ipv6 128 байт на адрес, а затем в RFC закладывать ограничение, по которому минимальный блок ip на сабнет в миллионы раз больше, чем может понадобиться. У меня только одна идея - в RFC заложили это ограничение из-за выявленных потенциальных проблем с производительностью. Впрочем, 64 бита на подсеть - это тоже ооооочень много. Непонятно, правда, почему не сделали тогда 80 бит на весь адрес - ведь 65536 - уже на несколько порядков больше, чем может понадобиться :)