[РЕШЕНО] IPv6 - Не применяется router advertisement
Приветствую, товарищи.
Немного лирики:
Имеется HP Micro G7 N54L NHP 250GB EU Svr. Работает под управлением Gentoo с ядром 3.12.13, крутит пару lxc-контейнеров, работает в режиме роутера для раздачи интернета и еженедельно обновляется. Интернет на сервер приходит от провайдера, именуемого "ЭР-Телеком Холдинг". Провайдер этот предоставляет интернет через PPPoE. Все настроено и работает как часы.
Недавно узнал, что провайдер предоставляет доступ к сети интернет по протоколу IPv6. Сразу же решил попробовать настроить. И тут возникла проблема.
Конфигурация сети:
Сначала перепроверил поддержку IPv6 в ядре, вроде все включено:
CONFIG_IPV6=m CONFIG_IPV6_PRIVACY=y CONFIG_IPV6_ROUTER_PREF=y # CONFIG_IPV6_ROUTE_INFO is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_IPV6_MIP6 is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y CONFIG_IPV6_TUNNEL=m # CONFIG_IPV6_GRE is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_NF_NAT_IPV6=m
Ввиду того, что доступ у меня по PPPoE, то и IPv6 должен работать через него же. Чтение мануалов вывело на включение IPv6 в pppd, таким образом в /etc/conf.d/net.ppp0 была добавлена строка ipv6 ,
Секция pppd_ppp0 стала выглядеть так:
pppd_ppp0=" lcp-echo-interval 30 lcp-echo-failure 5 defaultroute persist noauth ipv6 ,"
Хорошо, перезапускаю соединение и вижу что мне назначен IPv6-адрес из пула локальных адресов, то есть fe80::aaaa:bbbb/10
В логах вижу следующее. pppd: local LL address fe80::aaaa:bbbb pppd: remote LL address fe80::aaaa:сссс pppd: local IP address xx.xx.xx.xx pppd: remote IP address xx.xx.xx.xx
То есть сервер провайдера мне выдает адрес без проблем. Но почему из пула локальных адресов?
Некоторое гугление показало, что это нормально. Посмотрел маршруты, маршрут по умолчанию для IPv6 указывает на адрес провайдера. Пинги до провайдера идут, а дальше нет.
Суть проблемы:
Следующий раунд гугления показал, что глобальный IPv6-адрес назначается путем приема мультикаст-пакетов, содержащих информацию о присваиваемом глобальном адресе.
Чтение документации навело меня на настройки ядра, а именно net.ipv6.conf.ppp0.accept_ra, net.ipv6.conf.ppp0.autoconf и net.ipv6.conf.ppp0.forwarding
Необходимые записи в /etc/sysctl.conf были добавлены
net.ipv6.conf.ppp0.accept_ra = 1 net.ipv6.conf.ppp0.autoconf = 1 net.ipv6.conf.ppp0.forwarding = 0
net.ipv6.conf.ppp0.forwarding = 0 - сначала надо завести IPv6 на самом сервере, а дальше будет проще(accept_ra = 2, forwarding = 1 и прочее)
Настройки сделаны, но глобального адреса я так и не получил. Тут на помощь приходит старый добрый tcpdump, который отловил мне следующее:
12:56:10.779558 IP6 (class 0xc0, hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::aaaa:cccc > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 16 hop limit 64, Flags [none], pref medium, router lifetime 4500s, reachable time 0s, retrans time 0s
Ага, значит от провайдера все-таки нужные мне пакеты прилетают. Замечу, что на этот момент никаких правил файрволов касательно IPv6 применено не было, а значит пакеты должны ходить беспрепятственно.
Некоторое гугление все сводило к вышеупомянутым net.ipv6.conf.all.accept_ra/net.ipv6.conf.default.accept_ra/net.ipv6.conf.ppp0.accept_ra
Тем не менее глобальный IPv6-адрес так и не был получен.
По неизвестной мне причине автонастройка не происходит или router advertisement пакеты попросту игнорируются. Это и сподвигло меня обратиться к знатокам, то есть сюда.
Решение:
Оказывается провайдер забыл упомянуть, что предоставляет stateful конфигурацию, а не stateless. После долгой ночи удалось настроить dhcpcd для получения настроек и префикса.
# /etc/dhcpcd.conf # Allow only specified interfaces allowinterfaces ppp0 eth0 # Generate an RFC 4361 compliant DHCP Unique Identifier duid # Only confgiure IPv6 ipv6only # Disable solicitation and receipt of IPv6 Router Advertisements noipv6rs # Subsequent options are only parsed for this interface interface ppp0 # Request a DHCPv6 Delegated Prefix ia_pd 1 eth0
После запуска dhcpcd, на интерфейс eth0 назначается IPv6 адрес из глобального пула с префиксом провайдера.
Префикс выдается динамический, поэтому в конфигурации radvd нужно брать префикс из настроек интерфейса:
# /etc/radvd.conf interface eth0 { AdvSendAdvert on; prefix ::/64 { AdvOnLink on; AdvAutonomous on; }; };
Ну и не забыть про
# Enable forwarding for IPv6 sysctl -w net.ipv6.conf.ppp0.accept_ra=2 sysctl -w net.ipv6.conf.ppp0.forwarding=1
- Для комментирования войдите или зарегистрируйтесь
Согласно
Согласно https://lists.debian.org/debian-ipv6/2011/05/msg00046.html
SLAAC на роутере включается при net.ipv6.conf.${IFACE}.accept_ra=2, но может за 3 года что-то поменялось
И еще - http://askubuntu.com/questions/56890/ipv6-over-pppoe
Нейтральность - высшее достижение сознания!
net.ipv6.conf.${IFACE}.accept
Ничего не поменялось с тех пор.
accept_ra=2 при включенном форвардинге, и accept_ra=1 при отключенном.
Само собой пробовал все варианты. Как с включенным форвардингом, так и с отключенным.
+ipv6 ipv6cp-use-ipaddr и +ipv6 ipv6cp-use-persistent так же было испробовано, но эффекта, кроме изменения локального IPv6 адреса, не дало.
Добавлено 10.04.2014 в 16:00
Поднял туннель 6to4 через Hurricane Electric Free IPv6 Tunnel Broker. Все работает. А от провайдера так глобальный адрес так и не получаю.
Выяснил с помощью сниффера,
Выяснил с помощью сниффера, что Router Advertisements пакеты со стороны провайдера не содержат необходимой информации для автонастройки интерфейса. Так же это подтверждает и вывод radvdump.
Проблема остается не решенной, так как осталось выяснить, ломаются пакеты где-то на моей стороне или же приходят такие от провайдера.
Снифер(если речь о tcpdump)
Снифер(если речь о tcpdump) смотрит на пакеты пришедшие с интерфейса, до файрвола и прочего. То есть, если они не битые(отметаем проблемы сетевой карты) - то они именно такие и пришли
Нейтральность - высшее достижение сознания!
Снимал трафик wireshark-ом
Снимал трафик wireshark-ом при отключенном файрволе. Да и проблема оказалась в другом. И да, проблема уже решена.
А если добавить noipdefault?
А если добавить noipdefault? pppd с недавнего времени пытается назначать локальные ip, из-за чего даже с ipv4 проблемы бывают.
Локальный оверлей растёт
Как я уже дописал в первом
Как я уже дописал в первом посте - провайдер выдает stateful автоконфигурацию IPv6, для чего требуется DHCPv6 клиент с функцией получения Prefix Delegation.
Тут выбор не большой и есть всего 3 варианта:
1) dibbler - Не понравился, так как подтупливал, не с первого раза останавливался демон, из-за чего при перезагрузке сервера мог повесить систему.
2) dhcpcd - Первое время использовал его, однако он не всегда с первого раза получает настройки IPv6.
3) dhclient - Этот вариант оказался самый работоспособный, сейчас использую его.
С dhclient есть небольшая загвоздка, так как он не умеет работать с ppp интерфейсами. После нескольких минут гугления был найден патч, который учит dhclinet работать с ppp интерфейсами. Интересно то, что багрепорт в багзилле имеется, однако почему то до сих пор не подтвержден. Патч, кстати, отлично подходит под текущую версию net-misc/dhcp. Недолго думая запилил ебилд с патчем в свой оверлей.
Как и в случае с dibbler, dhclient только получает информацию о выдаваемом префиксе, поэтому нужен небольшой скрипт, который назначает адреса и маршруты на интерфейсы.