Настройки ip и ipv6 в FreeBSD 9.0
К рождеству пришел подарок – объявлен релиз 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 family – inet либо 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
|
1 2 3 4 5 6 7 8 |
## 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::" |
Далее локальные интерфейсы:
Сам лан со своим префиксом
|
1 2 3 |
# 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 нафиг не нужен а посему просто оставляю голый интерфейс
|
1 2 |
#Netbynet fconfig_nfe0="DHCP mtu 1500 descr Netbynet" |
Ну и виланы для wifi, на одном у меня будет ipv6, а на другом нет.
|
1 2 3 4 5 6 7 8 9 10 |
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" |
Вот и собственно все, остальные настройки не важны.
Перезапустить настроки интерфейсов и маршрутов можно командами
|
1 2 3 4 |
# service netif stop em0 # service routing stop # service netif start em0 # service routing start |
Команды влияют как на ip4 так и на ipv6.
Проверяем ipv6 в локалке
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 |
не быстро конечно, но терпимо и работает. В локалке ничего не изменилось, глюкавая хрюша работает более менее нормально если это можно так назвать. 
С мобильника на андроиде по 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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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



