Une mise à jour de mon script, en prenant en compte le feedback de @levieuxatorange :
De l'importance des tests de vie :
La cnx de la LB peut être interrompue sur plusieurs segments entre la LB et le BNG.
Si vous ne testez pas la cnx montante, vous allez vous retrouver hors séquence et donc vous faire blaster régulièrement.
Cela doit être fait sur LES DEUX stacks Ipv4 et IPv6
Préconisation d'algo pour les tests de vie :
- IPv4 : faire une séquence ARP Request / Reply vers l'adresse du routeur donné en DHCPv4
- IPv6 : faire une séquence ICMP6 NS/NA de fe80::ba0:bab
- Pour chacun des deux stack
- faire une séquence toutes les 120s
- en cas de non réponse au bout de 10s , faire 2 répétitions
- au 3ème timeout (donc au total 150s de timeout), considérer que la liaison est en échec
- relancer CE stack
- les req ARP et ICMPv6 doivent être faite avec la COS6
Le script que je fais tourner toutes les 3 min :
# Check if another script instance is running
:if ([/system script job print count-only as-value where script=[:jobname] ] >1) do={ local scname [:jobname] ; :error "($scname) Abort script execution, another instance already running." }
# WAN interface
:local waniface "vlan-wan"
# Ping test parameters
:local pingcount 3
:local pinginterval "10s"
# Internal state variables - do not modify
:local defgw4
:local defgw6
:local pingresult4 0
:local pingresult6 0
:local nogw4 0
:local nogw6 0
:local testv4 0
:local testv6 0
:local dorestarts 0
:local loopcount
# Check if there are DHCP clients enabled on the WAN interface, and if they are then test respective connection to default gateway
:if ( [/interface get number=[find name=$waniface ] value-name=running ] = true ) do {
:if ( [/ip dhcp-client get number=[ find interface=$waniface ] value-name=disabled ] = false ) do { :set testv4 1 }
:if ( [/ipv6 dhcp-client get number=[ find interface=$waniface ] value-name=disabled ] = false ) do { :set testv6 1 }
}
# (DHCP4) Check if IPv4 gateway is defined, if not, restart DHCP clients
:if ($testv4 = 1) do {
:do { :set defgw4 [ /ip dhcp-client get number=[find interface=$waniface ] value-name=gateway ] } on-error={ :set nogw4 1 }
:if ([:len $defgw4 ] < 7) do { :set nogw4 1 }
:if ($nogw4 = 1) do={ :log warning "WAN CONNECTIVITY CHECK (IPv4): No gateway detected. Restarting DHCP clients." ; :set dorestarts 1 }
}
# (DHCP6) Check if IPv6 gateway is defined, if not, restart DHCP clients
if ($testv6 = 1) do {
:do { :set defgw6 [/ipv6 route get number=[find dst-address="::/0" and inactive=no and slaac=yes ] value-name=gateway ] } on-error={ :set defgw6 0 }
:if ([:len $defgw6 ] <= [:len $waniface]) do={ do { :set defgw6 [/ipv6 route get number=[find dst-address="::/0" and inactive=no and dhcp=yes ] value-name=gateway ]
} on-error={ :set defgw6 0 } }
:if ([:len $defgw6 ] <= [:len $waniface]) do { :set nogw6 1 }
:if ($nogw6 = 1) do { :log warning "WAN CONNECTIVITY CHECK (IPv6): No gateway detected. Restarting DHCP clients." ; set dorestarts 1 }
}
# (DHCP4&6) If gateway found, arp-ping to check if reachable
:if ($dorestarts = 0) do {
:for loopcount from=1 to $pingcount do={
:if (($pingresult4 = 0) and ($testv4 = 1)) do={ do { :set pingresult4 [ :ping arp-ping=yes address=$defgw4 count=1 interface=$waniface dscp=48 ] } on-error={ :se
t pingresult4 0 } }
:if (($pingresult6 = 0) and ($testv6 = 1)) do={ do {
:if ([ /ipv6 neighbor get number=[ find router=yes and interface=$waniface ] value-name=status ] = "reachable") do { :set pingresult6 1 } else={ :set pingresult6 [ :ping count=1 address=$defgw6 interface=$waniface dscp=48 ] }
} on-error={ :set pingresult6 0 } }
:if ( (($testv4 = 1) and ($pingresult4 = 0)) or (($testv6 = 1) and ($pingresult6 = 0))) do={ /delay delay-time=$pinginterval }
}
}
# If no successful ping, restart DHCP clients.
:if ( ($dorestarts = 0) and ($pingresult4 = 0) and ($testv4 = 1) ) do={
:log warning "WAN CONNECTIVITY CHECK (IPv4): Ping to default gateway failed. Restarting DHCP clients."
:set dorestarts 1
}
:if ( ($dorestarts = 0) and ($pingresult6 = 0) and ($testv6 = 1) ) do={
:log warning "WAN CONNECTIVITY CHECK (IPv6): Ping to default gateway failed. Restarting DHCP clients."
:set dorestarts 1
}
# Restart respective DHCP clients only if the interface was running
:if ( ($dorestarts = 1 ) and ($testv4 = 1)) do={ /ip dhcp-client release [find interface=$waniface ] }
/delay delay-time=0.5s
:if ( ($dorestarts = 1 ) and ($testv6 = 1)) do={ /ipv6 dhcp-client release [find interface=$waniface ] }