Настройки 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

 ## Setup ip6 and 6to4
ipv6_gateway_enable="YES"

# Local IPv4 address for 6to4 tunneling interface.
stf_interface_ipv4addr="213.141.135.xx"

# default for 6to4 (RFC 3068) 192.88.99.1
ipv6_defaultrouter="2002:c058:6301::"

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

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

# LAN interface
ifconfig_em0="inet 192.168.x.x netmask 255.255.255.192 mtu 9000 media 1000baseT descr LAN"
ifconfig_em0_ipv6="inet6 2002:d58d:87xx:1::1/64"

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

#Netbynet
fconfig_nfe0="DHCP mtu 1500 descr Netbynet"

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

vlans_em0="wifi wifio" # vlan(4) interfaces
create_args_wifi="vlan 2"
create_args_wifio="vlan 3"

# WiFi Protected
ifconfig_wifi="inet 192.168.x.x netmask 255.255.255.240 mtu 1500 descr WiFi.Protected"
ifconfig_wifi_ipv6="inet6 2002:d58d:87xx:2::1/64"

# WiFi free
ifconfig_wifio="inet 192.168.x.x netmask 255.255.255.240 mtu 1500 descr WiFi.Open"

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

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

# service netif stop em0
# service routing stop
# service netif start em0
# service routing start

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

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

G:\>ping6 ipv6.google.com

Проверка связи ipv6.l.google.com [2a00:1450:4010:c01::67]
с 2002:d58d:87xx:1:x:x:x:99f8 с 32 байт данных:

Ответ от 2a00:1450:4010:c01::67: байт=32 время=93ms
Ответ от 2a00:1450:4010:c01::67: байт=32 время=89ms
Ответ от 2a00:1450:4010:c01::67: байт=32 время=94ms
Ответ от 2a00:1450:4010:c01::67: байт=32 время=96ms

Проверить связь статистики для 2a00:1450:4010:c01::67:
 Пакеты: Отправлено = 4, Получено = 4, Lost = 0 (0% loss),
Время в пути в мсек (приблизительно):
 Минимум = 89ms, максимум = 96ms, среднее = 93ms

 не быстро конечно, но терпимо и работает. В локалке ничего не изменилось, глюкавая хрюша работает более менее нормально если это можно так назвать. 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

interface em0
{
    AdvSendAdvert on;
    MinRtrAdvInterval 15;
    MaxRtrAdvInterval 60;
    AdvDefaultPreference high;
    AdvHomeAgentFlag off;
    prefix 0:0:0:1::/64
    {
       Base6to4Interface ng2;
       AdvPreferredLifetime 86400;
       AdvValidLifetime 7200;
    };
};

interface wifi
{
    AdvSendAdvert on;
    AdvDefaultPreference high;

    prefix 0:0:0:2::/64
    {
       Base6to4Interface ng2;
    };
};

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

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 не будет опубликован. Обязательные поля помечены *


семь − 4 =

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