Alter.Org.UA
 << Back Home EN en   Donate Donate

Setting up IPv6 ISP

Мы в своем Alfa-inet ISP внедряем IPv6. Адреса v6 раздаются всем пользователям чуть ли не с момента основания. Но оказывается, не все так просто. Пока все в работе :)

FreeBSD RTADVD

Первым делом настроили родной rtadvd под FreBSD 7.2. На вид хорошо. Несколько клиентов получили адреса. Все довольны. Пошло довольно много времени и вдруг оказалось, что адреса это хорошо, но нужно бы еще v6 DNS, который RDNSS. Для тех, у кого резолвер по тем или иным причинам не может или не хочет работать по v4. Оказалось, что rtadvd этого не умеет. Возник патч:

Patch for rtadvd RDNSS.

FreeBSD 7.2 upgrade

Все заработало и тут сервер грохнулся. И еще раз. И еще раз. Оказалось, что 7.2-release не может роутить IPv6, она падает через несколько минут после включения ipv6 gateway. Пришлось делать cvsup до 7.2-curent. Помогло.

RTADVD -> RADVD

Спустя некоторое время оказалось, что есть в сети люди, которые почему-то не получают v6 адреса, хотя на их стороне все правильно. В то же время, эти же машинки прекрасно получали v6 от Linux'ового сервера. Разница только в демоне, анонсирующем адреса. Под Linux это radvd. tcpdump показал, что принципиальное отличие в алгоритме раздачи. rtadvd ведет себя примерно как dhcp: клиент спросил Route Solicitation - клиенту ответили Route Advertise. А radvd постоянно вещает в сеть Route Advertise, а клиент слушает. И только поймав Route Advertise, начинает активные действия и шлет Route Solicitation. Пришлось перейти на radvd из FreeBSD ports.

Multicast filtering

Спустя еще некоторое время оказалось, что в сети по-прежнему встречаются люди, которые не получают v6 адреса. Вскрытие показало, что дело в фильтрации multicast на некоторых свитчах. На D-Link'ах правильная настройка выглядит примерно так:

config multicast vlan_filtering_mode all forward_unregistered_groups

DHCPv6

Жить стало хорошо и мы решили перейти от хаотической раздачи адресов к управляемой. Т.е. DHCPv6. В конце концов, когда-нибудь пользователей v6 придется считать, включать и выключать. Старый isc-dhcpd не умел IPv6. Пробовали dhcp6s, но как-то он не пошел. В 1-ю очередь потому, что не имел функциональности DHCP-PD - т.е. не мог анонсировать клиентам подсети для внутреннего использования. Собрали новый isc-dhcpd v4.2.4. Сгенерировали конфиг по аналогии с v4. Запустили отдельным демоном. Не работает. Т.е. никто из клиентов не обращается к DHCPv6 серверу. В конечном итоге оказалось, что дело в опции Managed (она же флаг M) в radvd.conf. Также, включили OtherConfig (она же флаг O), чтобы помимо IP отдавать еще DNS, подсеть и др. опции

    AdvManagedFlag on;
    AdvOtherConfigFlag on;

DHCPv6 default gateway

Как оказалось, в текущей редакции протокола такой опции нет. Уже 5 лет спорят. Есть частное нестандартное решение в виде использования custom options, но это требует настроек и со стороны клиента.

# RTPREFIX option layout definition
option dhcp6.rtprefix code 243 = {unsigned integer 32, unsigned integer 8, unsigned integer 8, ip6-address };


# This statement defines an option layout, not the values.
# NEXT_HOP option with RTPREFIX option included
#option dhcp6.next-hop-rt-prefix code 242 = { ip6-address, unsigned integer 16,
#   unsigned integer 16, unsigned integer 32, unsigned integer 8, unsigned integer 8, ip6-address };


# Simplified mode (NEXT_HOP only, without RTPREFIX) for
# bandwidth constrained networks.
# Make sure that only simplified or full mode are uncommented, not both.
# Uncomment this if you want to send simplified default-route information
option dhcp6.next-hop code 242 = ip6-address;

Ссылки по теме

http://community.roxen.com/developers/idocs/drafts/draft-ietf-mif-dhcpv6-route-option-05.html
http://tracker.tools.ietf.org/doc/draft-ietf-mif-dhcpv6-route-option/?include_text=1
http://www.isc.org/community/blog/201111/routing-configuration-over-dhcpv6

MAC-based DHCPv6

Ура, клиенты стали обращаться к DHCPv6 серверу и получать адреса из гостевой сети. Но хочется же как в DHCPv4 - каждому MAC'у свой IP'шник. Оказалось, опция hardware ethernet в dhcpd6.conf.

    host demo6-host {
      hardware ethernet 00:13:14:14:46:96;
      fixed-address6 2a01:d0:9:8::a1fa:f001;
      option dhcp6.fqdn "demo6-host.my-isp.com";
      fixed-prefix6 2a01:d0:3ff0:9700::/56;
    }

Ок. Часть клиентов по-прежнему не пользуется DHCPv6 (но они видимо и неумеют), часть благополучно получила красивые адреса, а часть получила гостевые адреса. Т.е. DHCP запрос был, но сервер не опознал MAC и выдал адрес из гостевого пула. Стали разбираться. Перелопатили исходники isc-dhcpd. И нашли. В DHCPv6 опция назывется также, как и в DHCPv4, но делает совсем другое. Из запроса получается DUID - идентификатор клиента. Младшая часть его может конструироваться на основе MAC'а. А может и нет. Иногда это MAC внутреннего интерфейса. Иногда - вообще непонятно что. Варианта два:

  • обратиться к производителю железки/прошивки и попросить исправить :)
  • подправить сервер так, чтобы он таки обращал внимание на реальный MAC-адрес.

Patch for strict MAC-based DHCPv6 address assignment with ISC DHCPD v4.2.4.

DHCPv6-PD

Тут есть неболшая сложность. Сеть мы клиенту анонсируем. Но сам dhcpd не создает в системе маршрут к этой сети. Для статической раздачи это приемлено, можно заранее наполнить таблицу маршрутизации. А для динамической - нужно что-то изобретать. Позволять серверу принимать анонсы с клиентов как-то не хочется.

Как оказалось, сложность не единственная. Не все роутеры используют тот адрес, который назначает DHCP. При этом сеть благополучно принимается и раздается клиентам. И конечно же, у них ничего не работает, т.к. маршрут со стороны сервера прописан на несуществующий IPv6. Как оказалось, роутеры могут продолжать использовать в качестве внешнего адрес полученный по RADVD или даже Link-local. Поэтому пришлось (очень не хотелось) добавить вызов внешнего скрипта, прописывающего маршрут к назначенной клиентской сети через тот IPv6 адрес, с которого пришел запрос (как правило Link-local). Патч автоматической маршрутизайии DHCPv6 PD доступен для ISC DHCPD v4.2.5.

Configs

radvd.conf
interface vlan777
{
        AdvSendAdvert on;

# This may be needed on some interfaces which are not active when
# radvd starts, but become available later on; see man page for details.
        IgnoreIfMissing on;

# These settings cause advertisements to be sent every 3-10 seconds.  This
# range is good for 6to4 with a dynamic IPv4 address, but can be greatly
# increased when not using 6to4 prefixes.
        MinRtrAdvInterval 3;
        MaxRtrAdvInterval 10;

# You can use AdvDefaultPreference setting to advertise the preference of
# the router for the purposes of default router determination.
# NOTE: This feature is still being specified and is not widely supported!
        AdvDefaultPreference high;

# Disable Mobile IPv6 support
        AdvHomeAgentFlag off;

# Hosts  use  the administered (stateful) protocol for
# address autoconfiguration in addition to any addresses  autocon-
# figured  using  stateless address autoconfiguration.
# This enables DHCPv6
        AdvManagedFlag on;
        AdvOtherConfigFlag on;

# Client network for auto-config
        prefix 2a01:d0:9:0::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr off;
        };

# IPv6 DNS servers
        RDNSS 2a01:d0:9:0::1 2a01:d0:0:10::1 2a01:d0::1
        {
                AdvRDNSSPreference 8;
                AdvRDNSSOpen off;
                AdvRDNSSLifetime 30;
        };


};
dhcpd6.conf
# Some global defaults

ddns-update-style none;
ignore client-updates;
default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
option dhcp6.info-refresh-time 21600;

shared-network MyClientNetwork {
  interface vlan777;

  subnet6 2a01:d0:9::/64 {
    # guest addresses for unknown MAC's
    range6 2a01:d0:9::bad:1000 2a01:d0:9::bad:2000;

    option dhcp6.name-servers 2a01:d0:9::1,2a01:d0:0:10::1,2a01:d0::1;
    option dhcp6.domain-search "my-isp.com";
    option dhcp6.fqdn "my-isp.com";
    option dhcp6.next-hop 2a01:d0:9::1;
    allow unknown-clients;
    # will not work without special routing tool, see above DHCPv6-PD
    #prefix6 2a01:d0:9:1000:: 2a01:d0:9:11ff:: /64;
  }

}

group {
  option dhcp6.name-servers 2a01:d0:9::1,2a01:d0:0:10::1,2a01:d0::1;
  option dhcp6.domain-search "my-isp.com";
  option dhcp6.next-hop 2a01:d0:9::1;
# NTP server
  option dhcp6.sntp-servers 2a01:d0:9::1;
# select * , inet_ntoa( inet_aton(def_ip) & inet_aton(netmask)),  inet_ntoa((inet_aton(def_ip) & in
#select user_id, user_mac, user_name, user_ip, user_real_ip, uses_ipv6   from user_list where  del_

    host user-1 {
#route add -inet6 2a01:d0:4002:8200:: -prefixlen 56 2a01:d0:9::a1fa:0024
#route change -inet6 2a01:d0:4002:8200:: -prefixlen 56 2a01:d0:9::a1fa:0024

      hardware ethernet 16:38:03:ba:bb:ab;
      fixed-address6 2a01:d0:9::a1fa:0024;
      option dhcp6.fqdn "user-1.my-isp.com";
      fixed-prefix6 2a01:d0:4002:8200::/56;
    }
     
# ........
}

Note: replace 2a01:d0:xxx with your real addresses ;)

Note 2: don't forget to set static routes to your fixed-prefix6

IPv6-capable Routers

ModelFirmwareStaticRoute Adv.DHCPv6 NADHCPv6 PDDHCPv6 DNS/etc.
Asus RT-N65U2014.02.xx++++
Asus RT-N56U3.0.0.4.374_979+++
Asus RT-N12D1 ++-
Asus RT-N66U ---
TP-Link TL-WR 1043OpenWrt+++/-
need manual changes in config files
TP-Link TL-WR 4300OpenWrt++
TP-Link TL-WR 36003.14.1 Build 140916 Rel.65058n++++/- (No WiFi)
Cisco RV100W ++-
Buffalo WZR-HP-A300h ++-

See also:

  • 6assist.net - IPv6-oriented MPtP tunnel over IPv4 network.
  • DHCPv6 - strict MAC-based address assignment + PD routing patch.
<< Back Автор: Alter (Александр А. Телятников) Сервер: Apache+PHP под FBSD © 2002-2024