Cisco EEM applet to monitor and repair broken DHCP leases
Dirty hack to renew DHCP lease on Cisco 881 if Internet access is lost. This can happen when Cisco has valid DHCP lease from ISP and then cable modem or DSL router is power cycled but switch between Cisco and upstream device keeps link-state up. Options are either to fix it manually (pull cable / change config / reboot Cisco) or hack something like below. I'm also pinging over VPN tunnel to Intranet as it would be shame to break this due Level 3 and Google blocking ICMP which might happen one day.
Below is setup so it releases/renews DHCP only if both our own VPN server, Level 3 and Google are down. There's no point activating repair if Internet access is fine but our own VPN is unreachale as problem is elsewhere and flapping connection on client side will only make troubleshooting harder.
My first attempt was based on just track statements like all examples I've found are. Problem with that is if link is broken when Cisco is rebooted repair part never activates. Using ipsla directly in applet solves this, but value of _ipsla_condition is not updated while applet is running. To solve this there's track statements which are only used to break away from infinite loop... If someone has better solution to this I'd love to hear since I'm bit worried about f.e. race conditions that might occur with current approach.
Depending on your setup rather than renew DHCP you might want to take some other action such as taking Fa4 temporarily to shutdown mode.
Below is setup so it releases/renews DHCP only if both our own VPN server, Level 3 and Google are down. There's no point activating repair if Internet access is fine but our own VPN is unreachale as problem is elsewhere and flapping connection on client side will only make troubleshooting harder.
My first attempt was based on just track statements like all examples I've found are. Problem with that is if link is broken when Cisco is rebooted repair part never activates. Using ipsla directly in applet solves this, but value of _ipsla_condition is not updated while applet is running. To solve this there's track statements which are only used to break away from infinite loop... If someone has better solution to this I'd love to hear since I'm bit worried about f.e. race conditions that might occur with current approach.
Depending on your setup rather than renew DHCP you might want to take some other action such as taking Fa4 temporarily to shutdown mode.
! Ping our Level 3 DNS every 13 seconds ip sla 1 icmp-echo 4.2.2.2 source-interface fa4 threshold 3000 timeout 3000 frequency 13 exit ! ! Ping Google backup DNS every 13 seconds ip sla 2 icmp-echo 8.8.4.4 source-interface fa4 threshold 3000 timeout 3000 frequency 13 exit ! ! Ping our VPN internal IP every 3 seconds ip sla 3 icmp-echo 192.168.200.1 source-interface Tunnel200 vrf INTRA threshold 3000 timeout 3000 frequency 3 exit ! ! Run checks 24/7 ip sla schedule 1 start-time now life forever ip sla schedule 2 start-time now life forever ip sla schedule 3 start-time now life forever ! ! After around 30s of packet loss we considere Internet broken ip sla reaction-config 1 react timeout threshold-type consecutive 2 ip sla reaction-config 2 react timeout threshold-type consecutive 2 ip sla reaction-config 3 react timeout threshold-type consecutive 10 ! ! Don't miss this, otherwise your EEM applet won't trigger ip sla enable reaction-alerts ! We need old style track statements to abort infinite repair loop later track 1 ip sla 1 reachability exit ! track 2 ip sla 2 reachability exit ! track 3 ip sla 3 reachability exit ! EEM applet to take corrective actions based on IP SLA probes event manager applet WAN-monitor ! Check all three and run forever (default is 20s lifetime) event tag ping-1 ipsla operation-id 1 reaction-type timeout event tag ping-2 ipsla operation-id 2 reaction-type timeout event tag ping-3 ipsla operation-id 3 reaction-type timeout maxrun 0 trigger ! Only activate if all three are down indicating issue is on our end correlate event ping-1 and event ping-2 and event ping-3 exit ! We need "track" to break from loop as $_ipsla_condition is set only once action 010 comment // Uplink ipsla triggered, if it went down trigger repair action 020 comment // Do nothing if we're here because link just came back action 030 if $_ipsla_condition eq "Occurred" action 040 syslog msg "### HAXOR ### Internet connection lost ###" action 050 comment // Wait 30 seconds to synchronize track and ip sla states action 060 syslog msg "### HAXOR ### Delaying to avoid flapping ###" action 070 wait 30 action 080 set retries 1 action 090 cli command "enable" action 100 comment // Infinite loop is Infinite action 110 while 1 eq 1 action 120 comment // Exit loop if ICMP echo track 1 succeeds action 130 track read 1 action 140 if $_track_state eq "up" action 150 syslog msg "### HAXOR ### Internet connection resumed ###" action 160 exit action 170 end action 180 comment // Exit loop if ICMP echo track 2 succeeds action 190 track read 2 action 200 if $_track_state eq "up" action 210 syslog msg "### HAXOR ### Internet connection resumed ###" action 220 exit action 230 end action 240 comment // Exit loop if ICMP echo track 3 succeeds action 250 track read 3 action 260 if $_track_state eq "up" action 270 syslog msg "### HAXOR ### Internet connection resumed ###" action 280 exit action 290 end action 300 comment // Release DHCP IP action 310 syslog msg "### HAXOR ### Releasing DHCP IP on Fa4, attempt $retries ###" action 320 cli command "release dhcp fa4" action 330 comment // Wait 10 seconds before asking for new lease action 340 wait 10 action 350 syslog msg "### HAXOR ### Renewing DHCP IP on Fa4, attempt $retries ###" action 360 cli command "renew dhcp fa4" action 370 comment // Keep counter on how many times we've retried this action 380 increment retries 1 action 390 comment // Wait 90 seconds before re-checking connection status action 400 syslog msg "### HAXOR ### Waiting 90 seconds before retrying ###" action 410 wait 90 action 420 comment // Almost Infinite loop is Almost Infinite action 430 end action 440 end exit
Comments
Post a Comment
Got something to say?!