La Fibre
Datacenter et équipements réseaux => Routeurs =>
MikroTik RouterOS => Discussion démarrée par: zoc le 11 août 2023 à 21:23:02
-
Hello,
J’ai enfin remplacé tout mon matériel Ubiquiti par du Mikrotik. Tout à l’air de fonctionner pour l’instant, mais il me reste à mettre en place un watchdog pour détecter quand la connexion est down et relancer le(s) client(s) DHCP/DHCP6 proprement comme l’exige Orange.
Je suis certain que plusieurs d’entre vous ont déjà ce genre de script. Serait-il possible de le partager ici, je vous en serait très reconnaissant.
Merci :D
-
J'allais tenter une réponse lapidaire à la sauce zoc, dont j'aime l'humour je te rassure, mais.
Mis à part quand j'ai dû modifier les options dhcp, ma liaison Orange a fonctionné mieux et de façon plus stable de 2020 à 2023 que la pression de sélection qui m'aurait conduit à façonner un watchdog.
Personnellement, je n'en ai donc pas, mais je profite de cette tribune creuse (la mienne, ce post) pour être notifié si quiconque poste.
-
Bonjour,
J’utilise ces deux scripts, exécutés toutes les 15 min par le scheduler :
/system script add dont-require-permissions=no name=checkINetGatewayIPv4 policy=read,policy,test source=":local defgw\r\
\n:do { :set defgw [ /ip route get number=[find dst-address=\"0.0.0.0/0\" and active ] value-name=gateway ] } on-error={ :log error \"CONNECTIVITY-CHECK (IPv4): No gateway detected, exiting.\" ; :error \"\" }\r\
\n\r\
\n:local pingresult [ /ping address=\$defgw count=3 interval=1.5s ]\r\
\n\r\
\n:if ( \$pingresult = 0 ) do={\r\
\n \t:do { \r\
\n\t\t:log info \"CONNECTIVITY-CHECK (IPv4): Failed ping to default gateway, restarting dhcp client\"\r\
\n\t\t/system/script/run restartDHCPv4client\r\
\n\t\t/system/script/run restartDHCPv6client\r\
\n\t}\r\
\n}"
/system script add dont-require-permissions=no name=checkINetGatewayIPv6 policy=read,policy,test source=":local defgw\r\
\n:do { :set defgw [/ipv6 route get number=[find dst-address=\"::/0\" and active ] value-name=gateway ] } on-error={ :log error \"CONNECTIVITY-CHECK (IPv6): No gateway detected, exiting.\" ; :error \"\" }\r\
\n\r\
\n:local pingresult [ /ping address=\$defgw count=3 interval=1.5s ]\r\
\n\r\
\n:if ( \$pingresult = 0 ) do={\r\
\n \t:do { \r\
\n\t\t:log info \"CONNECTIVITY-CHECK (IPv6): Failed ping to default gateway, restarting dhcp client\"\r\
\n\t\t/system/script/run restartDHCPv4client\r\
\n\t\t/system/script/run restartDHCPv6client\r\
\n\t}\r\
\n}"
En cas de problème (soit avec le gw v4 ou v6) je redémarre les deux clients DHCP puisque parfois en cas de problème avec le gw IPv6, le client DHCPv6 n’obtenait de préfixe si je ne venais pas de renouveler le bail IPv4 ??? :o
/system script add dont-require-permissions=yes name=restartDHCPv4client policy=reboot,read,write,policy,test source="/ip dhcp-client release [find interface=vlan832-wan ]\r\
\n/ip dhcp-client disable [find interface=vlan832-wan ]\r\
\n:delay 2s\r\
\n/ip dhcp-client enable [find interface=vlan832-wan ]"
/system script add dont-require-permissions=yes name=restartDHCPv6client policy=reboot,read,write,policy,test source="/ipv6 dhcp-client release [find interface=vlan832-wan ]\r\
\n/ipv6 dhcp-client disable [find interface=vlan832-wan ]\r\
\n:delay 2s\r\
\n/ipv6 dhcp-client enable [find interface=vlan832-wan ]"
-
Merci beaucoup :)
-
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 ] }