Router zjišťuje pomocí pingu funkčnost primární IPv6 linky, pokud funguje, tak do LAN propaguje IPv6 prefix odpovídající lince A a současně pro prefix linky B propaguje nulovou dobou platnost prefixu. Když linka A vypadne a B jede, tak to porohodí a propaguje A prefix s nulovou dobou paltnosti a Béčkový s hodinovou
Moh bys sem, prosim, hodit jak presne to mas udelany? Nejakej Netwatch scripting nebo to funguje nativne?
Nativně to ROS neumí. Pomocí netwatch by to šlo, ale ten reaguje na první ztracený/prošlý paket, což nemusí být ono.
Proto to raději dělám skriptem, který pouštím po 30 sec ze scheduleru. Skript natvrdo testuje, zda přes wan2 je na ping dostupný Google DNS a pokud není, tak Cloudflare DNS, pokud ani jeden, tak zakáže default routu přes wan2 a změní preferred a valid lifetime pro ohlašované prefixy do sítě, aby se to celé překlopilo. Když wan2 ožije, vrátí to zpět. Mám konfiguraci, že přes wan1 normálně jde IPv4 a přes wan2 IPv6, při výpadku přehodím na druhou lajnu. Ty dvě IPv6 pomocí kterých testuji, ty jsou natvrdo směrovány přes wan2 (takže zvolit něco, co mi nebude chybět, když nepojede přes zálohu). Pro ukázku mám dvě vnitřní sítě, a krom těch dvou veřejných rozsahů používám i trvale živý ULA vnitřní prefix.
Mějme:
WAN1 IP 2001:DB8:1100::2, brána 2001:DB8:1100::1, delegovaný rozsah 2001:DB8:1111::/48
WAN2 IP 2001:DB8:2200::2, brána 2001:DB8:2200::1, delegovaný rozsah 2001:DB8:2222::/48
ULA prefix pro vnitřní provoz: fd00:dead:beef::/48
Takže vykradená podstatná část cfg:
/ipv6 address
add address=2001:DB8:1100::2/64 advertise=no interface=wan6he1
add address=2001:DB8:2200::2/64 advertise=no interface=wan6he2
add address=fd00:dead:beef:1::1/64 advertise=no interface=lan6
add address=fd00:dead:beef:2::1/64 advertise=no interface=wlan6
add address=2001:DB8:1111:1::1/64 advertise=no interface=lan6
add address=2001:DB8:1111:2::1/64 advertise=no interface=wlan6
add address=2001:DB8:2222:1::1/64 advertise=no interface=lan6
add address=2001:DB8:2222:2::1/64 advertise=no interface=wlan6
/ipv6 route
add check-gateway=ping comment=WAN6HE2 distance=1 gateway=2001:DB8:2200::1
add check-gateway=ping comment=WAN6HE1 distance=5 gateway=2001:DB8:1100::1
add distance=10 type=unreachable
add comment="WAN6HE2 - blackhole" distance=10 dst-address=2001:DB8:1111::/48 type=unreachable
add comment="WAN6HE2 - blackhole" distance=10 dst-address=2001:DB8:2222::/48 type=unreachable
add comment="WAN6HE2 - pro test dostupnosti linky(Google DNS)" distance=1 dst-address=2001:4860:4860::8844/128 gateway=2001:DB8:2200::1
add distance=5 dst-address=2001:4860:4860::8844/128 type=unreachable
add comment="WAN6HE2 - pro test dostupnosti linky(CloudFlare DNS)" distance=1 dst-address=2606:4700:4700::1001/128 gateway=2001:DB8:2200::1
add distance=5 dst-address=2606:4700:4700::1001/128 type=unreachable
/ipv6 nd
set [ find default=yes ] disabled=yes
add advertise-dns=yes hop-limit=64 interface=lan6 other-configuration=yes ra-interval=10s-30s
add advertise-dns=yes hop-limit=64 interface=wlan6 other-configuration=yes ra-interval=10s-30s
/ipv6 nd prefix
add interface=lan6 prefix=fd00:dead:beef:1::/64 preferred-lifetime=7h valid-lifetime=7h2m
add interface=wlan6 prefix=fd00:dead:beef:2::/64 preferred-lifetime=7h valid-lifetime=7h2m
add interface=lan6 prefix=2001:DB8:1111:1::/64 preferred-lifetime=1h valid-lifetime=2h
add interface=wlan6 prefix=2001:DB8:1111:2::/64 preferred-lifetime=1h valid-lifetime=2h
add interface=lan6 prefix=2001:DB8:2222:1::/64 preferred-lifetime=0s valid-lifetime=0s
add interface=wlan6 prefix=2001:DB8:2222:1::/64 preferred-lifetime=0s valid-lifetime=0s
/system scheduler
add interval=30s name=sched-check-inet6-he2 on-event=script-check-inet6-he2 policy=read,write,test start-date=jan/01/2000 start-time=00:00:00
/system script
add dont-require-permissions=no name=script-check-inet6-he2 owner=admin policy=read,write,test source="# Kontroluje ..."
Tělo vlastního skriptu je zde:
# Kontroluje dostupnost IPv6 internetu pres WAN6HE2 a pripadne to prehodi na WAN6HE1
# jake IPv6 adresy testujeme (Google DNS a CloudFlare DNS)
:local checkdst1 "2001:4860:4860::8844"
:local checkdst2 "2606:4700:4700::1001"
# z jake delame test (IPv6 adresu z LAN odpovidajici WAN2 lince)
:local checksrc "2001:DB8:1111:1::1"
# komentar pro vyhledani routy
:local cmdid WAN6HE2
# prefixy odpovidajici na LAN 1. a 2. lince
:local lanprefixes1 "2001:DB8:1111:"
:local lanprefixes2 "2001:DB8:2222:"
# test result
:local wanok 0
# funkce provede ping test na zadany pip cil z daneho src zdroje, vraci 1 pri OK 3x ping po sobe, 0 po sesti pokusech
:local pingcheck do={
:local cntpings 0
:local cntok 0
:do {
:set cntpings ($cntpings + 1)
:if ([ /ping "$pip" src-address="$src" interval=2s count=1 ] > 0) do={
:set cntok ($cntok + 1)
:if ($cntok>2) do={ :return 1 }
} else={ :set cntok 0 }
:delay 1s
} while=($cntpings<6);
:return 0
}
:set wanok [ $pingcheck pip=$checkdst1 src=$checksrc ]
:if ($wanok=0) do={ :set wanok [ $pingcheck pip=$checkdst2 src=$checksrc ] }
:if ($wanok > 0) do={
:if ([ ipv6 route get number=[ find comment="$cmdid" ] disabled]=true) do={
# WAN6_2 jede, prehod na nej
:local msg "$cmdid OK gw - $[/system identity get name] - $[/system clock get time] $[/system clock get date]"
/log warning message=$msg
/ipv6 route set [ find comment="$cmdid" && disabled=yes ] disabled=no
/ipv6 nd prefix set [ find where prefix~"$lanprefixes1" ] preferred-lifetime=0s valid-lifetime=0s
/ipv6 nd prefix set [ find where prefix~"$lanprefixes2" ] preferred-lifetime=1h valid-lifetime=2h
}
} else={
:if ([ ipv6 route get number=[ find comment="$cmdid" ] disabled]=false) do={
# WAN6_2 nejede, prehod na WAN6_1
:local msg "$cmdid KO gw - $[/system identity get name] - $[/system clock get time] $[/system clock get date]"
/log error message=$msg
/ipv6 route set [ find comment="$cmdid" && disabled=no ] disabled=yes
/ipv6 nd prefix set [ find where prefix~"$lanprefixes1" ] preferred-lifetime=1h valid-lifetime=2h
/ipv6 nd prefix set [ find where prefix~"$lanprefixes2" ] preferred-lifetime=0s valid-lifetime=0s
}
}
Dále je vhodné pod /ipv6 firewall filter mít na začátku pravidla, co blokují output a forward do těch wan linek jiných zdrojových bloků, než ty přidělené k daným linkám (ať po překlopení to rejectuje staré spojení s původní IP pro druhou linku).
Konfig zjendodušen pro jeden router s dvěma WAN IPv6 linkama, v reálu to mám kapánek složitěji (jsou tam dva routery vedle sebe se vzájemně zálohující a pomocí VRRP si předávají LAN i WAN strany, použití dvou routerůl mi i dovoluje naráz využívat obě IPv6 konektivity pro různé LAN segmenty, to s jedním Mikortikem nejde pro nepodporu policy routingu na IPv6 v ROSu).