Reported symptoms
The overnight log reads like five separate faults.
At 03:22 a customer reports that they cannot reach a supplier in Portugal. At 03:31 a different customer cannot reach a payment gateway in Ireland. At 03:38, 03:41 and 03:45, three more destinations go dark, each reported by a different team, each in a different country, each a different prefix length. Nobody connects them, because there is nothing to connect them by.
By 04:05 three of the five are working again. Nobody fixed them. The tickets are closed as transient. At 06:12 one of the three fails again, which reopens the ticket with the comment “intermittent — suspect upstream”. Two of the original five have never come back.
The network on-call, arriving at 09:00, finds a router in perfect health:
- The eBGP session to ISP-A has been Established for forty-one days. It did not flap at 03:10, at 03:35, or at any other point.
- There has been no configuration change on this router in six weeks.
- The prefix count is a couple of hundred below yesterday’s figure — inside the band the monitoring uses, so nothing alerted.
- ISP-A, asked directly, insists it has been advertising all five prefixes continuously. They are right.
The estate
rtr-edge-1 is a VyOS 1.5 LTS router in AS 64512 with a single
transit session to ISP-A at 192.0.2.1, AS 64500. It takes a partial
table plus a default route, re-advertises to the core over iBGP, and
has done so without incident for over a year.
Fourteen months ago it had a bad week. ISP-A’s network churned for
several days, the local RIB churned with it, and during that incident
route-flap damping was configured on the ISP-A session. The commit
comment reads bgp: damp ISP-A after flap storm. It worked. The
incident closed. Nobody has looked at it since, and no current member
of the team was on that call.
Evidence provided
vyos@rtr-edge-1:~$ show ip bgp summaryNeighbor V AS MsgRcvd MsgSent Up/Down State/PfxRcd
192.0.2.1 4 64500 91422 4118 41d06h14m 4310Illustrative output
vyos@rtr-edge-1:~$ show ip bgp 198.51.100.0/24BGP routing table entry for 198.51.100.0/24
Paths: (1 available, no best path)
Path 1:
192.0.2.1 from 192.0.2.1 (10.255.9.1)
Origin IGP, metric 0, localpref 100, weight 0, valid, external
Dampinfo: penalty 2412, flapped 11 times in 00:24:31, reuse in 01:12:00Illustrative output
vyos@rtr-edge-1:~$ show ip bgp neighbors 192.0.2.1 received-routes | match 198.51.100*d 198.51.100.0/24 192.0.2.1 0 64500 65010 iIllustrative output
vyos@rtr-edge-1:~$ show ip bgp dampening flap-statistics Network From Flaps Duration Reuse Path
*d 198.51.100.0/24 192.0.2.1 11 00:24:31 01:12:00 64500 65010 i
*d 198.51.100.128/25 192.0.2.1 19 00:25:02 03:41:00 64500 65010 i
*d 203.0.113.0/24 192.0.2.1 7 00:22:18 00:19:00 64500 65021 i
*d 203.0.113.64/26 192.0.2.1 4 00:18:44 00:04:00 64500 65021 iIllustrative output
vyos@rtr-edge-1:~$ show configuration commands | match dampeningset policy route-map RM-ISP-A-DAMP rule 10 action 'permit'
set policy route-map RM-ISP-A-DAMP rule 10 set dampening '15 750 2000 60'Illustrative output
Work the evidence before reading on
Nothing here is broken. Something here is doing exactly what it was configured to do, to prefixes nobody expected it to do it to.
- The prefix is in
show ip bgpand has no best-path marker. Read the three-failure-point model: this is not “not received” and not “not installed”. What is the one thing you know for certain about where the route stopped? received-routesshows the peer sending it. That single fact eliminates half the possible causes. Which half, and what does it leave?- Look at the timings in the flap statistics rather than the flap counts. Two prefixes flapped a similar number of times and have reuse times three hours apart. What does that tell you about how the penalty is calculated?
- Three destinations recovered on their own after about forty minutes and one relapsed. Self-healing at a characteristic interval is a strong signal. What kind of mechanism decays?
- The affected prefixes belong to unrelated customers in unrelated countries. Stop looking for what the customers have in common and ask what the paths have in common.
Before continuing: the session never went down, so what did?
Root cause
1. Damping penalises routes, and the session was never the subject
Route-flap damping tracks each prefix separately. Every time a prefix is withdrawn and re-announced, its penalty increases; the penalty then decays exponentially with a half-life. When the penalty crosses the suppress threshold, the prefix is held out of the best-path decision — it stays in the table, stays valid, and stops being selected — until the penalty decays below the reuse threshold.
The configured parameters here are the standard set the course describes: half-life 15 minutes, reuse 750, suppress 2000, maximum suppress time 60 minutes. Everything in the incident falls out of those four numbers.
Between 03:10 and 03:35 a link inside ISP-A’s network was unstable. This router saw that as a stream of withdrawals and re-announcements for whichever prefixes crossed that link. The session itself was never affected: BGP kept its TCP connection, kept its keepalives, and kept reporting Established, which is why every session-level check said health and why three hours went into the transport.
2. Every odd behaviour is the same mechanism
- Staggered onset. Prefixes crossed the suppress threshold at different moments, because each accumulated penalty at its own rate depending on how many times it flapped.
- Partial self-healing after about forty minutes. Exponential decay from a modest peak. A prefix that just crossed 2000 falls below 750 in a little over two half-lives, which is the interval the tickets recorded and closed as “transient”.
- The one that came back and failed again. It took one further flap while its penalty was still elevated. Starting from a high base, one event was enough to cross the threshold again — and the second suppression lasts far longer than the first.
- The arbitrary-looking set. The affected prefixes are the ones whose path crossed the flapping link. There is no property of the customers, the countries or the prefix lengths that predicts it, because none of those things chose the path.
3. The decisive command is the cheapest one
show ip bgp neighbors 192.0.2.1 received-routes is the command that
collapses this investigation, and it is worth being explicit about
why. It shows what the peer sent, before local policy. If the prefix
is there and not in the selected table, the loss happened locally and
the upstream is exonerated in one line. If it is absent, the peer is
the problem and nothing on this router will fix it.
Resolution
- Establish whether the upstream instability is over before choosing an action. This is not a formality: if ISP-A is still flapping, clearing the penalties re-admits the churn to your RIB and to everyone downstream, which is the harm the damping was bought to prevent.
- Capture the true blast radius before changing anything.
show ip bgp dampeninglists every suppressed prefix; the five in the tickets are a subset. Put the full list in the ticket - customers who did not call are still affected. - Record the flap statistics too.
show ip bgp dampening flap-statisticsis the evidence that the cause was upstream churn rather than anything on this router, and it will be gone once you clear. - If the instability is over, clear the penalties.
clear ip bgp dampening 198.51.100.0/24restores exactly the prefix you name and silently leaves the rest suppressed; clearing damping for the session restores all of them, and once the cause is known to be over that is usually what you want. - If the instability is not over, hold - and hold deliberately. Name an owner, set a review time, and send a customer message that says the prefix is suppressed and why. From the customer side, suppression and an outage are the same experience, and silence is what turns a defensible decision into a complaint.
- Verify selection and then installation, in that order: the
dflag gone and a best-path marker present inshow ip bgp, then a route inshow ip route. Selection and installation are different stages. - Leave the damping configuration alone tonight. Removing it is a design decision that belongs to whoever owns the fourteen-month-old choice, taken in daylight with the parameters in front of them.
- Re-read the flap statistics an hour later. Prefixes re-entering damping mean the upstream is not stable and you have restored a symptom rather than fixed a cause.
Verification
- The prefix is selected, not merely present.
show ip bgp 198.51.100.0/24shows nodflag and a best-path marker. This whole scenario exists because those two states look alike at speed. - The route is installed.
show ip route 198.51.100.0/24shows it in the FIB. A selected path that is not installed forwards nothing, and it is a different failure with a different cause. - The suppressed list is empty, or contains only entries you decided to leave and wrote down.
show ip bgp dampeningis the check, and "only the ones we knew about" is not a passing result. - Reachability is proven from a client, in both directions, rather than from the router. The reported symptom was reachability.
- Nothing is re-entering damping. Re-run
show ip bgp dampening flap-statisticsafter an hour, and again after a business day. - The suppressed-prefix count is now a monitored series with an alert on any non-zero value. Check it against the historical event rather than assuming it would have fired.
- The upstream statement is in writing. The timeline in this ticket rests on ISP-A confirming that the unstable link is out of service, not on your inference from the flap counts.
Prevention
- Count the suppressed prefixes and alert on the count. A
dampened prefix is an outage that no dashboard shows. The number of
entries in
show ip bgp dampeningis a one-line series, and any non-zero value deserves a notification with the cause already named. This single control converts a six-hour customer-driven diagnosis into a page. - Scope damping to the peer that justified it and give it a review date. The course is explicit that damping belongs on specific peers rather than globally, and only where the benefit of suppressing real flaps outweighs the cost of suppressing legitimate prefixes. A control added during one incident and never revisited is well placed to become the invisible cause of the next.
- Know your parameters in wall-clock terms. Half-life 15 and suppress 2000 are not abstractions; together they decide how long a customer stays dark after a flap storm. If nobody on the team can state that duration, the configuration is not understood well enough to be in production.
- Ask “did the peer send it” first.
received-routessplits the problem in half in one command and points the next hour at the correct half. It is the cheapest question in BGP troubleshooting and it is routinely asked third. - Widen the monitoring band the right way. A two-hundred-prefix drop sat inside the alerting band, which is a reasonable band for noise and a poor one for suppression. Alert on the suppressed count directly rather than trying to infer it from the total.