Настройки ip и ipv6 в FreeBSD 9.0

bsd10_cover

К рождеству пришел подарок – объявлен релиз FreeBSD 9.0

В cvs появился tag RELENG_9. Пересборка мира и ядра прошла как всегда чисто и гладко.  Mergemaster в процессе работы поудалял некоторые скрипты настройки сети, в частности ipv6. Что бы это значило…

Ну пойдем посмотрим. В релноутсах много интересного, что-то уже было давно в стейбле, что-то нет. Очень интересным оказался пункт про изменения настроек сети. Вот оно наконец! Кажется пришло время навести порядок в rc.conf с настройкой ipv6 на интерфейсах и 6to4.

Попробуем разобраться в нововведениях.

На фре у меня достаточно давно был настроен 6to4 и SLAAC в локалку. С настройкой stf вобщем-то никаких проблем не было, но с настройкой inet6 на остальных интерфейсах был полный бардак. ipv6 включался в rc.conf опцией ipv6_enable=”YES”, причем включался для всех интерфейсов сразу. Опция ipv6_network_interfaces у меня особо ни на что не влияла и все поднятые интерфесы автоматом настраивали linklocal и проставляли флаги nud и accept_rtadv. Особенно это бесило с туннельными интерфейсами и интерфейсом на котором висел провайдер с pppoe. Приходилось со всем этим бороться различными способами, как то выключением приема rtadv через sysctl net.inet6.ip6.accept_rtadv=0 и различными скриптами и опциями вырубать ip6 отдельно на ненужных интерфейсах.

 Как же все просто стало теперь! Согласно вышеприведенному релноутс можно сделать несколько важных выводов:

  • настройка ipv6 теперь  целиком интегрированна в rc скрипты, он не включается отдельно глобально, а так же как и ip4 может быть настроен или не настроен отдельно для каждого интерфейса опциями из rc.conf. Опция ipv6_enable объявлена устаревшей.
  • настройки адресов интерфейсов в rc.conf теперь требуют  всегда указывать address familyinet либо inet6
  •  настройки переменных ядра net.inet6.ip6.accept_rtadv net.inet6.ip6.auto_linklocal превратились из глобальных свойств системы в флаги конкретных интерфейсов, а переменные ядра отвечают за установку этих опций по умолчанию для новых интерфейсов
  •  настройка Ipv6 на интерфейсе описывается в опции ifconfig_IF_ipv6.  Если для интерфейса не описана эта опция, то ipv6 на этом интерфейсе будет выключен!
  • ну и конечно все старые опции оставлены для совместимости и поведение системы меняется в зависимости от их наличия/отсутсвия

Но нам то старые не нужны, мы ведь наводим порядок! :) Сначала вычищаем из rc.conf костыли – всякие там alias0=”inet6 ifdisabled -nud -accept_rtadv” и прочее… Затем настраиваем все по-человечьи :)

Итак:

  • шлюз должен держать 6to4 на статическом ip4
  • не принимать rtadv ни на каких интерфейсах
  • раздавать и маршрутизировать ipv6 в локалку из подсетей  настроенного 6to4  посредством SLAAC 
  • на остальных интерфейсах/туннелях по которым не будет ходить ipv6 трафик, ipv6 должен быть выключен

Для SLAAC нужно на интерфейсах в локалку/туннелях иметь настроенные адреса с префиксом /64 и настроеный демон анонсер rtadvd.

Можно отметить что различается 2 основных типа настроки машины – хост и роутер. Грубо говоря хост принимает rtadv на интерфейсах и берет из них информацию о default route для ipv6, а роутер хоть и может принимать на некоторых интерфейсах rtadv (зависит от флага ACCEPT_RTADV) но при этом он игнорирует информацию о  default route в этих анонсах. Естественно все настраивается, подробно все расписано в релноутсах.

Согласно новым правилам установка опции ipv6_gateway_enable=”YES” выключает прием rtadv на всех инетерфейсах по молчанию, что мне и надо.

Вот что у меня получилось в итоге в rc.conf:

Здесь настраивается сам stf

Далее локальные интерфейсы:

Сам лан со своим префиксом

Интерфейс к прову, здесь мне ipv6 нафиг не нужен а посему просто оставляю голый интерфейс

Ну и виланы для wifi, на одном у меня будет ipv6, а на другом нет.

Вот и собственно все, остальные настройки не важны.

Перезапустить настроки интерфейсов и маршрутов можно командами

Команды влияют как на ip4 так и на ipv6.

Проверяем ipv6 в локалке

 не быстро конечно, но терпимо и работает. В локалке ничего не изменилось, глюкавая хрюша работает более менее нормально если это можно так назвать. android.ipv6.test

С мобильника на андроиде по wifi ipv6 тоже прекрасно работает. Я свободно залогинился по ssh ipv6 в телефон

/ # netstat | grep 2222
tcp6 0 0 :::2222 :::* LISTEN
tcp6 52 0 ::ffff:192.168.x.x:2222 ::ffff:192.168.x.x:1338 ESTABLISHED
tcp6 0 0 2002:d58d:87xx:2:wwww:xxxx:yyyy:zzzz:2222 2002:d58d:87xx:1:xxxx:wwww:yyyy:zzzz:1586 ESTABLISHED

Шелл там довольно ограниченный, но через proc было видно что все параметры ipv6 android подхватил правильно.

На удивление прекрасно работает даже браузер и ресолвер (я использовал miren) и спокойно проходит тест на ipv6.com. Также успешно проигрывается audio streaming ipv6 с radio relay‘я. Вобщем то телефон на android работает c ipv6 чуть ли не лучше чем хрюша. Я еще не проверял по какому протоколу он общается с DNS, если по ipv6 то вообще замечательно.

В довесок о rtadvd – так исторически сложилось что я использую не родной системный демон а radvd из портов. Почему – я уже не помню, а переделывать не охота.

radvd.conf

И немного ссылок на память:

BSD Magazine  - The Inevitability of IPv6

FreeBSD 9.0-RELEASE Release Notes

http://ip.v6net.ru DHCP-SLAAC

RFC 4941 privacy extensions http://superuser.com/questions/243669/how-to-avoid-exposing-my-mac-address-when-using-ipv6

One Response to Настройки ip и ipv6 в FreeBSD 9.0

  1. […] себя подобным образом, когда-то давно я уже об этом писал. Надо быть […]

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


× 7 = двадцать восемь

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">