Даем пользователям keenetic ipv6

Внезапно (тм) я обнаружил, что пользователям, которые сидят за кинетиком, не достается ipv6. Хотя сам кинетик исправно получает ipv6 и отображает его в дашборде. Немного погуглив, я обнаружил, что одной подсетки /64 кинетику мало, ему надо еще отдать некий prefix description.

Итак, схема соединения простая router - keenetic - user.

На роутере поднят radvd, который отдает RA.

$ cat /etc/radvd.conf 
interface ens19 {
  AdvSendAdvert on;
  AdvDefaultPreference low;
  MinRtrAdvInterval 10;
  MaxRtrAdvInterval 30;

  prefix 2001:db8:99::/64 {
    AdvOnLink on;
    AdvAutonomous on;
    AdvRouterAddr on;
    AdvValidLifetime 120;
    AdvPreferredLifetime 100;
  };

  RDNSS 2001:db8:1::1 {
    AdvRDNSSLifetime 30;
  };

  DNSSL hlevnoe.lan {
    AdvDNSSLLifetime 30;
  };
};

Роутер совершенно честно получает 2001:db8:99:0:52ff:20ff:fe7d:5d71 и показывает этот же адрес у себя в дашборде. И вот тут у меня возник затык. Везде рецепты по получению этого самого PD приводили к каким-то шаманским пляскам с systemd-network и прочим вещам. Естественно, роутеру на это было совершенно монопенисуально. В итоге индеец зоркий глаз обнаружил, что ISC DHCPD умеет отдавать этот самый PD.

$ cat /etc/dhcp/dhcpd6.conf 
default-lease-time 150;

preferred-lifetime 100;
option dhcp-renewal-time 50;
option dhcp-rebinding-time 50;
allow leasequery;
option dhcp6.name-servers 2001:db8:1::1;
option dhcp6.domain-search "hlevnoe.lan","iot.hlevnoe.lan","wifi.hlevnoe.lan";

option dhcp6.preference 255;

option dhcp6.info-refresh-time 60;

subnet6 2001:db8:99::/48 {
	prefix6 2001:db8:100:100:: 2001:db8:100:200:: /56;
}

Я вырезал лишнее. Если кратко, то вся суть в последних трех строчках. DHCPD садится на интерфейс, содержащий адрес из подсети 2001:db8:99::/48 и говорит, что любой обратившийся может взять префикс /56 из диапазона 2001:db8:100:100-200

Перезапускаем и тут же получаем в логах следующее

Sep 04 14:36:19 router-wifi dhcpd[2060]: Rebind message from fe80::52ff:20ff:fe7d:5d71 port 546, transaction ID 0x4E15F400
Sep 04 14:36:19 router-wifi dhcpd[2060]: Reply PD: address 2001:db8:100:200::/56 to client with duid 00:03:00:01:50:ff:20:7d:5d:71 iaid = 1 valid for 150 seconds
Sep 04 14:36:19 router-wifi dhcpd[2060]: Sending Reply to fe80::52ff:20ff:fe7d:5d71 port 546

Идем в дашборд кинетика и видим появившуся строчку IPv6 prefix

И клиент тоже подтверждает, что он получил айпишник из этого префикса

2: wlp0s20f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 68:3e:26:b0:b1:93 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.128/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp0s20f3
       valid_lft 215sec preferred_lft 215sec
    inet6 2001:db8:100:200:fd6c:e8a9:6e3:7d75/64 scope global temporary dynamic 
       valid_lft 134sec preferred_lft 84sec
    inet6 2001:db8:100:200:ae30:1497:47c9:c0e7/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 134sec preferred_lft 84sec
    inet6 fe80::8e0b:e946:d9e4:9dfd/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

И теперь самое сложное: дать роутеру понять, куда надо роутить трафик для 2001:db8:100: . Вот тут я нормальных решений не нашел. Кинетик не умеет в динамические протоколы роутинга, а городить некий парсер логов и потом править роуты мне стало откровенно лень. Как делают большие пацаны из телекомов я тоже не нашел. Поэтому я взял и захардкодил это в роуты

      routes:
        - to: "2001:db8:100::/48"
          via: "2001:db8:99:0:52ff:20ff:fe7d:5d71"
          on-link: true

Да, криво. Да, может сломаться, если кто-то еще в этой сети попросит PD. Но, повторюсь, других вариантов я не нашел.

Ну а дальше наслаждаемся нормальным ipv6 и прочими положенными плюшками