2016. október 2.

RouterOS script DIGI-s IPv6-hoz.

A DIGI magyarországon minden előfizetőnek nyújt natív lakossági IPv6 hozzáférést, de nem egyszerű stabil működésre bírni.

A DHCPv6 segítségével kiosztott tartomány körülbelül hetente változik, és úgy tűnik nincsen "deprecated" állapot, amint a cím lejár nem érkeznek meg többé a csomagok. Ez önmagában kellemetlen, de ezen felül a lejárati idő átvételével is gond van. A DHCPv6 kliens mindig további 7 nap érvényességet mutat, akár percekkel a lejárat előtt is. Végeredményben hiába kap új címet a router, a pool-ba a régi tartomány marad beragadva. Mivel a pool tartománya kerül az RA üzenetekbe, ezért a kliensek a továbbra is a régi, immár érvénytelen tartományból vesznek fel címet. A pool törlése és a DHCPv6 kliens újraindítása megoldja a problémát, de csak a következő címváltozásig, amikor túrhatom újra az admin felületet.


Bár valódi megoldást nem találtam, - a RouterOS IPv6 támogatása még mindig elég gyenge, és valószínűleg a szolgáltató megoldása sem tökéletes - de a problémákat megkerülendő automatizálni lehet a pool törlését és a DHCPv6 kliens újraindítását, címváltozás esetén.
#GitHub: https://gist.github.com/hzsolt94/7ddd55dc42b1785f2dd39fd70ccd4fe0
:global netaddr ([:toarray [/ipv6 dhcp-client get 0 prefix]]->0)

# This has to run in the background, because pool might not exists
:global pooladdr "-PLACEHOLDER-"
:execute {:global pooladdr [/ipv6 pool get ip6-pool prefix]}
:delay 3


:if ( "$pooladdr" != "$netaddr") do={

:log warning "Inconsistent IPv6 pool detected"

:execute {/ipv6 dhcp-client disable [find interface=pppoe-out1]}
:execute {/ipv6 pool remove ip6-pool}

:delay 5
:execute {/ipv6 dhcp-client enable [find interface=pppoe-out1]}
}

Ezzel sajnos a problémáknak csak egy része oldódik meg, mert a folyamatosan hálózaton lógó kliensek továbbra is 7 napos érvényességet és 30 napos türelmi idővel számolnak az IPv6 címeikhez, ezért elkezdenek halmozódni rajtuk a nyilvános IPv6 címek. Bár ez nem okozott gyakorlati problémát, mert a címekből a legutolsó mindig működőképes, de ha valaki egy korábban általam használt IPv6 tartományból próbálna elérni, az már problémát jelentene. Sajnos a jelenlegi eszközeimmel ezt sem lehet korrektül orvosolni, mert a RouterOS-ben dinamikus pool-ban nem tudom állítani a meghirdetett lejárati időket. A megoldás így sajnos egy újabb takarító szkript, ami az érintett hálózati csatolóról leszedi az összes nyilvános címet - a legutolsó kivételével.
#!/bin/bash
#GitHub: https://gist.github.com/hzsolt94/dd51af020d2b0ca3529a1969a852216c
oldaddrs=$(ip -6 address show scope global dynamic dev eth0 | tail -n +3 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d')
for addr in $oldaddrs
do
        ip -6 address delete dev enp3s0 $addr/64
done

Bár egyik sajnos egyik script sem korrekt megoldás, de a használatukkal egy stabil IPv6-os hálózatot lehet elérni a DIGI-nél egy Mikrotik routerrel. Remélhetőleg az IPv6 támogatása rohamosan fejlődni fog, és csak ilyen tákolásokra nem lesz szükség, de pl. a DNS szerverek meghirdetése is korrekt kompatibilitással* működni fog egyszer.

* A RouterOS-ben jelenleg a DHCPv6 implementáció csak tartományok kiosztására alkalmas, sem címeket, sem DNS szervereket nem képes osztani. A Windows kliensek nem támogatják a DNS szerver konfigurálását RA üzenetekből, ezért RouterOS és Windows között a névfeloldás automatikusan csak IPv4-en működik.