Женитьба FreeBSD и Дом.ru IPv6

Автор: | 02.12.2013

В ноябре 2013 года провайдер ЭР-Телеком (торговая марка Дом.ru) запустил нативную поддержку протокола IPv6 в 29 городах, в том числе и в Волгограде (AS39435). Подключение происходит как и прежде через PPPoE, а для выдачи адреса IPv6 используется DHCP-PD (Prefix Delegation). При этом предоставляется один динамический префикс /64. Реализовать статику и обратные зоны обещают в начале 2014 г. В связи с особенностями реализации подключения, безкостыльное использование IPv6 возможно только через маршрутизатор.

По умолчание протокол IPv6 выключен и его надо активировать через личный кабинет:
Управление IPv6

После этого можно приступать к настройке FreeBSD:

# uname -mrs
FreeBSD 9.2-RELEASE-p2 amd64

Коротко о том, что есть и что надо добавить. В наличии две сетевые карты em0 (смотрит в локальную сеть) и em1 (подключен кабель от Дом.ru), сервер уже выполняет роль маршрутизатора для IPv4. Надо добавить получение префикса через DHCP-PD и раздачу адресов устройствам в локальной сети.

Для начала активируем поддержку IPv6 на сетевых интерфейсах и маршрутизацию новой версии протокола. Добавим необходимые строки в файл /etc/rc.conf и перезагрузим сервер:

# grep ^ipv6 /etc/rc.conf
ipv6_activate_all_interfaces="YES"
ipv6_gateway_enable="YES"

# shutdown -r now

Теперь всё готово к настройке интернета в режиме Dual-Stack. Для начала нам потребуется поднять PPPoE сессию, и для этого идеально подходит стандартный демон ppp. Приводим конфигурационные файлы к следующему виду:

# cat /etc/ppp/ppp.conf
default:
 enable lqr echo
 set cd 5
 set log Phase tun
 set mru 1492
 set mtu 1492
 set redial 0 0
domru:
 set device PPPoE:em1
 set authname *****
 set authkey *****

# cat /etc/ppp/ppp.linkup
domru:
 ! sh -c "route add default HISADDR"
 ! sh -c "route add -inet6 default -interface INTERFACE"

# cat /etc/ppp/ppp.linkdown
domru:
 ! sh -c "route del -inet6 default"
 ! sh -c "route del default"

# grep ^ppp /etc/rc.conf
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="domru"

В строке «set device PPPoE:em1» заменяем em1 на сетевой интерфейс, к которому подключен кабель от провайдера. Вместо звёздочек для authname и authkey указываем свои логин и пароль соответственно. Файлы ppp.linkup и ppp.linkdown отвечают за добавление и удаление маршрутов по умолчанию для IPv4 и IPv6. Если необходим NAT через ppp, то в файл /etc/rc.conf надо дополнительно вставить ppp_nat со значением «YES». Запускаем:

# /etc/rc.d/ppp start
Starting PPP profile: domru.

IPv4 уже должен работать, переходим к получению префикса. Для этого нам потребуется установить из портов KAME DHCP6 (net/dhcp6), т.к. только он умеет работать поверх сессии PPPoE. Настраиваем:

# cat /usr/local/etc/dhcp6c.conf
interface tun0 {
        send ia-pd 0;
};

id-assoc pd 0 {
        prefix-interface em0 {
                sla-len 0;
                sla-id 1;
        };
};

# echo "you_password" | base64 > /usr/local/etc/dhcp6cctlkey
# chmod 400 /usr/local/etc/dhcp6cctlkey

# grep ^dhcp6 /etc/rc.conf
dhcp6c_enable="YES"
dhcp6c_interfaces="tun0"

# /usr/local/etc/rc.d/dhcp6c start
Starting dhcp6c.

В файле dhcp6c.conf вместо em0 надо указать интерфейс, который смотрит в локальную сеть. Если нигде не ошиблись, то с этого момента наш сервер может использовать IPv6 для доступа во внешний мир. Проверяем, что префикс получен (начинается на 2a02)…

# ifconfig em0 inet6
em0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=4219b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MAGIC,VLAN_HWTSO>
        inet6 fe80::225:90ff:fe65:f076%em0 prefixlen 64 scopeid 0x5
        inet6 2a02:2698:c24:330:225:90ff:fe65:f076 prefixlen 64
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>

…и что связь есть:

# ping6 -c 3 ipv6.google.com
PING6(56=40+8+8 bytes) 2a02:2698:c24:330:225:90ff:fe65:f076 --> 2a00:1450:4010:c03::6a
16 bytes from 2a00:1450:4010:c03::6a, icmp_seq=0 hlim=57 time=41.293 ms
16 bytes from 2a00:1450:4010:c03::6a, icmp_seq=1 hlim=57 time=41.395 ms
16 bytes from 2a00:1450:4010:c03::6a, icmp_seq=2 hlim=57 time=41.282 ms

--- ipv6.l.google.com ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 41.282/41.323/41.395/0.051 ms

Осталось дело за малым — рассказать устройствам в локальной сети о том, что у нас заработал IPv6. Сделать это можно с помощью RA (Router Advertisement). Штатный демон rtadvd с этим справится и даже не потребует тонкой настройки:

# grep ^rtadvd /etc/rc.conf
rtadvd_enable="YES"
rtadvd_interfaces="em0"

# /etc/rc.d/rtadvd start
Starting rtadvd.

Естественно, em0 надо заменить на интерфейс, смотрящий в локальную сеть.

Всё, после этого устройства в локальной сети, если они конечно поддерживают IPv6, получат адреса из выданного нам префикса /64. Проверить можно на сайте test-ipv6.com:

Результаты IPv6

В дополнение выкладываю все параметры из /etc/rc.conf касательно настройки сети:

dhcp6c_enable="YES"
dhcp6c_interfaces="tun0"
gateway_enable="YES"
ifconfig_em0="inet 192.168.0.1 netmask 255.255.255.0"
ipv6_activate_all_interfaces="YES"
ipv6_gateway_enable="YES"
netwait_enable="YES"
netwait_ip="8.8.8.8"
netwait_if="tun0"
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="domru"
rtadvd_enable="YES"
rtadvd_interfaces="em0"

15 комментариев к записи «Женитьба FreeBSD и Дом.ru IPv6»

  1. Евгений

    Все сделал по инструкции, но не хочет получать ipv6 и все. dhcp6c запускаю в foreground режиме с опцией debug и тишина «dhcp6c -c /usr/local/etc/dhcp6c.conf -f -d tun0» .

    Если с расширенным дебагом то :
    «Apr/03/2014 23:31:15: get_duid: extracted an existing DUID from /var/db/dhcp6c_duid: 00:01 :00:01:1a:1f:73:ea:00:1b:21:39:7e:9c
    Apr/03/2014 23:31:15: cfdebug_print: [interface] (9)
    Apr/03/2014 23:31:15: cfdebug_print: [tun0] (4)
    Apr/03/2014 23:31:15: cfdebug_print: begin of closure [{] (1)
    Apr/03/2014 23:31:15: cfdebug_print: [send] (4)
    Apr/03/2014 23:31:15: cfdebug_print: [ia-pd] (5)
    Apr/03/2014 23:31:15: cfdebug_print: [0] (1)
    Apr/03/2014 23:31:15: cfdebug_print: end of sentence [;] (1)
    Apr/03/2014 23:31:15: cfdebug_print: end of closure [}] (1)
    Apr/03/2014 23:31:15: cfdebug_print: end of sentence [;] (1)
    Apr/03/2014 23:31:15: cfdebug_print: [id-assoc] (8)
    Apr/03/2014 23:31:15: cfdebug_print: [pd] (2)
    Apr/03/2014 23:31:15: cfdebug_print: [0] (1)
    Apr/03/2014 23:31:15: cfdebug_print: begin of closure [{] (1)
    Apr/03/2014 23:31:15: cfdebug_print: [prefix-interface] (16)
    Apr/03/2014 23:31:15: cfdebug_print: [em1] (3)
    Apr/03/2014 23:31:15: cfdebug_print: begin of closure [{] (1)
    Apr/03/2014 23:31:15: cfdebug_print: [sla-len] (7)
    Apr/03/2014 23:31:15: cfdebug_print: [0] (1)
    Apr/03/2014 23:31:15: cfdebug_print: end of sentence [;] (1)
    Apr/03/2014 23:31:15: cfdebug_print: [sla-id] (6)
    Apr/03/2014 23:31:15: cfdebug_print: [1] (1)
    Apr/03/2014 23:31:15: cfdebug_print: end of sentence [;] (1)
    Apr/03/2014 23:31:15: cfdebug_print: end of closure [}] (1)
    Apr/03/2014 23:31:15: cfdebug_print: end of sentence [;] (1)
    Apr/03/2014 23:31:15: cfdebug_print: end of closure [}] (1)
    Apr/03/2014 23:31:15: cfdebug_print: end of sentence [;] (1)
    Apr/03/2014 23:31:15: configure_pool: called
    Apr/03/2014 23:31:15: clear_poolconf: called
    Apr/03/2014 23:31:15: dhcp6_reset_timer: reset a timer on tun0, state=INIT, timeo=0, retra ns=383
    Apr/03/2014 23:31:15: client6_send: a new XID (3ffd9a) is generated
    Apr/03/2014 23:31:15: copy_option: set client ID (len 14)
    Apr/03/2014 23:31:15: copy_option: set elapsed time (len 2)
    Apr/03/2014 23:31:15: copyout_option: set IA_PD
    Apr/03/2014 23:31:15: client6_send: send solicit to ff02::1:2%tun0
    Apr/03/2014 23:31:15: dhcp6_reset_timer: reset a timer on tun0, state=SOLICIT, timeo=0, re trans=1088
    Apr/03/2014 23:31:16: copy_option: set client ID (len 14)
    Apr/03/2014 23:31:16: copy_option: set elapsed time (len 2)
    Apr/03/2014 23:31:16: copyout_option: set IA_PD
    Apr/03/2014 23:31:16: client6_send: send solicit to ff02::1:2%tun0
    Apr/03/2014 23:31:16: dhcp6_reset_timer: reset a timer on tun0, state=SOLICIT, timeo=1, re trans=2151»

    Опции sysctl : net.inet6.ip6.accept_rtadv: 1

    В личном кабинете дом.ру IPV6 включен. Куда копать подскажите ?

      1. Евгений

        rc.conf :
        ipv6_activate_all_interfaces="YES"
        ifconfig_em1="inet 192.168.10.1/24"
        gateway_enable="YES"
        ipv6_gateway_enable="YES"
        ppp_enable="YES"
        ppp_mode="-ddial"
        ppp_profile="domru"
        dhcp6c_enable="YES"
        dhcp6c_flags="-D"
        dhcp6c_interfaces="tun0"

        dhcp6c.conf :
        interface tun0 {
        send ia-pd 0;
        };

        id-assoc pd 0 {
        prefix-interface em1 {
        sla-len 0;
        sla-id 1;
        };
        };

    1. LB Автор

      С виду всё нормально. У вас совершенно случайно не настроен файрвол, который может блокировать ответ сервера? После строки Apr/03/2014 23:31:15: dhcp6_reset_timer: reset a timer on tun0, state=SOLICIT, timeo=0, retrans=1088 должна следовать выдача префикса, но у вас нет ответа и dhcp6c отправляет повторный запрос.

      Попробуйте на время теста отключить файрвол и вообще посмотрите (tcpdump -i tun0 ip6) что у вас происходит. Как вариант в Перьми временные неполадки в целом или конкретно по вашему адресу.

      1. Евгений

        Да, файрвол есть, но я его отключаю и все равно то же самое.
        TCPDUMP говорит что ответа нет :
        13:50:38.944173 IP6 fe80::21b:21ff:fe39:7e9c.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit
        13:50:41.097168 IP6 fe80::21b:21ff:fe39:7e9c.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit
        13:50:45.382175 IP6 fe80::21b:21ff:fe39:7e9c.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit
        13:50:54.289184 IP6 fe80::21b:21ff:fe39:7e9c.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit
        13:51:11.508175 IP6 fe80::21b:21ff:fe39:7e9c.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit
        13:51:46.608184 IP6 fe80::21b:21ff:fe39:7e9c.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit

        Возможно и неполадки 🙁

        Кстати, запросы вообще не отправляются, пока на интерфейсе tun0 не включить опцию ACCEPT_RTADV:
        ifconfig tun0 inet6 -ifdisabled accept_rtadv

        Только после этой команды на интерфесе появляется inet6 адрес внутренний и шлется запрос.

    2. Евгений

      Оказалось что Дом.ру IPV6 не работает у тех, у кого подключен статический ipv4, несмотря на включенную опцию ipv6. Нужно отключить статический ipv4 и тогда заработает ipv6.

      1. LB Автор

        Тестовый режим 🙂

      2. Евгений

        Расследование показало, что у остальных пользователей с статическим IP все работает. Оформил тех. заявку..решают..

  2. Евгений

    Все исправили сегодня, все заработало ! 🙂 Спасибо за статью !

  3. Дмитрий

    Тем, у кого проблемы с файрволом, помогут следующие правила:
    ipfw add 100 allow udp from any 547 to any 546 via tun0
    ipfw add 100 allow udp from any 546 to any 547 via tun0

  4. kaldown

    Здравствуйте.
    Скажите, а можно ли на лептопе (единственный интерфейс) получить ipv6 от домру?
    Благодарю.

    1. LB Автор

      Один физический интерфейс не является препятствием, но всё зависит от операционной системы. Посмотрите соответствующий форум — http://ofl.cc/1r — там может быть ответ.

      1. kaldown

        Прошу прощения за развод грязи (постанул отдельно). Скажите, а можно ли продолжать получать интернет через tun0, а dhcp6 внутри настроить на физический интерфейс (re0 у меня), вот только этот же интерфейс (re0) я использую при дозвоне PPPoE?

      2. LB Автор

        Да, работать будет.

  5. kaldown

    Дак вот, какраз же новенькая FreeBSD 10.1 ;D
    домру уже овтетил, что нужно покупать роутер — смутно верится, столько времени убил но так и не нашел ответа, сейчас прочту Ваш пост.
    Премного благодарен.

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

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