<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Zeal Networks]]></title><description><![CDATA[Musings from a digital plumber]]></description><link>https://zealnetworks.ca/</link><image><url>https://zealnetworks.ca/favicon.png</url><title>Zeal Networks</title><link>https://zealnetworks.ca/</link></image><generator>Ghost 4.48</generator><lastBuildDate>Sun, 18 Feb 2024 05:11:43 GMT</lastBuildDate><atom:link href="https://zealnetworks.ca/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[It's The Little Things.]]></title><description><![CDATA[<p></p><h3 id="the-before-times">The Before Times</h3><p><br>For a long time, I was using my trusty ER-X as my main router on my LAN. <br><br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2024/02/image.png" class="kg-image" alt loading="lazy" width="732" height="526" srcset="https://zealnetworks.ca/content/images/size/w600/2024/02/image.png 600w, https://zealnetworks.ca/content/images/2024/02/image.png 732w" sizes="(min-width: 720px) 720px"><figcaption>EdgeRouter X</figcaption></figure><p>For it&apos;s era, it was nearly perfect:</p><ul><li>Very low price tag</li><li>Debian underpinnings that are easily exposed</li><li>Really great CLI (due to the Vyatta fork) &amp;</li></ul>]]></description><link>https://zealnetworks.ca/its-the-little-things/</link><guid isPermaLink="false">65c98bc0fbc355000134415a</guid><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Mon, 12 Feb 2024 04:07:10 GMT</pubDate><content:encoded><![CDATA[<p></p><h3 id="the-before-times">The Before Times</h3><p><br>For a long time, I was using my trusty ER-X as my main router on my LAN. <br><br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2024/02/image.png" class="kg-image" alt loading="lazy" width="732" height="526" srcset="https://zealnetworks.ca/content/images/size/w600/2024/02/image.png 600w, https://zealnetworks.ca/content/images/2024/02/image.png 732w" sizes="(min-width: 720px) 720px"><figcaption>EdgeRouter X</figcaption></figure><p>For it&apos;s era, it was nearly perfect:</p><ul><li>Very low price tag</li><li>Debian underpinnings that are easily exposed</li><li>Really great CLI (due to the Vyatta fork) &amp; <em>okay</em> GUI </li><li>Hardware Switch for line-rate (1Gbps) switching between ports</li><li>24v Passive PoE with passthrough to power a Unifi AP with a single adapter</li><li>All the good EdgeOS features (BGP, OSPF, IPSec, OSPF)</li><li>Passive cooling</li></ul><p></p><p>So, for a long time, my LAN looked like this:</p><p></p><p></p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2024/02/IPSEC_pre.png" class="kg-image" alt loading="lazy" width="1009" height="652" srcset="https://zealnetworks.ca/content/images/size/w600/2024/02/IPSEC_pre.png 600w, https://zealnetworks.ca/content/images/size/w1000/2024/02/IPSEC_pre.png 1000w, https://zealnetworks.ca/content/images/2024/02/IPSEC_pre.png 1009w"><figcaption>Before</figcaption></figure><p>I used my Odroid SBC as a Wireguard server (among other things, like syncthing &amp; git). This allowed me to connect in, via the web, and access my LAN, the internet from my LAN, and also remote networks via always-on IPSec tunnels.</p><p>This allowed me to use JuiceSSH &amp; Wireguard to remotely diagnose a DBIUA routing issue, while riding on a bullet train in Germany.</p><h3 id="new-beginnings">New Beginnings</h3><p>Well, all good things come to an end and I moved to an apartment in a brand new purpose-built rental building. The big up-side was getting fiber to the unit internet service. </p><p>The big downside was that the MIPs chip in my ER-X can only handle about ~300 Mbps NAT offload. So, instead of bridging the provider&apos;s router, I decided to stick with it and let my ER-X collect some dust.</p><p>Aside from some yuck DHCP <a href="https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#Operation">DORA</a> wait-times, which was easy enough to solve with static addressing, the provider&apos;s router &amp; separate AP wasn&apos;t bad at all. </p><p>The provider&apos;s portal even offered a lovely port-forwarding option, which allowed me to re-connect my VPN server.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2024/02/image-1.png" class="kg-image" alt loading="lazy" width="2000" height="309" srcset="https://zealnetworks.ca/content/images/size/w600/2024/02/image-1.png 600w, https://zealnetworks.ca/content/images/size/w1000/2024/02/image-1.png 1000w, https://zealnetworks.ca/content/images/size/w1600/2024/02/image-1.png 1600w, https://zealnetworks.ca/content/images/2024/02/image-1.png 2010w" sizes="(min-width: 1200px) 1200px"></figure><p></p><h3 id="someday-always-comes">Someday Always Comes</h3><p><br>After many days of enjoying things as is, I found myself wanting my site-to-site IPSec tunnels back. I knew I <em>could </em>use <a href="https://nebula.defined.net/docs/config/tun/#tunroutes">Nebula attached routes,</a> but I just didn&apos;t trust the little device I had on the LAN. I also preferred to keep my Nebula a safe overlay mesh, from host-to-host, with zero-trust policies.</p><p>I also wanted to use the ER-X as a 5 port desk switch. I intend to get a Minisforum desk server in the near future, so it will need a port.</p><p>So, as a temporary measure, I plugged my ER-X as-is and the network looked like this:</p><p></p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2024/02/IPSEC_mid.png" class="kg-image" alt loading="lazy" width="1026" height="772" srcset="https://zealnetworks.ca/content/images/size/w600/2024/02/IPSEC_mid.png 600w, https://zealnetworks.ca/content/images/size/w1000/2024/02/IPSEC_mid.png 1000w, https://zealnetworks.ca/content/images/2024/02/IPSEC_mid.png 1026w"><figcaption>Temporary</figcaption></figure><p>From the above, you should gather:</p><ul><li>My workstation was behind a double NAT (yuck)</li><li>I would have to modify routes policies and routes both ways to allow connectivity between my VPN server &amp; my ER-LAN / remote tunneled networks</li><li>My Bandwidth was now limited :( </li></ul><p></p><figure class="kg-card kg-image-card"><img src="https://zealnetworks.ca/content/images/2024/02/speedtest_with_erx.png" class="kg-image" alt loading="lazy" width="621" height="165" srcset="https://zealnetworks.ca/content/images/size/w600/2024/02/speedtest_with_erx.png 600w, https://zealnetworks.ca/content/images/2024/02/speedtest_with_erx.png 621w"></figure><p></p><h3 id="it-must-be-done">It Must Be Done</h3><p><br>After pulling some large arch updates, I was annoyed to see my speed capped on my beautiful fiber connection. So I finally made the conversion.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2024/02/IPSEC_post.png" class="kg-image" alt loading="lazy" width="1009" height="642" srcset="https://zealnetworks.ca/content/images/size/w600/2024/02/IPSEC_post.png 600w, https://zealnetworks.ca/content/images/size/w1000/2024/02/IPSEC_post.png 1000w, https://zealnetworks.ca/content/images/2024/02/IPSEC_post.png 1009w"><figcaption>Now</figcaption></figure><p></p><p>Now my LAN had the following characteristics:</p><ul><li>I could pass traffic at 1Gbps line-rate to my LAN and beyond</li><li>I attached my VPN tunnels to the SVI address of my ERX switch</li><li>I utilized static routes to the SVI to reach the remote networks over my IPsec tunnels</li></ul><p></p><figure class="kg-card kg-image-card"><img src="https://zealnetworks.ca/content/images/2024/02/results_after_erx_switch.png" class="kg-image" alt loading="lazy" width="601" height="190" srcset="https://zealnetworks.ca/content/images/size/w600/2024/02/results_after_erx_switch.png 600w, https://zealnetworks.ca/content/images/2024/02/results_after_erx_switch.png 601w"></figure><p></p><figure class="kg-card kg-code-card"><pre><code>basic config:
------
me@ERX:~$ show configuration commands | match switch0 | match inter
set interfaces switch switch0 address 10.88.99.235/24
set interfaces switch switch0 mtu 1500
set interfaces switch switch0 switch-port interface eth0
set interfaces switch switch0 switch-port interface eth1
set interfaces switch switch0 switch-port interface eth2
set interfaces switch switch0 switch-port interface eth3
set interfaces switch switch0 switch-port interface eth4
set interfaces switch switch0 switch-port vlan-aware disable
set vpn ipsec ipsec-interfaces interface switch0
me@ERX:~$ 

workstation routes:
------

[me@workstation ~]$ ip route | grep -E &quot;def|99.23&quot;
default via 10.88.99.254 dev enp4s0 proto static metric 100 
10.0.0.0/11 via 10.88.99.235 dev enp4s0 proto static metric 100 
10.10.0.0/23 via 10.88.99.235 dev enp4s0 proto static metric 100 
172.16.0.0/19 via 10.88.99.235 dev enp4s0 proto static metric 100 
[me@workstation ~]$ </code></pre><figcaption>Note the different next-hops after &quot;via&quot;</figcaption></figure><p>In the world of cattle vs pets, I sure did miss my little buddy. </p><p>The next-stage in the upgrade is to get an x86 2x 2.5Gbe router (my internet connection is actually 2Gbps down, 1Gbps up) . I will then upgrade my gateway to VyOS and use my ER-X as simply a managed switch.</p><p>Until then, I&apos;m happy with this silly setup.</p>]]></content:encoded></item><item><title><![CDATA[On Juniper]]></title><description><![CDATA[Thoughts on the acquisition of Juniper]]></description><link>https://zealnetworks.ca/on-juniper/</link><guid isPermaLink="false">65a574e049295500019f0b37</guid><category><![CDATA[juniper]]></category><category><![CDATA[industry]]></category><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Mon, 15 Jan 2024 19:05:45 GMT</pubDate><content:encoded><![CDATA[<p>I&apos;ve been sitting with this for a short bit.... but I think it&apos;s time for some comments on the Juniper acquisition by HP</p><p><a href="https://www.hpe.com/us/en/newsroom/press-release/2024/01/hpe-to-acquire-juniper-networks-to-accelerate-ai-driven-innovation.html">https://www.hpe.com/us/en/newsroom/press-release/2024/01/hpe-to-acquire-juniper-networks-to-accelerate-ai-driven-innovation.html</a></p><h3 id="re-route">Re-route</h3><!--kg-card-begin: html--><iframe src="https://noc.social/@kazaii/111733521944075866/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" allowfullscreen="allowfullscreen"></iframe><script src="https://noc.social/embed.js" async="async"></script><!--kg-card-end: html--><p>It&apos;s a rather eerie coincidence that I sat down to write this post a year to the date of my post about <a href="https://zealnetworks.ca/to-be-or-not-to-be/">waffling about CCIE / JNCIE </a>. The waffling continued; However, I had done some reflection. <br><br>That reflection concluded that I&apos;ve met/heard of so many Paper CCIE&apos;s but I&apos;ve never met - nor heard of - a Paper JNCIE. In fact, all of the people I&apos;ve met in my career, that have a JNCIE, have been excellent, if not superb. Looking at you Yufeng, Randy, Dakota, etc. </p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Side-bar... just look at this UD definition of a a CCIE: <a href="https://www.urbandictionary.com/define.php?term=CCIE"><em>Cringe</em></a></div></div><p>That made me think about pursuing the JNCIE this year. Especially given that it&apos;s practically free:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2024/01/Screenshot_20240115_131746.png" class="kg-image" alt="An image showing the details of the free/discounted training for Juniper Network Certifications" loading="lazy" width="1441" height="1063" srcset="https://zealnetworks.ca/content/images/size/w600/2024/01/Screenshot_20240115_131746.png 600w, https://zealnetworks.ca/content/images/size/w1000/2024/01/Screenshot_20240115_131746.png 1000w, https://zealnetworks.ca/content/images/2024/01/Screenshot_20240115_131746.png 1441w" sizes="(min-width: 720px) 720px"><figcaption>Note that I screenshotted this because I believe it&apos;s highly likely the link will 404 soon</figcaption></figure><p>I think Juniper will keep this program going for the duration it would take me to hit JNCIE; However, I&apos;m concerned about the value of Juniper branding, considering what&apos;s happened with other products swallowed by HP.</p><p>Just happy I didn&apos;t list it in <a href="https://zealnetworks.ca/2023/#looking-on-to-2024">my goals</a>.</p><h3 id="the-platform">The Platform</h3><p>Along with many of my colleagues, I have a lot of love for Juniper &amp; JunOS. </p><ul><li>It feels like a platform made for operators that live in the terminal and actually solve problems.</li><li> It has dedicated commands for verbose, terse &amp; detailed outputs. Pattern matching &amp; configuration layout has a great hierarchy</li><li>It supports commit-based configuration on all platforms</li><li>The information output is well structured, as it litters onto your screen.</li><li>The feature support is often top-notch (automation, slicing, protocols, etc).</li><li>The documentation has been relatively great</li><li>Unshy about the FreeBSD underpinnings (or Linux with Junos Evolved).</li></ul><p>In the argument of Pets vs Cattle, it&apos;s a treasured pet.</p><h3 id="fond-memories">Fond Memories</h3><p>I first truly worked with Juniper back in September of 2015, when I started working for a DC / MSP company. One side of our core was Juniper (EX &amp; MX platform) along with a new offering featuring SRX boxes. </p><p>That exposure only increased as I migrated to working for an ISP. I have such fond memories on creating documentation for VLAN-Aware VPWS&apos;s (E-LINE) for a migration to QFX switches.</p><p>I also have fond memories tracing an obscure VRF across the country across several MX&apos;s and coming up with a strategy to absorb it into our Multi-tenant Private cloud solution, with overly complex stitching &amp; route-policies.</p><p>Then there was that time I had 3-5 SRX&apos;s, two EX4200&apos;s in my employee co-location &amp; this M20 sucking all that free electricity in my old apartment:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2024/01/M20.jpg" class="kg-image" alt="A picture of a very large and very old Juniper router" loading="lazy" width="1280" height="853" srcset="https://zealnetworks.ca/content/images/size/w600/2024/01/M20.jpg 600w, https://zealnetworks.ca/content/images/size/w1000/2024/01/M20.jpg 1000w, https://zealnetworks.ca/content/images/2024/01/M20.jpg 1280w" sizes="(min-width: 720px) 720px"><figcaption>Seemed like a good idea at the time</figcaption></figure><p>In general, I simply had a great time with Juniper; My love of Juniper is what made me favour the shells of VyOS &amp; IOS-XR. </p><h3 id="looking-forward">Looking Forward</h3><p>I may still try to rush out the JNCIE. I think it could push me to do a lot of the studying I&apos;ve been holding back on in the past few years; However, I don&apos;t think I&apos;d consider it a ticket to the next stage in my career - I think that title is reserved for becoming a better coder / NetDev.</p><p>I also acknowledge that HP swallowing Juniper will be a slow process. Their ISP side still fills a gap that HP currently can&apos;t. <br><br>In the mean time, there&apos;s lots of discussion out there. Here&apos;s one I quite enjoyed from my RSS feeds:</p><p><a href="https://subnetzero.info/2024/01/11/hpe-buys-juniper/">HPE Buys Juniper</a></p>]]></content:encoded></item><item><title><![CDATA[2023]]></title><description><![CDATA[<p>The end of 2023 left me quite busy with family &amp; festive cheer. Now that a week of 2024 has come and gone, I&apos;ve found myself able to reflect on 2023 and project for 2024. This was greatly helped by reading a lovely list of 2023 year-end reviews</p>]]></description><link>https://zealnetworks.ca/2023/</link><guid isPermaLink="false">659c4746e2629f00018229d6</guid><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Mon, 08 Jan 2024 20:02:49 GMT</pubDate><content:encoded><![CDATA[<p>The end of 2023 left me quite busy with family &amp; festive cheer. Now that a week of 2024 has come and gone, I&apos;ve found myself able to reflect on 2023 and project for 2024. This was greatly helped by reading a lovely list of 2023 year-end reviews from some of my favourite bloggers.</p><h3 id="personally-notable-achievements">Personally Notable Achievements</h3><p>The first thing I&apos;d like to highlight of the things I did well &amp; consistently:</p><ul><li>Quit centralized platforms and joined the Fediverse (Mastodon, Lemmy). Take that, enshitternet.</li><li>I grew my RSS reader from ~20 feeds (mostly spammy news) to 86 feeds I actually enjoy reading. The small web is back. I&apos;m sure this will grow in 2024</li><li>I joined several mailing lists (GTALUG, NANOG) and forums (Practical ZFS &amp; several Lemmy communities). ** <em>still looking to meet a lobster to send me an invite</em> **</li><li>I&apos;ve begun the habit of not being a passive viewer. I started emailing folks and - to my surprise - folks email back; This is the way the web should be.</li><li>I took of the guard rails at work and allowed myself to stand out, despite the pitfalls of stepping on toes and being othered.</li><li>I broke away from a Network / Linux focus. I&apos;ve dabbeled more into web-development / CompSci / general coding / Systems Engineering, History (mainly Medieval / modern), and Tech Policy or privacy advocation. </li><li>Hacked back distraction by using ad-free / purpose built services. Redefined how I Timeblock. I also used services like Distraction Free Youtube to end the rabbit holes.</li></ul><h3 id="some-noteable-highlights">Some Noteable Highlights</h3><p>One of the things I did this year was take more of a focus on mentoring / guidance. I&apos;ve provided &amp; received as much insight online as I could &#x2013; while trying not to be a reply guy. I&apos;ve also taken on this mindset at work; I&apos;ve really tried to being an encouraging guide to my colleagues. I just have to add, unfortunately, that I believe this is often negated by my work environment itself.</p><p>Another great great highlight was combining NANOG88 with a visit to my dear colleagues in Seattle. NANOG 88 had many great sessions and discussions. Some of those discussions inspired some of my projects for 2023 and beyond. I also enjoyed my time in Seattle. It&apos;s such a laid back and easy city for me to enjoy.</p><p>As for DBIUA / Orcas Island; I always have a wonderful time visiting my dear friends&apos; slice of paradise. The deer population was down, but we got to see Orcas this time &#x2013; on my colleagues pursuit boat, to boot. If my aspirations were different, I really wish I could settle down on Vancouver Island and be a stone&apos;s throw away from such a wonderful place.</p><p>I&apos;m so grateful for the many accomodations the DBIUA team / community made for me. I hope to reward this with great projects.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2024/01/photo_2024-01-08_14-19-44.jpg" class="kg-image" alt="A cup of coffee with latte art saying &quot;N88 - Seattle - NANOG&quot;" loading="lazy" width="960" height="1280" srcset="https://zealnetworks.ca/content/images/size/w600/2024/01/photo_2024-01-08_14-19-44.jpg 600w, https://zealnetworks.ca/content/images/2024/01/photo_2024-01-08_14-19-44.jpg 960w" sizes="(min-width: 720px) 720px"><figcaption>The coffee at the the conference was top-notch</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2024/01/photo_2024-01-08_14-19-34.jpg" class="kg-image" alt="A docked seaplane." loading="lazy" width="1280" height="960" srcset="https://zealnetworks.ca/content/images/size/w600/2024/01/photo_2024-01-08_14-19-34.jpg 600w, https://zealnetworks.ca/content/images/size/w1000/2024/01/photo_2024-01-08_14-19-34.jpg 1000w, https://zealnetworks.ca/content/images/2024/01/photo_2024-01-08_14-19-34.jpg 1280w" sizes="(min-width: 720px) 720px"><figcaption>The best way to get to Orcas.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2024/01/photo_2024-01-08_14-19-39.jpg" class="kg-image" alt="A photo of a wireless point to point radio, with Washington mountains and forest in the background" loading="lazy" width="960" height="1280" srcset="https://zealnetworks.ca/content/images/size/w600/2024/01/photo_2024-01-08_14-19-39.jpg 600w, https://zealnetworks.ca/content/images/2024/01/photo_2024-01-08_14-19-39.jpg 960w" sizes="(min-width: 720px) 720px"><figcaption>Cottage radio. Worked like a charm.</figcaption></figure><p>The final thing I&apos;d like to note is that I see the elements in which I have made change at work. Sadly, there was a recent incident where a seniour colleague of mine expressed that he didn&apos;t see the change, by making light of my tenure; However, I know better. It&apos;s really hard to be a beacon of change, when you&apos;re in an environment that is so resistant to it. </p><p>Nevertheless, I press on with a project I started in 2023, which I feel fills a very large void in our MTTR. I am proud as it is challenging me on all fronts of my knowledge (automation, reverse engineering, systems deployment, project management and gathering influence). I hope this project is successful in 2024 as it very well be my magnum opus / final endeavour, within this organization.</p><p>In summary, I&apos;m happy to look deeper into the things I can personally bring to my org; However, I feel more and more as a <em>Persona non Grata.</em></p><p>On a more personal non-career note, I also finally made it to Germany; This further solidified my itch to uproot my skills and export them to Europe.</p><h3 id="looking-on-to-2024">Looking on to 2024</h3><p>There&apos;s much to say about the remaining 358 days of the year. I will keep it short and sweet with some of my goals (these are not resolutions).</p><ul><li>Attend 3 conferences (I&apos;m hoping for 2x NANOG &amp; 1x another conference, such as DENOG)</li><li>Speak at at least one of those conferences (lightning talk counts, but I&apos;d prefer a full session)</li><li>Contribute to a project I adore, such as Netbox or VyOS</li><li>Produce a series of free guides, in the interest of making free stuff (a la Max Bock). Could be blog, could be video, could be both.</li><li>Continue connecting with tech folks far and wide. One shouldn&apos;t be limited to their local tribe.</li><li>Really take a deep dive into coding. A big stretch goal in this is to take on WebDev as a new hobby (with such great tooling and RSS feeds, it&apos;d be a shame not to draw on such resources). </li><li>Read as much as I can. Write as much as I can (be it journaling or on this blog).</li><li>Read/Review five+ textbooks. I&apos;ll try to post back on these with my notes.</li><li>Continue home projects / self-hosting. I moved in 2023, which allows me to get a fiber connection (2Gbps down, 1GBps) up. There is much to explore in 2.5Gbe, mirroring, filling up my patch closet with low-power servers. </li><li>As per the above, I&apos;d like to deploy more services. The fediverse has interesting projects (Pixelfeed, Peertube and Owncast). There&apos;s also front-ends like Individuous that will allow me to stop fighting Youtube Ad-block arms race and simply pull the content, ad/tracker/distraction free.</li><li>Fill up my Bookmark manager (newly deployed) with notes &amp; as many interesting articles as I can. Gone are the days of saving something in Telegram, only to struggle finding it later on. I&apos;m using Linkding for this (thanks Tooters for your recommendations!).</li><li>Do more for DBIUA. I believe some of our limitations can be undone &#x2013; it just requires a little keyboard lube.</li></ul><h2 id="cheers-to-2024">Cheers to 2024! </h2><h3 id="bonus-thought">Bonus Thought</h3><p>Instead of a year-end link dump, I think it&apos;s fair to say that 2023 was the beginning of the end for platforms. Xitter (pronounced Shitter) effectively died and many others are dying with it (Substack, etc.). It&apos;s perhaps time that we, once again, consider the web as an end-to-end service, rather than a select few <em>private</em> &quot;Town Squares&quot;.</p><p>It&apos;s also been the rise of AI (or plausible sentence generators, as Doctorow would call them &#x2013; being as &quot;they&apos;re neither artificial or intelligent&quot;). This is causing the world of SEO spam/low-effort garbage &quot;content&quot; to explode at a level we never fully imagined. <br><br>So, if you read anything this year, read this:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://maggieappleton.com/ai-dark-forest#passing-the-reverse-turing-test"><div class="kg-bookmark-content"><div class="kg-bookmark-title">The Expanding Dark Forest and Generative AI</div><div class="kg-bookmark-description">Proving you&#x2019;re a human on a web flooded with generative AI content</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://maggieappleton.com/images/favicon/apple-touch-icon.png" alt><span class="kg-bookmark-author">Maggie Appleton</span><span class="kg-bookmark-publisher">Luciano Strika</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://maggieappleton.com/images/og/fe37968757d0ac03e4b01c7496b2e8ac.png" alt></div></a></figure><p>Maggie nails it, especially with her diagram. <br><br>I&apos;d like to expand upon this in a formal post, but I think 2024 will see a further pilgrimage of tech folk into the fediverse, small web and cozy web. I also believe that normal folk will continue to gather in the cozy web, leaving &quot;platforms&quot; and meeting their friends in digital living rooms. </p><p>I think we&apos;re at the start of something beautiful or quite horrific. I suppose it depends on your motives and your personal perspective.</p>]]></content:encoded></item><item><title><![CDATA[Really Hits Home]]></title><description><![CDATA[<p>This meme has been making the rounds on Mastodon and... wow... it really hits home.</p><p></p><figure class="kg-card kg-image-card"><img src="https://zealnetworks.ca/content/images/2023/11/e8f38dca20dc68e8.png" class="kg-image" alt loading="lazy" width="842" height="1280" srcset="https://zealnetworks.ca/content/images/size/w600/2023/11/e8f38dca20dc68e8.png 600w, https://zealnetworks.ca/content/images/2023/11/e8f38dca20dc68e8.png 842w" sizes="(min-width: 720px) 720px"></figure><p>When converted Zeal to a blog, I intended to write a lot more. I wanted to blog the various things I&apos;m working on. Sadly, I&apos;ve worked on many things I haven&</p>]]></description><link>https://zealnetworks.ca/hits-home/</link><guid isPermaLink="false">6548f33cc19ca00001e616f7</guid><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Fri, 10 Nov 2023 01:06:00 GMT</pubDate><content:encoded><![CDATA[<p>This meme has been making the rounds on Mastodon and... wow... it really hits home.</p><p></p><figure class="kg-card kg-image-card"><img src="https://zealnetworks.ca/content/images/2023/11/e8f38dca20dc68e8.png" class="kg-image" alt loading="lazy" width="842" height="1280" srcset="https://zealnetworks.ca/content/images/size/w600/2023/11/e8f38dca20dc68e8.png 600w, https://zealnetworks.ca/content/images/2023/11/e8f38dca20dc68e8.png 842w" sizes="(min-width: 720px) 720px"></figure><p>When converted Zeal to a blog, I intended to write a lot more. I wanted to blog the various things I&apos;m working on. Sadly, I&apos;ve worked on many things I haven&apos;t blogged. I spend too much time making my posts &quot;complete&quot; , leaving too many posts in draft status.</p><p>So I intend to fix that... I am going to treat this blog more like technical notes. </p><p>I&apos;m also going to take notes from these two gents:</p><h3 id="doctorows-memex-method">Doctorow&apos;s Memex Method:<br></h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://pluralistic.net/2021/05/09/the-memex-method/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">The Memex Method &#x2013; Pluralistic: Daily links from Cory Doctorow</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i0.wp.com/pluralistic.net/wp-content/uploads/2020/02/cropped-guillotine-French-Revolution.jpg?fit=192%2C192&amp;ssl=1" alt><span class="kg-bookmark-author">Pluralistic: Daily links from Cory Doctorow No trackers, no ads. Black type, white background. Privacy policy: we don&apos;t collect or retain any data at all ever period.</span><span class="kg-bookmark-publisher">Cory Doctorow</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i0.wp.com/pluralistic.net/wp-content/uploads/2023/09/7d935-0znkco4m0a-zmla3x.jpg?w=840&amp;ssl=1" alt></div></a></figure><h3 id="nielsons-method">Nielson&apos;s method:</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.jim-nielsen.com/2021/things-learned-blogging/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Things Learned Blogging</div><div class="kg-bookmark-description">Writing about the big beautiful mess that is making things for the world wide web.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.jim-nielsen.com/favicon.ico" alt><span class="kg-bookmark-author">Jim Nielsen&#x2019;s Blog Verified ($10/year for the domain)</span><span class="kg-bookmark-publisher">Jim Nielsen</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.jim-nielsen.com/assets/img/twitter-card.png" alt></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Looks can be deceiving]]></title><description><![CDATA[<h3 id="real-world-inspiration">Real-world Inspiration</h3><p>This is likely my last post on Network Tracing. I just can&apos;t help myself, as recently I had a rather interesting case of where traceroute can be deceiving.</p><p>A user reported an issue where they experienced consistent small amounts of packet loss on their L2VPN LAN</p>]]></description><link>https://zealnetworks.ca/when-looks-are-deceiving/</link><guid isPermaLink="false">641cbe2c59c09c0001c71538</guid><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Mon, 28 Aug 2023 20:17:13 GMT</pubDate><content:encoded><![CDATA[<h3 id="real-world-inspiration">Real-world Inspiration</h3><p>This is likely my last post on Network Tracing. I just can&apos;t help myself, as recently I had a rather interesting case of where traceroute can be deceiving.</p><p>A user reported an issue where they experienced consistent small amounts of packet loss on their L2VPN LAN Extension. The issue started a few days ago and was still in effect. They provided proof via a ping, such as this:</p><pre><code>patientuser@host:~$ ping 10.20.20.20 -c 50 | egrep -i &quot;trans|rtt&quot;
50 packets transmitted, 45 received, 10% packet loss, time 49187ms
rtt min/avg/max/mdev = 6.774/8.001/13.354/1.058 ms
patientuser@host:~$ </code></pre><p>My colleague decided to test it out. At first, the ping looked clean.... but uping the amount of echoes reproduced the loss. </p><pre><code>RP/0/0/CPU0:XRv-1#ping 10.255.255.10 so lo0

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.255.255.10, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/4/9 ms
RP/0/0/CPU0:XRv-1#
RP/0/0/CPU0:XRv-1#
RP/0/0/CPU0:XRv-1#ping 10.255.255.10 so lo0 count 100 

Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.255.255.10, timeout is 2 seconds:
!!!!!!!.!!!!!!!!!!!!!!!!!...!!!!!!!!!!!!!!.!!!!!!!!!.!!!!!!!!!!!!!!!!!
!.!!!!!!!!!!!!!!!!.!!!!!!!!!!!
Success rate is 92 percent (92/100), round-trip min/avg/max = 1/5/9 ms
RP/0/0/CPU0:XRv-1#</code></pre><p>So the loss seemed to be somewhere between the ingress PE and the egress as it traverses to the egress PE. He also confirmed that it was showing in MPLS OAM testing. He then called me over for some shoulder surfing support.</p><h3 id="spot-the-problem">Spot The Problem</h3><p>A quick traceroute, to determine where the issue was... across a few tests, things to go awry around hop 3:</p><pre><code>
RP/0/0/CPU0:XRv-1#traceroute 10.255.255.10 so lo0         


Type escape sequence to abort.
Tracing the route to 10.255.255.10

 1  10.1.2.2 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  0 msec 
 2  10.2.7.7 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  0 msec 
 3  10.6.7.6 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  *   &lt;---- here
 4  10.6.9.9 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  0 msec 
 5  10.9.10.10 0 msec  *  0 msec 
RP/0/0/CPU0:XRv-1#

RP/0/0/CPU0:XRv-1#traceroute 10.255.255.10 so lo0 


Type escape sequence to abort.
Tracing the route to 10.255.255.10

 1  10.1.2.2 [MPLS: Label 16010 Exp 0] 9 msec  0 msec  0 msec 
 2  10.2.7.7 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  0 msec 
 3  10.6.7.6 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  0 msec 
 4  10.6.9.9 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  *   &lt;---- hop 4 
 5  10.9.10.10 0 msec  *  0 msec 
RP/0/0/CPU0:XRv-1#

RP/0/0/CPU0:XRv-1#traceroute 10.255.255.10 so lo0 


Type escape sequence to abort.
Tracing the route to 10.255.255.10

 1  10.1.2.2 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  0 msec 
 2  10.2.7.7 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  0 msec 
 3  10.6.7.6 [MPLS: Label 16010 Exp 0] 0 msec  *  0 msec    &lt;----- hop 3
 4  10.6.9.9 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  0 msec 
 5  10.9.10.10 0 msec  *  0 msec 
RP/0/0/CPU0:XRv-1#</code></pre><p>In my lab, it&apos;s quite obvious where this PtP interface is between (router 6 &amp; 7), but in our production... it&apos;s more arbitrary so we queried the LSDB:</p><pre><code>RP/0/0/CPU0:XRv-1#show ip route 10.6.7.6 | i entry

Routing entry for 10.6.7.0/24
RP/0/0/CPU0:XRv-1#
RP/0/0/CPU0:XRv-1#show isis database detail | i &quot;Host|10.6.7.0/24&quot; | utility e$

  Hostname:       XRv-6
  Metric: 500        IP-Extended 10.6.7.0/24
--
  Hostname:       XRv-7
  Metric: 10         IP-Extended 10.6.7.0/24
RP/0/0/CPU0:XRv-1#</code></pre><p>We then hopped to that router to test the ingress/egress adjacency:</p><pre><code>RP/0/0/CPU0:XRv-7#show isis adjacency | i v-6

XRv-6          Gi0/0/0/3        0c83.0a4f.0006 Up    21   00:21:31 Yes None None
RP/0/0/CPU0:XRv-7#show arp | i 0/0/0/3

10.6.7.6        00:21:36   0c83.0a4f.0006  Dynamic    ARPA  GigabitEthernet0/0/0/3
10.6.7.7        -          0cf0.832b.0004  Interface  ARPA  GigabitEthernet0/0/0/3
RP/0/0/CPU0:XRv-7#ping 10.6.7.6 count 500 size 1472 donotfrag 

Type escape sequence to abort.
Sending 500, 1472-byte ICMP Echos to 10.6.7.6, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!
Success rate is 100 percent (500/500), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:XRv-7#</code></pre><p>Clean as a whistle... hmmm... we continued on &amp; checked hop 4, as we saw something there:</p><pre><code>RP/0/0/CPU0:XRv-6#show isis adjacency | i v-9

XRv-9          Gi0/0/0/3        0c06.7e75.0002 Up    26   00:22:44 Yes None None
RP/0/0/CPU0:XRv-6#show arp | i 0/0/3

10.6.9.6        -          0c83.0a4f.0004  Interface  ARPA  GigabitEthernet0/0/0/3
10.6.9.9        00:22:48   0c06.7e75.0002  Dynamic    ARPA  GigabitEthernet0/0/0/3
RP/0/0/CPU0:XRv-6#ping 10.6.9.9 count 500 size 1472 donotfrag 

Type escape sequence to abort.
Sending 500, 1472-byte ICMP Echos to 10.6.9.9, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!
Success rate is 100 percent (500/500), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:XRv-6#</code></pre><p>Also clean. To ensure we were in the right direction, we pinged back towards the ingress PE and also towards the egress PE. Sure enough, we were getting closer:</p><pre><code>RP/0/0/CPU0:XRv-6#ping 10.255.255.10 count 100

Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.255.255.10, timeout is 2 seconds:
!.!!!!!.!.!.!!!!!!!!!!!!!!!.!!!!!!!!!.!.
Success rate is 82 percent (33/40), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:XRv-6#ping 10.255.255.1 count 100 

Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.255.255.1, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (100/100), round-trip min/avg/max = 1/2/19 ms
RP/0/0/CPU0:XRv-6#</code></pre><p>We verified hop 5 (there were 6 hops in production) and moved onto the egress PE itself. Sure enough, we spotted the loss on a particular ingress interface:</p><figure class="kg-card kg-code-card"><pre><code>RP/0/0/CPU0:XRv-10#show arp | i Dyna

10.5.10.5       00:24:36   0cde.5dc8.0004  Dynamic    ARPA  GigabitEthernet0/0/0/0
10.9.10.9       00:24:48   0c06.7e75.0004  Dynamic    ARPA  GigabitEthernet0/0/0/1
RP/0/0/CPU0:XRv-10#ping 10.9.10.9 count 100

Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.9.10.9, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (100/100), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:XRv-10#


RP/0/0/CPU0:XRv-10#ping 10.5.10.5 count 100          

Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.5.10.5, timeout is 2 seconds:
!!!!!!!.!!!!!!!!!!!!!!!!.!!!!!!.!!!.!!!!!!!.!!!!!.!!!!!.!!!!!!!!!!!.!!
!!!!!!.!!!!!!!!!!!!!!!.!!!!!!!
Success rate is 90 percent (90/100), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:XRv-10#
</code></pre><figcaption>This was a separate line-card in Prod</figcaption></figure><h3 id="what-the-fec">What the FEC?</h3><p>So, if you look closer at the beginning traces.... the issue seems to be more apparent at hop 5:</p><pre><code>RP/0/0/CPU0:XRv-1#traceroute 10.255.255.10 so lo0         

&lt;snip&gt;
 5  10.9.10.10 0 msec  *  0 msec 
RP/0/0/CPU0:XRv-1#

RP/0/0/CPU0:XRv-1#traceroute 10.255.255.10 so lo0 

&lt;snip&gt;
 5  10.9.10.10 0 msec  *  0 msec 
RP/0/0/CPU0:XRv-1#

RP/0/0/CPU0:XRv-1#traceroute 10.255.255.10 so lo0 

&lt;snip&gt;
 5  10.9.10.10 0 msec  *  0 msec 
RP/0/0/CPU0:XRv-1#</code></pre><p>Suddenly it dawned on me as to why. As indicatd in the following RFCs: <a href="https://www.rfc-editor.org/rfc/rfc3032.html">[3032]</a> &amp;&amp; <a href="https://www.rfc-editor.org/rfc/rfc3032.html">[4950]</a> , when TTL expires in an MPLS label in transit... the ingress LSR will inspect the underlying IP header, if applicable. It will utilize the Source IP in the header &amp; deliver an ICMP TTL Exceeded (ICMP type 11, code 0) message to the source of the packet, now as the destination, with it&apos;s ingress interface as the source.</p><p>A potential problem is that the LSR may not know how to reach the source of the packet at all. In fact, the LSR may have almost no knowledge of anything outside of the MPLS core. Since the PE&apos;s likely have an idea of the VRF/L2 instance, the LSR will utilize the outer/transit label &amp; re-generate a fresh packet towards the Z-end PE that the original transit label was targetting. Once the Z-End PE receives the payload, it will then forward it back over the core towards the source &#x2013; as it knows exactly how to reach the node. </p><p>That means that many of the ICMP TTL expiry messages were being tunneled via the problematic Line-Card with the packet loss.</p><h3 id="captures-or-it-didnt-happen">Captures Or It Didn&apos;t Happen</h3><p>I&apos;ve created some packet captures in my lab to demonstrate this:</p><pre><code>RP/0/0/CPU0:XRv-1#traceroute 10.255.255.10 so lo0 minttl 2 maxttl 2


Type escape sequence to abort.
Tracing the route to 10.255.255.10

 2  10.2.7.7 [MPLS: Label 16010 Exp 0] 0 msec  0 msec  0 msec 
RP/0/0/CPU0:XRv-1#traceroute 10.255.255.10 so lo0 minttl 2 maxttl 2


Type escape sequence to abort.
Tracing the route to 10.255.255.10

 2  10.2.7.7 [MPLS: Label 16010 Exp 0] 9 msec  0 msec  * 
RP/0/0/CPU0:XRv-1#</code></pre><p>Router 7 generated an ICMP expiry to Router 1 &amp; sourced it from it&apos;s ingress interface facing router 2</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2023/03/image.png" class="kg-image" alt loading="lazy" width="1577" height="670" srcset="https://zealnetworks.ca/content/images/size/w600/2023/03/image.png 600w, https://zealnetworks.ca/content/images/size/w1000/2023/03/image.png 1000w, https://zealnetworks.ca/content/images/2023/03/image.png 1577w" sizes="(min-width: 1200px) 1200px"></figure><p>PHP is performed as the packet comes ingress into Router 10 and Router 10 is able to determine the best way to reach the destination, Router 1, via the core:</p><pre><code>RP/0/0/CPU0:XRv-10#
RP/0/0/CPU0:XRv-10#show isis adjacency | i v-5

XRv-5          Gi0/0/0/0        0cde.5dc8.0004 Up    7    00:41:55 Yes None None
RP/0/0/CPU0:XRv-10#show interfaces gigabitEthernet 0/0/0/0 | i bia

  Hardware is GigabitEthernet, address is 0cd9.4a8c.0001 (bia 0cd9.4a8c.0001)
RP/0/0/CPU0:XRv-10#</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2023/03/image-1.png" class="kg-image" alt loading="lazy" width="1521" height="680" srcset="https://zealnetworks.ca/content/images/size/w600/2023/03/image-1.png 600w, https://zealnetworks.ca/content/images/size/w1000/2023/03/image-1.png 1000w, https://zealnetworks.ca/content/images/2023/03/image-1.png 1521w" sizes="(min-width: 1200px) 1200px"></figure><p>Finally, Router 10 sends on the ICMP payload with the transit label of Router 1 (in this case, it&apos;s Node-SID):</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2023/03/image-2.png" class="kg-image" alt loading="lazy" width="1521" height="446" srcset="https://zealnetworks.ca/content/images/size/w600/2023/03/image-2.png 600w, https://zealnetworks.ca/content/images/size/w1000/2023/03/image-2.png 1000w, https://zealnetworks.ca/content/images/2023/03/image-2.png 1521w" sizes="(min-width: 1200px) 1200px"></figure><p>Traceroute will then see the ICMP encapsulated headers/Datagram data and understand that it&apos;s for the relevant probe @ Hop 2. </p><p>Yet another reason why Traceroute is weird and sometimes it&apos;s best to roll up the sleeves and just verify hop by hop.</p>]]></content:encoded></item><item><title><![CDATA[Your Router Trusts You Too Much]]></title><description><![CDATA[<h3 id="when-you-make-an-uh-oh">When You Make An Uh-Oh</h3><p>You&apos;ve probably been there at least once. You&apos;re in a maintenance window. You make a change and the router is suddenly unreachable. You wait and wait, but it does not come back. You finally accept defeat &amp; start the process for</p>]]></description><link>https://zealnetworks.ca/your-router-trusts-you-too-much/</link><guid isPermaLink="false">63d8617b07055f0001c072ba</guid><category><![CDATA[Advice]]></category><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Tue, 31 Jan 2023 01:43:10 GMT</pubDate><content:encoded><![CDATA[<h3 id="when-you-make-an-uh-oh">When You Make An Uh-Oh</h3><p>You&apos;ve probably been there at least once. You&apos;re in a maintenance window. You make a change and the router is suddenly unreachable. You wait and wait, but it does not come back. You finally accept defeat &amp; start the process for a ride-in, a DC tech, a truck roll, etc., etc. </p><p>It&apos;s not a good feeling. But, surely, it can be prevented. There are typically two ways this occurs:</p><p><strong>1.</strong> <strong>The firmware/software upgrade.</strong> </p><p>Let&apos;s say you staged this upgrade &#x2013; you should&apos;ve, if you could&apos;ve, anyway &#x2013; but it breaks it production. Just another one for the Network Voodoo... move-on and laugh it off.</p><p>You can also use it as a <a href="https://www.bnnbloomberg.ca/rogers-defends-shaw-deal-after-network-failure-as-stock-slumps-1.1790524">lame excuse</a> to buy out your competitors.</p><p><strong>2.</strong> <strong>A config change....</strong> </p><p>This is one you really should try your best to prevent. Lab your topology changes as much as possible. Have strong peer review processes... but for everything else, there&apos;s another way.</p><h3 id="podcast-feedback">Podcast Feedback</h3><p>In 2021 I submitted this feedback to one of my favourite podcasts, 2.5 Admin, in regards to a fail-safe mechanism for most platforms:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://2.5admins.com/2-5-admins-60/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">2.5 Admins 60: Butter Fingers &#x2013; 2.5 Admins</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://2.5admins.com/wp-content/uploads/2020/04/2.5-fav.png" alt><span class="kg-bookmark-author">2.5 Admins</span><span class="kg-bookmark-publisher">Joe Ressington</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://2.5admins.com/wp-content/uploads/2020/04/2.5admins-sm.png" alt></div></a></figure><p>Joe, Jim &amp; Alan do great work with this podcast. If you&apos;re a Network Professional, you should expand your horizons and tune-in.</p><h3 id="the-mechanism">The Mechanism</h3><p>This is often called a <em>confirmed </em>commit. You make a change on a device. The device waits a set period, expecting you to confirm that things are alright. If no confirmation occurs, the device will perform the necessary steps to roll-back the configuration.<br></p><p>Let&apos;s look at an example from the main platform this is famous from, JunOS:</p><pre><code>root@BB6&gt; configure 
Entering configuration mode

[edit]
root@BB6# delete interfaces ge-0/0/0 

[edit]
root@BB6# show | compare 
[edit interfaces]
-   ge-0/0/0 {
-       description &quot;PRODUCTION BREAKING CHANGE!!&quot;;
-       unit 0 {
-           family inet {
-               address 10.4.6.1/31;
-           }
-           family iso;
-           family mpls;
-       }
-   }

[edit]
root@BB6# commit confirmed 1  
commit confirmed will be automatically rolled back in 1 minutes unless confirmed
commit complete

# commit confirmed will be rolled back in 1 minute
[edit]
root@BB6#</code></pre><p>Let&apos;s say that, as the description <code>PRODUCTION BREAKING CHANGE!!</code> implied, this breaks production and locks you out of the box. The method will save you and automatically rollback the change:</p><pre><code>[edit]
                                                                               
Broadcast Message from root@BB6                                                
        (no tty) at 0:56 UTC...                                                
                                                                               
Commit was not confirmed; automatic rollback complete.                                                                               


[edit]
root@BB6# exit 
Exiting configuration mode

root@BB6&gt; show configuration | display set | match 0/0/0 
set interfaces ge-0/0/0 description &quot;PRODUCTION BREAKING CHANGE!!&quot;
set interfaces ge-0/0/0 unit 0 family inet address 10.4.6.1/31
set interfaces ge-0/0/0 unit 0 family iso
set interfaces ge-0/0/0 unit 0 family mpls
set protocols mpls interface ge-0/0/0.0
set protocols isis interface ge-0/0/0.0 point-to-point

root@BB6&gt; </code></pre><p>This convention also exists on IOS-XR:</p><pre><code>RP/0/0/CPU0:BB4#configure 

RP/0/0/CPU0:BB4(config)#no router isis BB
RP/0/0/CPU0:BB4(config)#show commit changes diff 

Building configuration...
!! IOS XR Configuration 6.1.3
-  router isis BB
-   apply-group GROUP_TILFA
-   is-type level-2-only
-   net 49.0000.0000.0000.0004.00
-   address-family ipv4 unicast
-    metric-style wide
-    segment-routing mpls sr-prefer
    !
-   interface Loopback0
-    passive
-    address-family ipv4 unicast
-     prefix-sid index 4
     !
    !
-   interface GigabitEthernet0/0/0/0
-    point-to-point
-    address-family ipv4 unicast
    !
-   interface GigabitEthernet0/0/0/2
-    point-to-point
-    address-family ipv4 unicast
    !
-   interface GigabitEthernet0/0/0/4
-    point-to-point
-    address-family ipv4 unicast
    !
   !
end

RP/0/0/CPU0:BB4(config)#commit confirmed ?
  &lt;30-65535&gt;  Seconds until rollback unless there is a confirming commit
  minutes     Specify the rollback timer in the minutes
  show-error  Displays commit failures immediately
  &lt;cr&gt;        Commit the configuration changes via pseudo-atomic operation
RP/0/0/CPU0:BB4(config)#commit confirmed 30

RP/0/0/CPU0:BB4(config)#

RP/0/0/CPU0:BB4#show log | i &quot;commit changes&quot;

RP/0/0/CPU0:Jan 31 00:59:07.425 : config[65741]: %MGBL-CONFIG-6-DB_COMMIT : Configuration committed by user &apos;kazaii&apos;. Use &apos;show configuration commit changes 1000000034&apos; to view the changes. 
RP/0/0/CPU0:Jan 31 00:59:44.622 : cfgmgr_trial_confirm[65743]: %MGBL-CONFIG-6-DB_COMMIT : Configuration committed by user &apos;kazaii&apos;. Use &apos;show configuration commit changes 1000000035&apos; to view the changes. 
RP/0/0/CPU0:BB4#

RP/0/0/CPU0:BB4#show isis adja


IS-IS BB Level-2 adjacencies:
System Id      Interface        SNPA           State Hold Changed  NSF IPv4 IPv6
                                                                       BFD  BFD 
BB3            Gi0/0/0/0        *PtoP*         Up    28   00:02:06 No  None None
BB6            Gi0/0/0/4        *PtoP*         Up    18   00:02:06 Yes None None
BB5            Gi0/0/0/2        *PtoP*         Up    29   00:02:06 No  None None

Total adjacency count: 3
RP/0/0/CPU0:BB4#</code></pre><p>For these platforms, and several others, things are really that elegant; You can utilize this feature to quickly get you out of Uh-Oh scenarios with limited impact.</p><p>You can also set it for a much broader timeframe &#x2013; say, for the duration of your maintenance window. You can continually test your environment... knowing that the system will rollback for you.</p><h3 id="caveats">Caveats</h3><p>Sadly, sometimes it&apos;s less of a snapshot and more of a <em>slapshot</em>... </p><p>For other platforms like classic IOS, IOS-XE, VyOS, EdgeOS, and several others... the way this feature is implemented is to reboot the box in a set interval.</p><p>For IOS, you would perform the command:</p><p><code>reload in 15</code> &#x2013; and the box would reload in 15 minutes. </p><p>Why is this such a stark difference? Well, because if you simply lock yourself out of management, while inline customer traffic is still flowing, you actually created a more serious outage; A tech-roll might&apos;ve been preferred...</p><pre><code>vyos@BB3# delete interfaces ethernet eth0
[edit]
vyos@BB3# show | compare
[edit interfaces]
-ethernet eth0 {
-    address 10.2.3.3/31
-    hw-id 0c:be:97:ba:00:00
-}
[edit]
vyos@BB3# commit-confirm 1
commit-confirm will automatically reboot in 1 minutes unless changes are confirmed.
Proceed? [y]y
Reboot scheduled for commit-confirm. Confirm your changes to cancel the reboot.
[edit]
vyos@BB3# 
[edit]
vyos@BB3# [  OK  ] Stopped /usr/bin/sg vyatta&#x2026;/archive/config.boot-rollback.
[  OK  ] Stopped /usr/bin/sg vyatta&#x2026;/archive/config.boot-rollback.
         Stopping Session 1 of user vyos.
[  OK  ] Removed slice system-modprobe.slice.
[  OK  ] Stopped target Graphical Interface.
[  OK  ] Stopped target Timers.
[  OK  ] Stopped Periodic ext4 Onli&#x2026;ata Check for All Filesystems.
[  OK  ] Stopped Discard unused blocks once a week.
[  OK  ] Stopped Daily rotation of log files.</code></pre><h3 id="my-thoughts">My Thoughts</h3><p>The best method is really to take your time &amp; do things right:</p><ul><li>Give yourself time.</li><li>Lab things up. </li><li>Test scenarios. </li><li>Draw things out. </li><li>Have peer reviews</li><li>Before you commit, <a href="https://zealnetworks.ca/whats-changed/">check the diff</a></li></ul><p>Certifications spend way too much time focusing on configuring things &amp; configuring them as fast as possible. There really should be more focus on &quot;.. if I hit <code>&lt;Enter&gt;</code> now, what do I expect to happen?&quot;</p><p>Maybe you should spend more time buildings tests &amp; valdiation into your automation, before your automation becomes a distributed outage bot.</p><p>It&apos;s too dangerous to commit alone! Use a confirmed commit.</p>]]></content:encoded></item><item><title><![CDATA[Querying the LSDB]]></title><description><![CDATA[<p></p><h3 id="once-upon-a-night-shift-dreary">Once Upon a Night Shift Dreary</h3><p>I recently performed a couple training sessions for my team. The subject of the training was &quot;Network Core Tracing&quot;, as I&apos;ve found &#x2013; in regards to tracing in the core &#x2013; there&apos;s a fair amount of inertia to</p>]]></description><link>https://zealnetworks.ca/querying-the-lsdb/</link><guid isPermaLink="false">63cc71548f2fdf0001955dc5</guid><category><![CDATA[troubleshooting]]></category><category><![CDATA[Routing]]></category><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Sun, 22 Jan 2023 02:36:21 GMT</pubDate><content:encoded><![CDATA[<p></p><h3 id="once-upon-a-night-shift-dreary">Once Upon a Night Shift Dreary</h3><p>I recently performed a couple training sessions for my team. The subject of the training was &quot;Network Core Tracing&quot;, as I&apos;ve found &#x2013; in regards to tracing in the core &#x2013; there&apos;s a fair amount of inertia to <em><strong>just get started</strong></em>. This prolongs the outage and creates unnecessary MTTR growth.</p><p>I feel like a particular mentor of mine, Ray, would&apos;ve smacked me in the back of the head if I didn&apos;t start tracing &#x2013; once I&apos;ve absolved the demarcs of guilt. He was a <strong>huge</strong> advocate of &quot;Knowing the Flow&quot;. He was so right. So much can be found if you just... look.</p><p>He didn&apos;t care how I did it, as long as I knew all the potential paths of a particular flow &#x2013; or sets of flows, if the application has multiple streams. Leave no hop unchecked. Leave no logs unread. At least until you&apos;ve found the problem.</p><p>This really mattered in our environment. We deployed a lot of stateful firewalls with ACLs applied ingress on every interface; If a rule was missing, you really needed to consider where a flow would enter an interface. Although the firewall should&apos;ve allowed the packets to flow in the return path, by being considered &quot;related&quot;, sometimes there was issues. You had to be thorough.</p><h3 id="how-we-can-be-many-places-at-once">How We Can Be Many Places At Once</h3><p>I do understand the inertia. In a very widespread WAN environment &#x2013; or a DC environment &#x2013; it can seem that doing something as simple as logging into each node in the path, checking it&apos;s next hop in the FIB, and logging into those boxes poses a problem:</p><ul><li>Each box could have several diverse paths to the ultimate destination.</li><li>Each of those diverse paths nodes could also have several diverse paths to the destination, causing the tree to grow exponentially.</li><li>In an evironment where you have access controls, such as an one-time-password fob, it could seem like a very daunting &#x2013; also time consuming &#x2013; &#xA0;task to login to 30 or 40 routers.</li></ul><p>In the BGP-does-everything era, many people in modern DCs/Cloud environments know that BGP tables can give verbose information about why routes are selected, who they learned it from and where it originated from. Thus, it&apos;s not too hard to trace things down. <br><br>But what about in ISP environments, where we often rely on IGPs like OSPF &amp; IS-IS? Well, those protocols also keep databases. Just like Google Maps, or the Kwisatz Haderach of Dune, you can search through the state &amp; details of many links to trace out your network from practically anywhere.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2023/01/paul.png" class="kg-image" alt loading="lazy" width="901" height="753" srcset="https://zealnetworks.ca/content/images/size/w600/2023/01/paul.png 600w, https://zealnetworks.ca/content/images/2023/01/paul.png 901w"><figcaption>Kwisatz Haderach, the one who can be many places at once</figcaption></figure><h3 id="what-do-the-routers-know">What Do The Routers Know</h3><p>IS-IS, being a Link-State Protocol, is very powerful. It advertises Link-State information via TLVs (type, length, value). Some very useful <a href="https://www.iana.org/assignments/isis-tlv-codepoints/isis-tlv-codepoints.xhtml">TLVs</a> are:</p><ul><li>Type 135 - Extended IP Reachability (Prefixes the Router can reach directly)</li><li>Type 132 - IP Interface Address (Essentially IPv4 Router-ID)</li><li>Type 137 - Dynamic Name (Hostname of Router)</li><li>Type 22 - Extended IS reachability (Adjacencies)</li></ul><p>That&apos;s a lot of information to query from. More than enough to make sense of a traceroute, dynamically map out a network, or even keep track of topology changes. </p><h3 id="get-your-spice-coffee-ready-for-this-one">Get Your Spice Coffee Ready For This One</h3><p>Let&apos;s see if we can utilize these elements to trace from two routers. Let&apos;s say a customer of ours reports an issue from one site to another. They tell us the name of the first site, as it&apos;s their head-office. As for the other site, they are vague on details. They simply provide source &amp; destination prefixes for us to work out.</p><p>We know the site they mentioned is connected to R1. We determine that the prefix is being learned via BGP neighbour <code>203.0.113.210</code> . &#xA0;We check our IS-IS topology to find out who that is:</p><pre><code>RP/0/0/CPU0:R1#show isis topology detail | i 203.0.113.210

R10 (203.0.113.210) [ucast 50 mcast &lt;infinity&gt;]
RP/0/0/CPU0:R1#</code></pre><p> Now we check our next-hop towards R10:</p><pre><code>RP/0/0/CPU0:R1#show ip route 203.0.113.210 | i &quot;entry|via&quot;

Routing entry for 203.0.113.210/32
  Known via &quot;isis zeal&quot;, distance 115, metric 60, type level-2
    203.0.113.1, from 203.0.113.210, via GigabitEthernet0/0/0/0
RP/0/0/CPU0:R1#
RP/0/0/CPU0:R1#show isis adjacency | i 0/0/0/0

R2             Gi0/0/0/0        *PtoP*         Up    29   03:15:45 No  None None
RP/0/0/CPU0:R1#
</code></pre><p>Thank you very much, TLVs 137 &amp; 132. </p><p>We now know this much about the topology:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2023/01/Trace_Lab_pt1.png" class="kg-image" alt loading="lazy" width="1078" height="765" srcset="https://zealnetworks.ca/content/images/size/w600/2023/01/Trace_Lab_pt1.png 600w, https://zealnetworks.ca/content/images/size/w1000/2023/01/Trace_Lab_pt1.png 1000w, https://zealnetworks.ca/content/images/2023/01/Trace_Lab_pt1.png 1078w"></figure><p>Okay, so we said we won&apos;t login to any other router, right? So what do we do? We can utilize traceroute. Let&apos;s give that a try. </p><p>But before we do, there&apos;s something missing from my lab.</p><h3 id="lab-setup">Lab Setup</h3><p>As I mentioned in a <a href="https://zealnetworks.ca/vyos-1-4-rolling-isis-sr-support/">previous post</a>, I would be utilizing VyOS from now on as my P routers in my lab cores. This is because they&apos;re quicker to boot, maintain, and they support ECMP.... but with a catch.</p><p>When I first did my tests I found that ECMP in VyOS, by default, was only hashing on the L3 tuples of Src &amp; Dst IP ..... </p><pre><code>RP/0/0/CPU0:R1#traceroute 203.0.113.210                   


Type escape sequence to abort.
Tracing the route to 203.0.113.210

 1  203.0.113.1 0 msec  0 msec  0 msec 
 2  203.0.113.3 0 msec  0 msec  0 msec 
 3  203.0.113.7 0 msec  0 msec  0 msec 
 4  203.0.113.17 0 msec  0 msec  0 msec 
 5  203.0.113.210 0 msec  0 msec  0 msec 
RP/0/0/CPU0:R1#
RP/0/0/CPU0:R1#traceroute 203.0.113.210                   


Type escape sequence to abort.
Tracing the route to 203.0.113.210

 1  203.0.113.1 0 msec  0 msec  0 msec 
 2  203.0.113.3 0 msec  0 msec  0 msec 
 3  203.0.113.7 0 msec  0 msec  0 msec 
 4  203.0.113.17 0 msec  0 msec  0 msec 
 5  203.0.113.210 0 msec  0 msec  0 msec 
RP/0/0/CPU0:R1#
RP/0/0/CPU0:R1#traceroute 203.0.113.210                   


Type escape sequence to abort.
Tracing the route to 203.0.113.210

 1  203.0.113.1 0 msec  0 msec  0 msec 
 2  203.0.113.3 0 msec  0 msec  0 msec 
 3  203.0.113.7 0 msec  0 msec  0 msec 
 4  203.0.113.17 0 msec  0 msec  0 msec 
 5  203.0.113.210 0 msec  0 msec  0 msec 
RP/0/0/CPU0:R1#</code></pre><p>I confirmed this by adding 15 extra Loopbacks &amp; sourcing my traces from those interfaces. </p><pre><code>RP/0/0/CPU0:R1#show ip int br | i Lo  

Loopback0                      203.0.113.201   Up              Up       default 
Loopback230                    203.0.113.230   Up              Up       default 
Loopback231                    203.0.113.231   Up              Up       default 
Loopback232                    203.0.113.232   Up              Up       default 
Loopback233                    203.0.113.233   Up              Up       default 
Loopback234                    203.0.113.234   Up              Up       default 
Loopback235                    203.0.113.235   Up              Up       default 
Loopback236                    203.0.113.236   Up              Up       default 
Loopback237                    203.0.113.237   Up              Up       default 
Loopback238                    203.0.113.238   Up              Up       default 
Loopback239                    203.0.113.239   Up              Up       default 
Loopback240                    203.0.113.240   Up              Up       default 
Loopback241                    203.0.113.241   Up              Up       default 
Loopback242                    203.0.113.242   Up              Up       default 
Loopback243                    203.0.113.243   Up              Up       default 
Loopback244                    203.0.113.244   Up              Up       default 
Loopback245                    203.0.113.245   Up              Up       default 
RP/0/0/CPU0:R1#</code></pre><p>That gave me the randomnesss I needed to sniff out that it was <em>indeed</em> using only those two tuples. As every probe, no matter how many, always hit the same hop... but each source IP revealed a new hop.</p><p>This is due to the default behaviour of the Linux kernel, as you can see in this great write-up <a href="https://codecave.cc/multipath-routing-in-linux-part-2.html">here</a>.</p><p>To summarize the fowarding behaviour:</p><blockquote>for forwarded IPv4 packets (L3 hash){ Source Address, Destination Address }<br><br>for locally generated IPv4 packets (L4 hash) <a href="https://codecave.cc/multipath-routing-in-linux-part-2.html#f2">[3]</a>{ Source Address, Destination Address, Protocol, Source Port, Destination Port }<br><br>However, with recently released Linux v4.12 selection of fields has changed a bit for IPv4 <a href="https://codecave.cc/multipath-routing-in-linux-part-2.html#f3">[4]</a>. An L3 hash is used by default for both forwarded and locally generated traffic, but the user can choose to use the L4 hash, in both forward and local output path, with a new sysctl - net.ipv4.fib_multipath_hash_policy.<br></blockquote><p>Since we are generating the traffic from our IOS-XR box, the VyOS routers in the middle are just forwarding with the L3 Hash. We need to enable the L4-hash for forwarding. In VyOS, this can be enabled using the following commands:</p><pre><code>kazaii@R2# set system ip multipath 
Possible completions:
   ignore-unreachable-nexthops
                        Ignore next hops that are not in the ARP table
   layer4-hashing       Use layer 4 information for ECMP hashing

      
[edit]
kazaii@R2#
kazaii@R2# set system ip multipath layer4-hashing 
[edit]
kazaii@R2# commit;save;exit
Saving configuration to &apos;/config/config.boot&apos;...
Done
exit
kazaii@R2:~$ </code></pre><p>After that, ECMP hashing was now enabled for at least 5 tuples.... allowing Traceroute to sniff out the multiple hops. </p><h3 id="how-does-traceroute-work-again">How Does Traceroute Work Again?</h3><p>If you find yourself scratching your head as to why the above mattered to Traceroute, and why the probes hit the same hop every time, you might want to review my favourite slide deck on how Traceroute <a href="https://archive.nanog.org/sites/default/files/10_Roisman_Traceroute.pdf">works</a>.</p><p>But I&apos;ll summarize the most relevant parts:</p><ul><li>Traceroute works by sending probes to find the various hops in a path</li><li>It does this by incrementing the TTL by 1. When router forwards a packet, it decrements the TTL by 1 and sends it on. When TTL reaches 0, an ICMP TTL-Exceeded message is generated and sent back to the source.</li><li>The source measures the delta between the receiving of that message against the sending of the probe to measure the round-trip-time to the hop.</li><li>It also records the source IP of the Router that sent the message to be the presumed hop.</li><li>It often sends 3 probes by default, in many implementations</li><li>To encourage routers to hash / load-share the probes across multiple paths, it often utilizes UDP &amp; increments the UDP destination port for each probe.</li><li>Each probe is it&apos;s <em>own individual test. </em>No probe traces a complete path by itself &#x2013; causing rather confusing results, sometimes known as the <a href="https://paris-traceroute.net/">Paris Traceroute</a> problem.</li></ul><p>When you consider the above... even if the many hops in the network consider each probe a separate flow.... they are only hashing based on source &amp; destination IP only. They do not care that each probe has a different UDP port...</p><pre><code>RP/0/0/CPU0:R1#traceroute 203.0.113.210 minttl 4 maxttl 4 probe 20

Type escape sequence to abort.
Tracing the route to 203.0.113.210

 4  &lt;snipped out for spoiler&gt;
RP/0/0/CPU0:R1#  </code></pre><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2023/01/traceroute_increment.png" class="kg-image" alt loading="lazy" width="1022" height="663" srcset="https://zealnetworks.ca/content/images/size/w600/2023/01/traceroute_increment.png 600w, https://zealnetworks.ca/content/images/size/w1000/2023/01/traceroute_increment.png 1000w, https://zealnetworks.ca/content/images/2023/01/traceroute_increment.png 1022w"><figcaption>As you can see above, we sent 20 probes. The destination port (on the far right) of each UDP datagram is incremented, for each probe.</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2023/01/TTL_set_4.png" class="kg-image" alt loading="lazy" width="1231" height="851" srcset="https://zealnetworks.ca/content/images/size/w600/2023/01/TTL_set_4.png 600w, https://zealnetworks.ca/content/images/size/w1000/2023/01/TTL_set_4.png 1000w, https://zealnetworks.ca/content/images/2023/01/TTL_set_4.png 1231w" sizes="(min-width: 1200px) 1200px"><figcaption>And the TTL (TTL is set to 4 in the IP header).</figcaption></figure><p>Now that it&apos;s fixed, we can setup a test method that would test each hop of the network and ensure we sniff out as many links as we could imagine.</p><h3 id="parsing-method">Parsing Method</h3><p>Okay. So we can sniff out every end-point, at every particular hop in the network. How do we query the Link-State Database to determine what routers that goes through or to? </p><p>Well, we can utilize our Loopbacks as an example of what IP Prefixes &amp; Hostnames look like in the LSDB (without spoiling what&apos;s to come):</p><pre><code>RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|IP-Ext&quot; | utility head -n 10

  Hostname:       R1
  Metric: 10         IP-Extended 203.0.113.0/31
  Metric: 0          IP-Extended 203.0.113.201/32
  Metric: 0          IP-Extended 203.0.113.230/32
  Metric: 0          IP-Extended 203.0.113.231/32
  Metric: 0          IP-Extended 203.0.113.232/32
  Metric: 0          IP-Extended 203.0.113.233/32
  Metric: 0          IP-Extended 203.0.113.234/32
  Metric: 0          IP-Extended 203.0.113.235/32
  Metric: 0          IP-Extended 203.0.113.236/32
RP/0/0/CPU0:R1#</code></pre><p>Utilizing data like that, we can go a bit further and use the following command to find the exact IS&apos;s are attached to a prefix:</p><p><code>show isis database detail | i &quot;Host|&lt;Prefix&gt;&quot; | utility egrep -B1 &quot;Ext&quot;</code></p><p>With the above command, we will do the following: We will Pipe Include on the following patterns: <strong>Host, Prefix. </strong>We will then parse the results bit further with the <code>egrep -B1 &quot;Ext&quot;</code> , as egrep will show us the pattern that is 1 line before, due to the <code>-B1</code> argument.</p><p>Since each Prefix is under the LSP entry of each router, the next line will always be the Hostname of the router that advertised it. Let me show the above example, if I match directly on 203.0.113.235/32</p><pre><code>RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.235/32&quot; | utility$

  Hostname:       R1
  Metric: 0          IP-Extended 203.0.113.235/32
RP/0/0/CPU0:R1#s</code></pre><p>Thank you TLV 135. Thank you extended grep.</p><h3 id="on-with-it">On With It</h3><p>So first let&apos;s sniff out Hop 4, since we know from the first trace that we reached R10 in 5 hops.</p><pre><code>RP/0/0/CPU0:R1#traceroute 203.0.113.210 minttl 4 maxttl 4 probe 20


Type escape sequence to abort.
Tracing the route to 203.0.113.210

 4  203.0.113.23 9 msec 
    203.0.113.27 0 msec 
    203.0.113.21 0 msec 
    203.0.113.23 0 msec 
    203.0.113.27 0 msec  0 msec 
    203.0.113.23 0 msec  *  0 msec 
    203.0.113.27 0 msec 
    203.0.113.23 0 msec 
    203.0.113.21 0 msec  * 
    203.0.113.27 0 msec 
    203.0.113.17 0 msec 
    203.0.113.23 0 msec 
    203.0.113.17 0 msec 
    203.0.113.23 0 msec 
    203.0.113.21 0 msec  * 
RP/0/0/CPU0:R1#</code></pre><p>It hit the following addresses:</p><ul><li>203.0.113.23</li><li>203.0.113.27</li><li>203.0.113.21</li><li>203.0.113.17</li></ul><p>Let&apos;s look those up:</p><pre><code>RP/0/0/CPU0:R1#show ip route 203.0.113.23 | i entry

Routing entry for 203.0.113.22/31
RP/0/0/CPU0:R1#show ip route 203.0.113.27 | i entry

Routing entry for 203.0.113.26/31
RP/0/0/CPU0:R1#show ip route 203.0.113.21 | i entry

Routing entry for 203.0.113.20/31
RP/0/0/CPU0:R1#show ip route 203.0.113.17 | i entry

Routing entry for 203.0.113.16/31
RP/0/0/CPU0:R1#

RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.22/31&quot; | utility $

  Hostname:       R6
  Metric: 10         IP-Extended 203.0.113.22/31
--
  Hostname:       R9
  Metric: 10         IP-Extended 203.0.113.22/31
RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.26/31&quot; | utility $

  Hostname:       R7
  Metric: 10         IP-Extended 203.0.113.26/31
--
  Hostname:       R9
  Metric: 10         IP-Extended 203.0.113.26/31
RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.20/31&quot; | utility $

  Hostname:       R6
  Metric: 10         IP-Extended 203.0.113.20/31
--
  Hostname:       R8
  Metric: 10         IP-Extended 203.0.113.20/31
RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.16/31&quot; | utility $

  Hostname:       R5
  Metric: 10         IP-Extended 203.0.113.16/31
--
  Hostname:       R8
  Metric: 10         IP-Extended 203.0.113.16/31
RP/0/0/CPU0:R1#</code></pre><p>Wow, that&apos;s a lot of data to process. But, if we consider what we already know.... The Z-end, which is Hop 5, is R10. So what&apos;s connected to R10 ? </p><p>We can query the adjacencies advertised into our LSDB to determine that. We will tweak our command above to be <code>IS-Ext</code> , instead of <code>IP-Ext</code> ... we will also limit our results to the LSP ID of R10. This always ends in <code>.00-00</code> in most networks... but if you forget this, you can wildcard it:</p><p><code>show isis database detail &lt;hostname&gt;.* | i &quot;&lt;hostname&gt;|IS-Ext&quot;</code></p><pre><code>RP/0/0/CPU0:R1#show isis database detail R10.* | i &quot;R10|IS-Ext&quot; 

R10.00-00             0x00000019   0x6096        902             0/0/0
  Hostname:       R10
  Metric: 10         IS-Extended R8.00
  Metric: 10         IS-Extended R9.00
RP/0/0/CPU0:R1#
</code></pre><p>So it&apos;s R8 &amp; R9 that&apos;s directly connected to R10. With that information, along with the prefixes we sniffed out above... we can start mapping things out. </p><p>Thank you TLV 22.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2023/01/Trace_Lab_pt2.png" class="kg-image" alt loading="lazy" width="1078" height="720" srcset="https://zealnetworks.ca/content/images/size/w600/2023/01/Trace_Lab_pt2.png 600w, https://zealnetworks.ca/content/images/size/w1000/2023/01/Trace_Lab_pt2.png 1000w, https://zealnetworks.ca/content/images/2023/01/Trace_Lab_pt2.png 1078w"></figure><p>We&apos;re getting pretty close. Let&apos;s trace Hop 3:</p><pre><code>RP/0/0/CPU0:R1#traceroute 203.0.113.210 minttl 3 maxttl 3 probe 20


Type escape sequence to abort.
Tracing the route to 203.0.113.210

 3  203.0.113.15 0 msec 
    203.0.113.11 0 msec 
    203.0.113.9 0 msec  0 msec 
    203.0.113.13 0 msec 
    203.0.113.15 0 msec  0 msec  0 msec  0 msec 
    203.0.113.7 0 msec  * 
    203.0.113.9 0 msec 
    203.0.113.11 0 msec 
    203.0.113.13 0 msec 
    203.0.113.7 0 msec  0 msec 
    203.0.113.11 0 msec 
    203.0.113.13 0 msec 
    203.0.113.7 0 msec 
    203.0.113.15 0 msec 
RP/0/0/CPU0:R1#</code></pre><p>That one was even more wild. It hit the following addresses:</p><ul><li>203.0.113.15</li><li>203.0.113.11</li><li>203.0.113.9</li><li>203.0.113.13</li><li>203.0.113.7</li></ul><p>Let&apos;s look them up:</p><pre><code>P/0/0/CPU0:R1#show ip route 203.0.113.15 | i entry

Routing entry for 203.0.113.14/31
RP/0/0/CPU0:R1#show ip route 203.0.113.11 | i entry

Routing entry for 203.0.113.10/31
RP/0/0/CPU0:R1#show ip route 203.0.113.9 | i entry 

Routing entry for 203.0.113.8/31
RP/0/0/CPU0:R1#show ip route 203.0.113.13 | i entry

Routing entry for 203.0.113.12/31
RP/0/0/CPU0:R1#show ip route 203.0.113.7 | i entry 

Routing entry for 203.0.113.6/31
RP/0/0/CPU0:R1#

RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.14/31&quot; | utility $

  Hostname:       R4
  Metric: 10         IP-Extended 203.0.113.14/31
--
  Hostname:       R7
  Metric: 10         IP-Extended 203.0.113.14/31
RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.10/31&quot; | utility $

  Hostname:       R3
  Metric: 10         IP-Extended 203.0.113.10/31
--
  Hostname:       R7
  Metric: 10         IP-Extended 203.0.113.10/31
RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.8/31&quot; | utility e$

  Hostname:       R3
  Metric: 10         IP-Extended 203.0.113.8/31
--
  Hostname:       R6
  Metric: 10         IP-Extended 203.0.113.8/31
RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.12/31&quot; | utility $

  Hostname:       R4
  Metric: 10         IP-Extended 203.0.113.12/31
--
  Hostname:       R6
  Metric: 10         IP-Extended 203.0.113.12/31
RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.6/31&quot; | utility e$

  Hostname:       R3
  Metric: 10         IP-Extended 203.0.113.6/31
--
  Hostname:       R5
  Metric: 10         IP-Extended 203.0.113.6/31
RP/0/0/CPU0:R1#</code></pre><p>Once again, we take the routers we already know... and add the routers in our trace to those. Here&apos;s what it looks like now:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2023/01/Trace_Lab_pt3.png" class="kg-image" alt loading="lazy" width="1078" height="581" srcset="https://zealnetworks.ca/content/images/size/w600/2023/01/Trace_Lab_pt3.png 600w, https://zealnetworks.ca/content/images/size/w1000/2023/01/Trace_Lab_pt3.png 1000w, https://zealnetworks.ca/content/images/2023/01/Trace_Lab_pt3.png 1078w"></figure><p>One more hop to go. Let&apos;s look at Hop 2:</p><pre><code>RP/0/0/CPU0:R1#traceroute 203.0.113.210 minttl 2 maxttl 2 probe 20 

Type escape sequence to abort.
Tracing the route to 203.0.113.210

 2  203.0.113.3 0 msec 
    203.0.113.5 0 msec  0 msec  0 msec  0 msec 
    203.0.113.3 0 msec 
    203.0.113.5 0 msec 
    203.0.113.3 0 msec  0 msec  0 msec  0 msec  *  0 msec  0 msec 
    203.0.113.5 0 msec 
    203.0.113.3 0 msec 
    203.0.113.5 0 msec  * 
    203.0.113.3 0 msec  0 msec 
RP/0/0/CPU0:R1#</code></pre><p>It hit the following addresses:</p><ul><li>203.0.113.3</li><li>203.0.113.5</li></ul><p>Let&apos;s see who those belong to:</p><pre><code>RP/0/0/CPU0:R1#show ip route 203.0.113.3 | i entry

Routing entry for 203.0.113.2/31
RP/0/0/CPU0:R1#show ip route 203.0.113.5 | i entry

Routing entry for 203.0.113.4/31
RP/0/0/CPU0:R1#

RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.2/31&quot; | utility e$

  Hostname:       R2
  Metric: 10         IP-Extended 203.0.113.2/31
--
  Hostname:       R3
  Metric: 10         IP-Extended 203.0.113.2/31
RP/0/0/CPU0:R1#show isis database detail | i &quot;Host|203.0.113.4/31&quot; | utility e$

  Hostname:       R2
  Metric: 10         IP-Extended 203.0.113.4/31
--
  Hostname:       R4
  Metric: 10         IP-Extended 203.0.113.4/31
RP/0/0/CPU0:R1#</code></pre><p>Well, those are connected to our known first-hop, R2. </p><p>Thus the trace produced this topology:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2023/01/Trace_Lab_pt4.png" class="kg-image" alt loading="lazy" width="1078" height="581" srcset="https://zealnetworks.ca/content/images/size/w600/2023/01/Trace_Lab_pt4.png 600w, https://zealnetworks.ca/content/images/size/w1000/2023/01/Trace_Lab_pt4.png 1000w, https://zealnetworks.ca/content/images/2023/01/Trace_Lab_pt4.png 1078w"></figure><p>Revealing the topology I built in GNS3:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2023/01/topology_trace_lsdb.png" class="kg-image" alt loading="lazy" width="1157" height="568" srcset="https://zealnetworks.ca/content/images/size/w600/2023/01/topology_trace_lsdb.png 600w, https://zealnetworks.ca/content/images/size/w1000/2023/01/topology_trace_lsdb.png 1000w, https://zealnetworks.ca/content/images/2023/01/topology_trace_lsdb.png 1157w"></figure><p>A very smart cookie would point out that our diagram is missing two links in the topology... the ones between R6 &amp; R7/R5. </p><p>The reason being is that Traceroute is determining the paths that would be taken from Source to Destination.... and those particular paths are one hope too many to be sniffed out. 6 hops to be exact, if you use your fingers to trace from R1 -&gt; R2 -&gt; R3 -&gt; R5 -&gt; R6 -&gt; R9 -&gt; R10.</p><p>This would be true if there were 200+ routers in your topology. You are utilizing a method that will trace out your path, not the entire WAN diagram, as that&apos;s what you&apos;re looking for anyway.</p><p>If our task was different, and we were trying to map out R6&apos;s adjacencies &#x2013; say, if we were about to set our overload bit, and remove it from the path &#x2013; &#xA0;we could query it&apos;s LSP for IS-Extended reachability, to reveal those links:</p><pre><code>RP/0/0/CPU0:R1#show isis database detail R6.* | i &quot;Host|IS-Ext&quot;  

  Hostname:       R6
  Metric: 10         IS-Extended R7.00 &lt;----
  Metric: 10         IS-Extended R8.00 
  Metric: 10         IS-Extended R5.00 &lt;----
  Metric: 10         IS-Extended R3.00
  Metric: 10         IS-Extended R4.00
  Metric: 10         IS-Extended R9.00
RP/0/0/CPU0:R1#</code></pre><h3 id="now-what">Now What?</h3><p>Now that you know the path the packets will walk, you can start your tests. </p><ul><li>Perhaps use a packet-generator to to determine at which point the point the flow fails. </li><li>You can capture on tap points on these links, if possible, to determine where the problem occurs.</li><li>After seeing the topology, you may already know there is a common-point for other queries. It could be R6, which is the most touched router in this flow. Or up-to half of flows go through R9, and a customer directly connected to that router is also reporting recent issues.</li><li>Now that you demystified the path, it might seem less daunting to login to these routers and do the necessary checks. You might find a Line Card that has reached it&apos;s scale limit and has been screaming for days-on-end in the logs.</li></ul><h3 id="some-closing-notes">Some Closing Notes</h3><p>If the customer didn&apos;t tell you the A-End, you could&apos;ve checked the VPN route-reflector to get R1&apos;s Loopback IP as your recursive next-hop. Then you could&apos;ve queried that in the LSDB.</p><p>Of course, this example won&apos;t always apply 1:1. Maybe traceroute dies before you reach the LB address. Maybe TTL propagation is disabled to hide the core from traces. It still doesn&apos;t stop you from utilizing the costs to calculate the paths yourself. You could also utilize my <a href="https://zealnetworks.ca/without-a-trace/">other example</a> to trace it the good old fashioned way.</p><h3 id="do-not-ponder-weak-and-weary">Do Not Ponder, Weak and Weary</h3><p>Ray was right all along. It&apos;s great &amp; all to know all the nerd knobs of adjacencies, MTU padding, authentication, timers, BFD, TI-LFA, etc. ad-naseum. But when it comes right down to the wire, and you&apos;re looking for tangible data, it&apos;s even better to know what ol&apos; Dijkstra produced for your particular graph. What the deck of your BGP tables delivered to your hand.<br> <br>The more your trace your network, the better you know it. The faster you get. The more sure you are of your results. Do it whenever you can. <br><br><strong>Know the Flow. <em>Just get started.</em></strong></p><p>Thanks, Ray. </p>]]></content:encoded></item><item><title><![CDATA[To be, or not to be, a CCIE]]></title><description><![CDATA[<p>In my career<em>, </em>like many others, I find myself in a state of constant studying &amp; learning. In the same vein, the one thing I&apos;ve been flip-flopping about is getting certified as a <a href="https://www.cisco.com/c/en/us/training-events/training-certifications/certifications/expert.html">CCIE</a> / <a href="https://www.juniper.net/us/en/training/certification/tracks/service-provider-routing-switching/jncie-sp.html?saml_request_path=%2Fcontent%2Fjuniper%2Fus%2Fen%2Ftraining%2Fcertification%2Ftracks%2Fservice-provider-routing-switching%2Fjncie-sp.html">JNCIE</a> for my efforts. </p><h3 id="when-i-was-a-wee-sprout">When I was a wee sprout </h3><p><br>Early in my career,</p>]]></description><link>https://zealnetworks.ca/to-be-or-not-to-be/</link><guid isPermaLink="false">63c48aca8f2fdf0001955c1b</guid><category><![CDATA[certification]]></category><category><![CDATA[opinion]]></category><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Mon, 16 Jan 2023 01:18:54 GMT</pubDate><content:encoded><![CDATA[<p>In my career<em>, </em>like many others, I find myself in a state of constant studying &amp; learning. In the same vein, the one thing I&apos;ve been flip-flopping about is getting certified as a <a href="https://www.cisco.com/c/en/us/training-events/training-certifications/certifications/expert.html">CCIE</a> / <a href="https://www.juniper.net/us/en/training/certification/tracks/service-provider-routing-switching/jncie-sp.html?saml_request_path=%2Fcontent%2Fjuniper%2Fus%2Fen%2Ftraining%2Fcertification%2Ftracks%2Fservice-provider-routing-switching%2Fjncie-sp.html">JNCIE</a> for my efforts. </p><h3 id="when-i-was-a-wee-sprout">When I was a wee sprout </h3><p><br>Early in my career, in my first legitimate &quot;Network&quot; role, I witnessed a dear colleague achieve his CCIE. I could see him work hard at his goal, and the immense satisfaction passing gave him. Not only that, it seemed that his studies opened him up to many things I had never heard of in college. Things such as GNS3 (when it was still a dynamips-only beta), Unetlab, MPLS, etc. etc.... things I didn&apos;t see in my day to day at the small company we worked for.</p><p>He then moved on to work in a <em>&apos;real&apos;</em> Network team at a <em>big financial firm</em>. It set-off the bug in my head that perhaps certification was the real deal, and I should give it a go.<br><br>I&apos;m so happy I did. After studying for many hours and many days, I got my CCNA &#x2013; soon to be followed by my CCNP. That certification on my resume, along with the exposure it gave me, definitely helped me to land &amp; pass the technical interview I got for my first NOC role at a large Datacentre / MSP org. </p><h3 id="epiphany">Epiphany</h3><p>As I continued my studies and certification journey, I quickly realized that is was the journey, not the destination, that <strong>really</strong> made the impact. Knowing the outline of CCNP, and reading up on it&apos;s various applications, helped me to understand the world outside of my current perview. It didn&apos;t mean that EIGRP &amp; DMVPN were best &#x2013; because I was now familiar with them, and familiar <em>feels best &#x2013; </em>they were simply a tool in the toolbet, to be drawn upon, should the requirements deem fitting, or simply dictate.</p><p>It also was the fact that I put in the hours at the terminal, demystifying that arbitary domain-specific-language that Cisco &amp; others implemented. This was better put towards getting my hands dirty at work, rather than prepping for a test. </p><p>After landing a position at a major nation-wide Telco, by circumstance of acquisition, I decided I would up my skills by not getting a CCIE, but by using CCIE&apos;s outline as a guideline for my studying. Time proved this method effective for me.</p><p>I also soon discovered that CCIE outlines were also a bit dated for the more emerging technologies I was working on, in a competitive Telco. In fact, it seemed that CCIE was somewhere between 2-5 years behind what we&apos;re pushing ahead today; Furthermore, when CCIE does ultimately catch up, it&apos;s rather <em>shallow</em> in it&apos;s exploration of new topics &#x2013; Segment Routing comes to mind, as an example. This likely comes from Cisco&apos;s uncertainty in what products &amp; implementations will actually take hold of the industry, and which ones will flop &#x2013; as so many implementations do!</p><h3 id="source-of-contention">Source of Contention</h3><p>Now I find myself at a different crossroad; I&apos;d like to strengthen my paper portfolio (CV), along with my knowledge. The reason being is that I&apos;d like to potentially leave this continent &amp; move to Europe, for personal reasons.</p><p>I&apos;d wager that a littled amplified &apos;Alphabet soup&apos; would help me stand out in the crowd, especially in foreign lands. Perhaps there are other unconsidered benefits from the actualization of the full path as well.</p><p>Sadly, there are some negative associations I have with CCIE. The first one being is that I, and countless others, have encountered so many &quot;Paper CCIEs&quot;. People who purportedly have &#x2013; or had &#x2013; the knowledge to pass the outline of CCIE, at the time of their certification. Yet, when it comes time to do the work, they can&apos;t troubleshoot their way out of a wet paper bag. &#xA0;Even on the very protocols they seemingly had to &apos;master&apos; to pass the troubleshooting portion of their certification.<br><br>I have many theories as to how this happens, but the simple explanation &#x2013; that isn&apos;t malicious or nefarious in nature, anyway &#x2013; is that a career in Networking is a Marathon, not a sprint. This can be clearly seen in some of my colleagues I&apos;ve had. </p><p>I&apos;ve met those that are old CCIE&apos;s, new CCIE&apos;s, Poly *IE&apos;s, etc. etc. The defining factor in their knowledge doesn&apos;t seem to be specifically the certification journey, but an extensive or intense career path; Were they a back-bencher or a minister of pushing packets? That seemed to always be the defining factor.</p><p>Thus, I ask myself &#x2013; yet again &#x2013; what the hell do I want this Cert for? Who do I want this for? It always seems to be not for me. But if it increases my chances to immigrate by, say, even 5% ? How badly do I want the end result of said immigration? Even if I know I&apos;m simply playing the HR Alphabet game.</p><h3 id="ccie-pros">CCIE Pros:</h3><ol><li>CCIE is universally recognized</li><li>Reviewing the outline today, I feel confident I can master the topics, especially in CCIE-SP track.</li><li>I&apos;d never have to think about this again.</li></ol><h3 id="ccie-cons">CCIE Cons:</h3><ol><li>There are too many CCIEs, and too many &apos;paper&apos; ones. Do technical managers even care? I know I wouldn&apos;t (But maybe the job market I am targetting does).</li><li>Many hours spent for what could be spent doing something I&apos;d consider exceptional, like contributing to projects I believe in &#x2013; such as FRR, VyOS &amp; DBIUA.</li><li>Money I could invest in my homelab, etc.</li></ol><h3 id="jncie-pros">JNCIE Pros:</h3><ol><li>Not many of these guys/gals/etc. out there.</li><li>Could demonstrate &amp; vastly expand my Juniper knowledge &#x2013; I&apos;d consider myself intermediate today</li><li>I like their plaque better than the CCIE one</li></ol><h3 id="jncie-cons">JNCIE Cons:</h3><ol><li>One must complete the whole track &#x2013; from JNCIA to JNCIP &#x2013; taking more time &amp; money.</li><li>There seems to be more resources from the vendor, but less resources out there on the interwebz. I&apos;d have to search for the tribe.</li><li>I am very annoyed by this one, but Juniper <em>silently</em> removed the vMX trial license. Meaning my 17.2 R2 image is the best I&apos;ll get. That&apos;s too old of an image for the JNCIE-SP track. I could grovel through my companies vendor relationship, but I&apos;d rather not. They should take <a href="https://www.juniper.net/us/en/dm/vmx-trial-download.html">this</a> page down</li></ol><h3 id="conclusion">Conclusion</h3><p>I am simply writing what I&apos;m thinking. This could all be summarized as &quot;Maybe&quot;. If I do decide to pursue this track, I will report back &amp; hold myself accountable to my very small &#x2013; maybe non-existent &#x2013; readership.<br><br>I will say that I have great respect for many *IE&apos;s:<br><br>Russ White (who was CCAr as well), Ivan Pepelnjak, Packet Pushers Crew, countless co-workers, and the most technically talented person I&apos;ve personally worked with, Randy &#x2013; who let his JNCIE expire, if that says anything. </p><p>I also witnessed a valued member of the r/networking community be awarded his JNCIE recently. I can definitely say that the plaque is very nice. <br><br>There are plenty others who did not pursue certification that I consider industry experts, Jeremy Stretch being the most notable.<br><br>One thing is for certain.... Certification is not the reason I grew to respect those individuals. So I wouldn&apos;t expect anyone to respect me any more, should I get mine. </p>]]></content:encoded></item><item><title><![CDATA[End of the Year Article Share]]></title><description><![CDATA[<p>As this year comes to a close, I&apos;d like to end on the alternative of a &quot;Blog Roll&quot;. I&apos;d like to share some of the blogs I&apos;ve read that I found interesting. I&apos;ve found most of these through my RSS</p>]]></description><link>https://zealnetworks.ca/end-of-the-year-blog-share/</link><guid isPermaLink="false">63b0bf6327c3b70001373c62</guid><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Sat, 31 Dec 2022 23:16:24 GMT</pubDate><content:encoded><![CDATA[<p>As this year comes to a close, I&apos;d like to end on the alternative of a &quot;Blog Roll&quot;. I&apos;d like to share some of the blogs I&apos;ve read that I found interesting. I&apos;ve found most of these through my RSS feed and or Hacker News. <br><br>Russ White shares his weekly. I guess I&apos;ll share mine annually. The restriction is that the article was posted within the last year.... else this list will be exhausting.</p><h3 id="networking">Networking:</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://internetdynamics.substack.com/p/routing-will-never-be-a-solved-problem"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Routing Will Never Be A Solved Problem</div><div class="kg-bookmark-description">The Important There will never be perfect information There will always be an area of futzing to find optimization points across multiple competing objectives We are just beginning to dive into some areas of networking, so there is much discovery yet to happen</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/45cc090f-b938-4ef6-80af-bcd9e2ebdbe3/apple-touch-icon-1024x1024.png" alt><span class="kg-bookmark-author">Internet Dynamics</span><span class="kg-bookmark-publisher">Mark Seery</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://substackcdn.com/image/fetch/w_1200,h_600,c_limit,f_jpg,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12046ee-4fa9-434d-9cf2-fe21c5781cd8_1192x552.jpeg" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://rule11.tech/the-rules-of-network-design/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Russ&#x2019; Rules of Network Design</div><div class="kg-bookmark-description">We have the twelve truths of networking, and possibly Akin&#x2019;s Laws, but is there a set of rules for network design? I couldn&#x2019;t find one, so I decided to create one, containing 18 laws I&amp;&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i0.wp.com/rule11.tech/wp-content/uploads/cropped-rule11-logo-square.png?fit=192%2C192&amp;ssl=1" alt><span class="kg-bookmark-author">rule 11 reader</span><span class="kg-bookmark-publisher">author page</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i0.wp.com/rule11.tech/wp-content/uploads/cropped-rule11-logo-square.png?fit=512%2C512&amp;ssl=1" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://rule11.tech/mean-time-to-innocence-is-not-enough/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Mean Time to Innocence is not Enough</div><div class="kg-bookmark-description">A long time ago, I supported a wind speed detection system consisting of an impeller, a small electric generator, a 12 gauge cable running a few miles, and a voltmeter. The entire thing was calibra&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i0.wp.com/rule11.tech/wp-content/uploads/cropped-rule11-logo-square.png?fit=192%2C192&amp;ssl=1" alt><span class="kg-bookmark-author">rule 11 reader</span><span class="kg-bookmark-publisher">author page</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i0.wp.com/rule11.tech/wp-content/uploads/cropped-rule11-logo-square.png?fit=512%2C512&amp;ssl=1" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.potaroo.net/ispcol/2022-11/optics.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ISP Column - November 2022</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.potaroo.net/favicon.ico" alt><span class="kg-bookmark-author">November 2022</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.potaroo.net/images/pdf.png" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.ipspace.net/2022/05/living-small-forwarding-tables.html?utm_source=atom_feed"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Living with Small Forwarding Tables &#xAB; ipSpace.net blog</div><div class="kg-bookmark-description">A friend of mine working for a mid-sized networking vendor sent me an intriguing question: We have a product using an old ASIC that has 12K forwarding entries, and would like to extend its lifetime. I know you were mentioning some useful tricks, would you happen to remember what they were? This c&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.ipspace.net/v3/images/favicon.ico" alt><span class="kg-bookmark-author">ipSpace Logo</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.ipspace.net/v3/images/IP_Space_Logo.svg" alt></div></a></figure><h3 id="personal-development">Personal Development:</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.ipspace.net/2022/06/mount-stupid.html?utm_source=atom_feed"><div class="kg-bookmark-content"><div class="kg-bookmark-title">When You Find Yourself on Mount Stupid &#xAB; ipSpace.net blog</div><div class="kg-bookmark-description">The early October 2021 Facebook outage generated a predictable phenomenon &#x2013; couch epidemiologists became experts in little-known Bridging the Gap Protocol (BGP), including its Introvert and Extrovert variants. Unfortunately, I also witnessed several unexpected trips to Mount Stupid by people who sho&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.ipspace.net/v3/images/favicon.ico" alt><span class="kg-bookmark-author">ipSpace Logo</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.ipspace.net/v3/images/IP_Space_Logo.svg" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.nirandfar.com/examining-your-values/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#x2019;Tis the Season for Reexamining Your Values</div><div class="kg-bookmark-description">How will you spend your precious time in the coming year? As one year ends and another begins, many of us won&#x2019;t help but reflect on who we are and who we&#x2019;d like to become. Most people aiming to emulate their ideal selves will resort to New Year&#x2019;s resolutions&#x2014;but more often than not, those are doomed&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ik.imagekit.io/my0uw7ar7/wp-content/uploads/2021/08/apple-touch-icon.png" alt><span class="kg-bookmark-author">Nir and Far</span><span class="kg-bookmark-publisher">Nir Eyal</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://ik.imagekit.io/my0uw7ar7/wp-content/uploads/2022/12/reexamining-values-cover.png" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.nirandfar.com/productivity-mindset/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">4 Mental Traps That Kill Productivity</div><div class="kg-bookmark-description">Productivity has many enemies: too many meetings, external triggers like interruptions from coworkers, whether virtual or in person, and multitasking the wrong way, to name a few. But more often than not, it&#x2019;s mental traps that trip us up.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ik.imagekit.io/my0uw7ar7/wp-content/uploads/2021/08/apple-touch-icon.png" alt><span class="kg-bookmark-author">Nir and Far</span><span class="kg-bookmark-publisher">Nir Eyal</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://ik.imagekit.io/my0uw7ar7/wp-content/uploads/2022/12/productivity-mindset-cover-1080x675-1.png" alt></div></a></figure><h3 id="general">General:</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.potaroo.net/ispcol/2022-10/esafety.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ISP Column - October 2022</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.potaroo.net/favicon.ico" alt><span class="kg-bookmark-author">October 2022</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.potaroo.net/images/pdf.png" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://paulitaylor.com/2022/09/30/few-people-get-promoted-for-asking-difficult-questions/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Few People Get Promoted For Asking Difficult Questions</div><div class="kg-bookmark-description">Research&#xA0;indicates that even when everyone within a group recognizes who the subject matter expert is, they defer to that member just 62% of the time; when they don&#x2019;t, they listen to the&#xA0;most extro&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://paulitaylor.files.wordpress.com/2020/06/cropped-living-on-the-edge-844873.jpg?w=192" alt><span class="kg-bookmark-author">Paul Taylor</span><span class="kg-bookmark-publisher">the Rotters</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://paulitaylor.files.wordpress.com/2022/09/conversation-3425922_1920.jpg?w=1200" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://packetpushers.net/asking-meaningful-questions-what-problem-are-we-trying-to-solve/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Asking Meaningful Questions: What Problem Are We Trying To Solve? - Packet Pushers</div><div class="kg-bookmark-description">At some point in your career, you&#x2019;ll likely participate in a project that is a technical and implementation success but is still a failure. That&#x2019;s because the wrong solution was implemented. For example, after weeks or months of hard work you might successfully deploy a client-based VPN solution, bu&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://packetpushers.net/wp-content/uploads/2017/07/favicon-1.png" alt><span class="kg-bookmark-author">Packet Pushers</span><span class="kg-bookmark-publisher">Eyvonne Sharp</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://packetpushers.net/wp-content/uploads/2022/12/meaningfulquestions.jpg" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.jim-nielsen.com/2022/what-work-looks-like/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">What &#x201C;Work&#x201D; Looks Like</div><div class="kg-bookmark-description">Writing about the big beautiful mess that is making things for the world wide web.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.jim-nielsen.com/favicon.ico" alt><span class="kg-bookmark-author">Jim Nielsen&#x2019;s Blog Verified ($10/year for the domain)</span><span class="kg-bookmark-publisher">Jim Nielsen</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.jim-nielsen.com/assets/img/twitter-card.png" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://mxb.dev/blog/make-free-stuff/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Make Free Stuff</div><div class="kg-bookmark-description">On web3, Wordle and the radical concept of building things for free.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://mxb.dev/assets/images/favicon/apple-touch-icon.png?v=1" alt><span class="kg-bookmark-author">Max B&#xF6;ck</span><span class="kg-bookmark-publisher">Max B&#xF6;ck</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://mxb.dev/blog/make-free-stuff/cover.jpg" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://escapingtech.com/tech/opinions/i-was-wrong-about-mastodon-moderation.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">I Was Wrong About Mastodon &#x2013; EscapingTech</div><div class="kg-bookmark-description">I said that Mastodon moderation wouldn&#x2019;t scale, it does. The cultural differences will likely continue to maintain a friendlier atmosphere regardless of size.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://escapingtech.com/favicon.ico" alt><span class="kg-bookmark-author">EscapingTech</span><span class="kg-bookmark-publisher">Marcus Hutchins</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://escapingtech.com/images/i-was-wrong-about-mastodon-moderation/cover.png" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.tumblr.com/ghostonly/667966959023996928/how-to-have-a-good-internet-experience-in-8-easy"><div class="kg-bookmark-content"><div class="kg-bookmark-title">How to have a good internet experience in 8 easy steps</div><div class="kg-bookmark-description">#1 - Stop having a bad faith interpretation of every thing you read If you think something someone said might have been something you disagree with, instead of starting an argument, ask them to clar&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://assets.tumblr.com/pop/manifest/apple-touch-icon-873b11b4.png" alt><span class="kg-bookmark-author">Tumblr</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://64.media.tumblr.com/75d3bb3f0d3a775871b5f3cff324ae50/380a574c3b1991f7-4b/s2048x3072_c0,12400,100000,87467/35e2a9c58211d506bfb84c9750c9c974d078fad7.png" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://catvalente.substack.com/p/stop-talking-to-each-other-and-start"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Stop Talking to Each Other and Start Buying Things: Three Decades of Survival in the Desert of Social Media</div><div class="kg-bookmark-description">I bet you&#x2019;re wondering how we got here...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://substackcdn.com/icons/substack/apple-touch-icon-1024x1024.png" alt><span class="kg-bookmark-author">Welcome to Garbagetown</span><span class="kg-bookmark-publisher">Catherynne M. Valente</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://substackcdn.com/image/fetch/w_64,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb376f21-97f3-4045-a7f5-043e4906e19a_400x400.jpeg" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://knightcolumbia.org/content/protocols-not-platforms-a-technological-approach-to-free-speech"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Protocols, Not Platforms: A Technological Approach to Free Speech</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://knightcolumbia.org/images/favicons/KFAI-favicon_228.png" alt><span class="kg-bookmark-author">Knight First Amendment Institute</span><span class="kg-bookmark-publisher">Mike Masnick</span></div></div><div class="kg-bookmark-thumbnail"><img src="http://knightcolumbia.org/images/social/KFAI-social-card-updated.jpg" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://pluralistic.net/2022/12/10/e2e/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Pluralistic: Freedom of reach IS freedom of speech (10 Dec 2022) &#x2013; Pluralistic: Daily links from Cory Doctorow</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i0.wp.com/pluralistic.net/wp-content/uploads/2020/02/cropped-guillotine-French-Revolution.jpg?fit=192%2C192&amp;ssl=1" alt><span class="kg-bookmark-author">Pluralistic: Daily links from Cory Doctorow No trackers, no ads. Black type, white background. Privacy policy: we don&apos;t collect or retain any data at all ever period.</span><span class="kg-bookmark-publisher">Cory Doctorow</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i0.wp.com/craphound.com/images/10Dec2022.jpg?w=840&amp;ssl=1" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.mollywhite.net/anti-crypto-toxicity/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">On anti-crypto toxicity</div><div class="kg-bookmark-description">Crypto is known for its toxicity towards outsiders. Similar attitudes are emerging from some who oppose crypto.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.mollywhite.net/assets/apple-touch-icon.png" alt></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.mollywhite.net/assets/mollyandmax.png" alt></div></a></figure><h3 id="some-closing-smirks">Some Closing Smirks:</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href=" https://blog.jim-nielsen.com/2022/verified-personal-website/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Verified Personal Website</div><div class="kg-bookmark-description">Writing about the big beautiful mess that is making things for the world wide web.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.jim-nielsen.com/favicon.ico" alt><span class="kg-bookmark-author">Jim Nielsen&#x2019;s Blog Verified ($10/year for the domain)</span><span class="kg-bookmark-publisher">Jim Nielsen</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.jim-nielsen.com/assets/img/twitter-card.png" alt></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://xkcd.com/2648/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Chemicals</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://xkcd.com/s/919f27.ico" alt><span class="kg-bookmark-author">xkcd</span><span class="kg-bookmark-publisher">About</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://imgs.xkcd.com/comics/chemicals_2x.png" alt></div></a></figure><p><br><br>I&apos;ll be posting more interesting articles that I read in 2023 on my <a href="https://noc.social/@kazaii">Mastodon</a>. be sure to follow me there for article links, boosts, and more short-form opinions/progress.</p><p>I wish you all a happy &amp; safe 2023.</p>]]></content:encoded></item><item><title><![CDATA[SR Support in Vyos 1.4 (rolling)]]></title><description><![CDATA[<p></p><p>I recently went on a quick trip to Chicago, followed by a brief &apos;staycation&apos;. I am very proud that I was able to effectively check-out from tech life. However, this also meant that I had 400 + articles to read in my RSS feed. </p><p>While tackling my RSS feed</p>]]></description><link>https://zealnetworks.ca/vyos-1-4-rolling-isis-sr-support/</link><guid isPermaLink="false">63a2550a02500100012884e1</guid><category><![CDATA[vyos]]></category><category><![CDATA[oss]]></category><category><![CDATA[sr]]></category><category><![CDATA[mpls]]></category><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Wed, 21 Dec 2022 02:08:55 GMT</pubDate><content:encoded><![CDATA[<p></p><p>I recently went on a quick trip to Chicago, followed by a brief &apos;staycation&apos;. I am very proud that I was able to effectively check-out from tech life. However, this also meant that I had 400 + articles to read in my RSS feed. </p><p>While tackling my RSS feed &#x2013; and getting rid of the redundant feeds &#x2013; I came across an interesting VyOS project <a href="https://blog.vyos.io/vyos-project-november-2022-update">update</a> from November:</p><blockquote>Thanks to our long-time contributor Cheeze-It, IS-IS segment routing support has been refactored and brought much closer to the OSPF segment routing implementation (<a href="https://phabricator.vyos.net/T4739" rel="noopener">T4739</a>).</blockquote><p>Very fascinating work from a familiar name on <a href="https://www.reddit.com/r/networking/">r/networking</a> . Not only did he add the much needed ISIS-SR configuration to Vyos, he also helped the FRR team add the missing opaque LSA knob for the OSPF implementation.</p><p>I was very excited by the prospect of SR-MPLS now working in Vyos, as XRv &amp; XRv9k can be quite beefy and clumsy to utilize in my labs. Vyos, on the other hand, is lean &amp; mean as a CE/PE implementation.</p><p>I figured I&apos;d put it to the test. I went to the Vyos site and downloaded the latest rolling image. I then imported it into GNS3 &amp; plopped it directly into my <a href="https://www.segment-routing.net/tutorials/2016-09-27-topology-independent-lfa-ti-lfa/">TI-LFA</a> / SR-TE refresher lab. After some configuration tweaking, it worked beautifully. The next part was to test it&apos;s potential as an LSR in my topology; Could I create a TI-LFA recovery path, using the SR labels/SIDs on the router?</p><p>To simulate a TI-LFA hard coverage scenario, I suspended some links and add a <a href="https://www.juniper.net/documentation/us/en/software/junos/mpls/topics/topic-map/srlg-for-mpls.html">SRLG</a> (shared risk link group) to a crucial node in the path.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2022/12/srlg_gns3.png" class="kg-image" alt loading="lazy" width="1346" height="623" srcset="https://zealnetworks.ca/content/images/size/w600/2022/12/srlg_gns3.png 600w, https://zealnetworks.ca/content/images/size/w1000/2022/12/srlg_gns3.png 1000w, https://zealnetworks.ca/content/images/2022/12/srlg_gns3.png 1346w" sizes="(min-width: 1200px) 1200px"></figure><p>Messy &#x2013; I know &#x2013; but it did the trick! The end topology looks a little more like this:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2022/12/SR_Lab.drawio-1.png" class="kg-image" alt loading="lazy" width="1078" height="581" srcset="https://zealnetworks.ca/content/images/size/w600/2022/12/SR_Lab.drawio-1.png 600w, https://zealnetworks.ca/content/images/size/w1000/2022/12/SR_Lab.drawio-1.png 1000w, https://zealnetworks.ca/content/images/2022/12/SR_Lab.drawio-1.png 1078w"></figure><p>Let&apos;s consider the normal path for router 3 to reach router 10&apos;s loopback. The shortest path would be via router 6, then router 9. If the link towards router 6 failed, the natural second best path would be via router 7 or router 4. </p><p>But what if I told you that router 6&apos;s path to router 4 &amp; router 9 had a shared risk.... such as a common DWDM shelf, a common fiber conduit, shared ASIC, shared line card, etc. We can program that into the device to protect against the common faults introduced by router 6.</p><p>First, here&apos;s the SR-MPLS &amp; TI-LFA configuration on router 3:</p><pre><code>RP/0/0/CPU0:XRv-3#show run formal | i &quot;isis|mpls&quot;

Building configuration...
 router isis &apos;.*&apos; 
 router isis &apos;.*&apos;  interface &apos;GigabitEthernet.*&apos; 
 router isis &apos;.*&apos;  interface &apos;GigabitEthernet.*&apos;  address-family ipv4 unicast 
 router isis &apos;.*&apos;  interface &apos;GigabitEthernet.*&apos;  address-family ipv4 unicast  fast-reroute per-prefix
 router isis &apos;.*&apos;  interface &apos;GigabitEthernet.*&apos;  address-family ipv4 unicast  fast-reroute per-prefix ti-lfa
ipv4 unnumbered mpls traffic-eng Loopback0
router isis zeal apply-group GROUP_TILFA
router isis zeal 
router isis zeal is-type level-2-only
router isis zeal net 49.0000.0000.0003.00
router isis zeal address-family ipv4 unicast 
router isis zeal address-family ipv4 unicast metric-style wide
router isis zeal address-family ipv4 unicast fast-reroute per-prefix tiebreaker node-protecting index 100
router isis zeal address-family ipv4 unicast fast-reroute per-prefix tiebreaker srlg-disjoint index 200
router isis zeal address-family ipv4 unicast microloop avoidance
router isis zeal address-family ipv4 unicast microloop avoidance rib-update-delay 65535
router isis zeal address-family ipv4 unicast advertise passive-only
router isis zeal address-family ipv4 unicast segment-routing mpls sr-prefer
router isis zeal interface Loopback0 
router isis zeal interface Loopback0 passive
router isis zeal interface Loopback0 address-family ipv4 unicast 
router isis zeal interface Loopback0 address-family ipv4 unicast prefix-sid index 3
router isis zeal interface GigabitEthernet0/0/0/0 
router isis zeal interface GigabitEthernet0/0/0/0 address-family ipv4 unicast 
router isis zeal interface GigabitEthernet0/0/0/1 
router isis zeal interface GigabitEthernet0/0/0/1 address-family ipv4 unicast 
router isis zeal interface GigabitEthernet0/0/0/2 
router isis zeal interface GigabitEthernet0/0/0/2 address-family ipv4 unicast 
router isis zeal interface GigabitEthernet0/0/0/3 
router isis zeal interface GigabitEthernet0/0/0/3 bfd minimum-interval 100
router isis zeal interface GigabitEthernet0/0/0/3 bfd multiplier 3
router isis zeal interface GigabitEthernet0/0/0/3 bfd fast-detect ipv4
router isis zeal interface GigabitEthernet0/0/0/3 address-family ipv4 unicast 
mpls traffic-eng 
mpls traffic-eng auto-tunnel p2p tunnel-id min 10000 max 14094
mpls ip-ttl-propagate disable
RP/0/0/CPU0:XRv-3#</code></pre><p>The above configuration, especially the <code>fast-reroute</code> portion, should protect us if router 6 completely fails, or that common risk SRLG path. The microloop avoidance will implement this tunnel for a set time, in the assumption that the forwarding plane takes time to propagate.</p><p>Now let&apos;s look at the SRLG configuration on router 6:</p><pre><code>RP/0/0/CPU0:XRv-6#show run formal srlg  | i &quot;name|value&quot;

srlg interface GigabitEthernet0/0/0/0 name CONDUIT
srlg interface GigabitEthernet0/0/0/3 name CONDUIT
srlg name CONDUIT value 100
RP/0/0/CPU0:XRv-6#
RP/0/0/CPU0:XRv-6#show srlg name CONDUIT                            

SRLG : CONDUIT
Value : 100

Interface:
 GigabitEthernet0/0/0/0
 GigabitEthernet0/0/0/3


RP/0/0/CPU0:XRv-6#
RP/0/0/CPU0:XRv-6#show isis adjacency | i &quot;0/0/0/0|0/0/3&quot;

XRv-4          Gi0/0/0/0        0cd9.5942.0002 Up    6    00:32:36 Yes None None
XRv-9          Gi0/0/0/3        0c06.7e75.0002 Up    25   00:32:35 Yes None None
RP/0/0/CPU0:XRv-6#  
</code></pre><p>Great. So the playing field is set.... but how does one setup SR-MPLS (in IS-IS) on VyOS? Much simpler than you think, thanks to Mr. Cheese.</p><pre><code>vyos@Vyos-8:~$  show configuration commands | match &quot;isis|mpls&quot;
set protocols isis interface eth0 network
set protocols isis interface eth1 network
set protocols isis interface eth2 metric &apos;40&apos;
set protocols isis interface eth2 network
set protocols isis interface lo passive
set protocols isis level &apos;level-2&apos;
set protocols isis net &apos;49.0000.0000.0008.00&apos;
set protocols isis segment-routing global-block high-label-value &apos;24999&apos;
set protocols isis segment-routing global-block low-label-value &apos;16000&apos;
set protocols isis segment-routing local-block high-label-value &apos;104000&apos;
set protocols isis segment-routing local-block low-label-value &apos;100000&apos;
set protocols isis segment-routing prefix 10.255.255.8/32 index value &apos;8&apos;
set protocols mpls interface &apos;eth0&apos;
set protocols mpls interface &apos;eth1&apos;
set protocols mpls interface &apos;eth2&apos;
vyos@Vyos-8:~$
vyos@Vyos-8:~$ show interfaces 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             10.6.8.8/31                       u/u  
eth1             10.7.8.8/31                       u/u  
eth2             10.8.9.8/31                       u/u  
lo               127.0.0.1/8                       u/u  
                 10.255.255.8/32                        
                 ::1/128                                
vyos@Vyos-8:~$</code></pre><p>I set the <code>local-block</code>, to be used by the Adjacency Labels, to a high value so they stand out from the Prefix SIDs. </p><p>It works:</p><pre><code>vyos@Vyos-8:~$ show ip route isis | match label
I   10.255.255.1/32 [115/40] via 10.6.8.6, eth0 inactive, label 16001, weight 1, 00:01:11
                             via 10.7.8.7, eth1 inactive, label 16001, weight 1, 00:01:11
I   10.255.255.2/32 [115/30] via 10.6.8.6, eth0 inactive, label 16002, weight 1, 00:01:11
                             via 10.7.8.7, eth1 inactive, label 16002, weight 1, 00:01:11
I   10.255.255.3/32 [115/20] via 10.6.8.6, eth0 inactive, label 16003, weight 1, 00:06:15
                             via 10.7.8.7, eth1 inactive, label 16003, weight 1, 00:06:15
I   10.255.255.4/32 [115/20] via 10.6.8.6, eth0 inactive, label 16004, weight 1, 00:06:15
I   10.255.255.5/32 [115/20] via 10.6.8.6, eth0 inactive, label 16005, weight 1, 00:06:15
I   10.255.255.6/32 [115/10] via 10.6.8.6, eth0 inactive, label implicit-null, weight 1, 00:06:15
I   10.255.255.7/32 [115/10] via 10.7.8.7, eth1 inactive, label implicit-null, weight 1, 00:06:15
I   10.255.255.9/32 [115/20] via 10.6.8.6, eth0 inactive, label 16009, weight 1, 00:06:15
I   10.255.255.10/32 [115/30] via 10.6.8.6, eth0 inactive, label 16010, weight 1, 00:06:15
vyos@Vyos-8:~$ 
vyos@Vyos-8:~$ show mpls table
 Inbound Label  Type        Nexthop   Outbound Label  
 -----------------------------------------------------
 16001          SR (IS-IS)  10.7.8.7  16001           
 16002          SR (IS-IS)  10.7.8.7  16002           
 16003          SR (IS-IS)  10.7.8.7  16003           
 16003          SR (IS-IS)  10.6.8.6  16003           
 16004          SR (IS-IS)  10.6.8.6  16004           
 16005          SR (IS-IS)  10.6.8.6  16005           
 16006          SR (IS-IS)  10.6.8.6  implicit-null   
 16007          SR (IS-IS)  10.7.8.7  implicit-null   
 16009          SR (IS-IS)  10.6.8.6  16009           
 16010          SR (IS-IS)  10.6.8.6  16010           
 100000         SR (IS-IS)  10.8.9.9  implicit-null   
 100001         SR (IS-IS)  10.7.8.7  implicit-null   
 100002         SR (IS-IS)  10.6.8.6  implicit-null   

vyos@Vyos-8:~$ </code></pre><p>To further demonstrate the Microloop avoidance / node protection feature... I also set the Metric between Router 8 &amp; 9 to be 40, rather than the default value of 10, in the topology. To demonstrates that router 3 is trying to <em>really</em> avoid sending the backup path via router 6.</p><p><code>set protocols isis interface eth2 metric &apos;40&apos;</code></p><pre><code>vyos@Vyos-8:~$ show isis neighbor XRv-9 | match Inter
    Interface: eth2, Level: 2, State: Up, Expires in 28s
vyos@Vyos-8:~$</code></pre><p>Now let&apos;s see what router 3 sees:</p><pre><code>RP/0/0/CPU0:XRv-3#show isis fast-reroute 10.255.255.10/32


L2 10.255.255.10/32 [30/115]
     via 10.3.6.6, GigabitEthernet0/0/0/3, XRv-6, SRGB Base: 16000, Weight: 0
         Backup path: TI-LFA (node+srlg), via 10.3.7.7, GigabitEthernet0/0/0/1 XRv-7, SRGB Base: 16000, Weight: 0
           P node: Vyos-8.00 [10.255.255.8], Label: 16008
           Q node: XRv-9.00 [10.255.255.9], Label: 100000
           Prefix label: 16010
RP/0/0/CPU0:XRv-3#
RP/0/0/CPU0:XRv-3#show cef 10.255.255.10/32  | i &quot;backup|16008&quot;

   via 10.3.7.7/32, GigabitEthernet0/0/0/1, 9 dependencies, weight 0, class 0, backup (remote) [flags 0x8300]
     local label 16010      labels imposed {16008 100000 16010}
RP/0/0/CPU0:XRv-3#</code></pre><p>You can see that an auto-engineered fast-reroute path is generated. Utilizing the following label stack:</p><ul><li>Node SID of 16008 to path to Router 8</li><li>Adjacency SID on Router 8 to <em>force</em> the traffic over the less preferred link, via Router 9</li><li>Bottom-of-stack is the label for the node SID of Router 10. </li></ul><p>If this were to be combined with a VPN service label &#x2013; which it likely would &#x2013; that would mean a label depth of 4 protecting the payload. </p><p>Here&apos;s what the backup path looks like:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2022/12/SR_Lab_reroute-1.png" class="kg-image" alt loading="lazy" width="1078" height="581" srcset="https://zealnetworks.ca/content/images/size/w600/2022/12/SR_Lab_reroute-1.png 600w, https://zealnetworks.ca/content/images/size/w1000/2022/12/SR_Lab_reroute-1.png 1000w, https://zealnetworks.ca/content/images/2022/12/SR_Lab_reroute-1.png 1078w"></figure><p>This proves that Vyos &#x2013; in the to-be-released 1.4 version, anyway &#x2013; is a viable SR-MPLS LSR replacement for XRv, Junos, EOS, etc. &#x2013; at least in your lab! It also boots way faster and utilizes modest resources. Sadly, RFC 7432 implementation and TI-LFA are not implemented in FRR, as of yet:</p><pre><code>vyos@Vyos-8:~$ vtysh

Hello, this is FRRouting (version 8.4.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

Vyos-8# show isis fast-reroute 
% Command incomplete: show isis fast-reroute 
Vyos-8# show isis fast-reroute summary 
Area VyOS:
 IS-IS L2 IPv4 Fast ReRoute summary:

 Protection \ Priority     Critical  High      Medium    Low       Total   
 --------------------------------------------------------------------------
 Classic LFA               0         0         0         0         0       
 Remote LFA                0         0         0         0         0       
 Topology Independent LFA  0         0         0         0         0       
 ECMP                      0         0         3         0         3       
 Unprotected               0         0         6         0         6       
 Protection coverage       0.00%     0.00%     33.33%    0.00%     33.33%  

(I also tried EVPN rt-5 in my lab, without luck)
</code></pre><p>VPNv4 Unicast + SR works just fine :) </p><p>This makes me happy as I can build larger topologies &amp; boot/restart resources faster. Thanks to the VyOS team, FRR team, &#xA0;&amp; &#xA0;<code>Cheeze_it</code></p><p></p>]]></content:encoded></item><item><title><![CDATA[T3 Scale Design: Take Two]]></title><description><![CDATA[<h3 id="a-quiet-mind">A quiet mind</h3><p>After I hit publish on my blog post last night, I went to bed. While laying there, a simpler way to implement my table-policy design suddenly came to me; One that eliminates the need of a L1/L2 ABR.</p><p>What I came up with was a hierarchical</p>]]></description><link>https://zealnetworks.ca/tier-3-table-policy-revision-2/</link><guid isPermaLink="false">62e097673153dd0001a78a1b</guid><category><![CDATA[design]]></category><category><![CDATA[Routing]]></category><category><![CDATA[ios-xr]]></category><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Wed, 27 Jul 2022 02:14:45 GMT</pubDate><content:encoded><![CDATA[<h3 id="a-quiet-mind">A quiet mind</h3><p>After I hit publish on my blog post last night, I went to bed. While laying there, a simpler way to implement my table-policy design suddenly came to me; One that eliminates the need of a L1/L2 ABR.</p><p>What I came up with was a hierarchical Route-Reflector design. Where the T1 routers, that border the two rings, act as RR&apos;s for the T3 routers. They would also originate a default route for the routers to use, instead of the IS-IS attached-bit.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2022/07/H_RRs.png" class="kg-image" alt loading="lazy" width="884" height="671" srcset="https://zealnetworks.ca/content/images/size/w600/2022/07/H_RRs.png 600w, https://zealnetworks.ca/content/images/2022/07/H_RRs.png 884w"></figure><h3 id="configuration"> Configuration</h3><p>First, we had to restore the Level-2 Topology to both rings.</p><pre><code>RP/0/0/CPU0:XRv-9#show isis topology 


IS-IS zeal paths to IPv4 Unicast (Level-2) routers
System Id       Metric  Next-Hop        Interface       SNPA          
XRv-1           30      XRv-7           Gi0/0/0/1       0cfe.1ea7.0002
XRv-2           20      XRv-7           Gi0/0/0/1       0cfe.1ea7.0002
XRv-3           20      XRv-8           Gi0/0/0/0       0ca7.981d.0002
XRv-4           30      XRv-8           Gi0/0/0/0       0ca7.981d.0002
XRv-5           40      XRv-8           Gi0/0/0/0       0ca7.981d.0002
XRv-6           40      XRv-7           Gi0/0/0/1       0cfe.1ea7.0002
XRv-7           10      XRv-7           Gi0/0/0/1       0cfe.1ea7.0002
XRv-8           10      XRv-8           Gi0/0/0/0       0ca7.981d.0002
XRv-9           --    
RR-1            50      XRv-7           Gi0/0/0/1       0cfe.1ea7.0002
RR-1            50      XRv-8           Gi0/0/0/0       0ca7.981d.0002
RP/0/0/CPU0:XRv-9#</code></pre><p>Next, we establish IPv4-unicast sessions between the Ring Border Routers &amp; the Tier 3 PE(s). We also need to add the config of <code>default-originate</code> to ensure that they specifically advertise a default route to this PE.</p><pre><code>RP/0/0/CPU0:XRv-2#show run formal router bgp | i .9

router bgp 6275 neighbor 10.255.255.9 
router bgp 6275 neighbor 10.255.255.9 remote-as 6275
router bgp 6275 neighbor 10.255.255.9 update-source Loopback0
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast 
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast route-policy PASS in
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast route-reflector-client
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast route-policy PASS out
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast default-originate
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast soft-reconfiguration inbound always
RP/0/0/CPU0:XRv-2#
RP/0/0/CPU0:XRv-3#show run formal router bgp | i .9

router bgp 6275 neighbor 10.255.255.9 
router bgp 6275 neighbor 10.255.255.9 remote-as 6275
router bgp 6275 neighbor 10.255.255.9 update-source Loopback0
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast 
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast route-policy PASS in
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast route-reflector-client
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast route-policy PASS out
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast default-originate
router bgp 6275 neighbor 10.255.255.9 address-family ipv4 unicast soft-reconfiguration inbound always
RP/0/0/CPU0:XRv-3#</code></pre><p>Great, so XRv-9 is now learning a default route. But the problem is that &#x2013; by default &#x2013; iBGP chooses the best possible <em>single</em> path. To ensure we&apos;re using both links on XRv-9, we need to enable multipathing. We also need to add the default route to our table policy to ensure it&apos;s installed in the FIB.</p><pre><code>RP/0/0/CPU0:XRv-9#show rpl route-policy TBL_PLCY detail 

prefix-set TBL
  0.0.0.0/0,
  203.0.113.0/24 le 32,
  25.54.60.0/24 le 32,
  8.8.8.0/24 le 32
end-set
!
route-policy TBL_PLCY
  if destination in TBL then
    pass
  else
    drop
  endif
end-policy
!
RP/0/0/CPU0:XRv-9#
RP/0/0/CPU0:XRv-9#show run router bgp 6275 address-family ipv4 unicast 

router bgp 6275
 address-family ipv4 unicast
  table-policy TBL_PLCY
  maximum-paths ibgp 2
 !
!

RP/0/0/CPU0:XRv-9#</code></pre><p>Now the prefix should be installed &amp; ECMP aware.</p><pre><code>RP/0/0/CPU0:XRv-9#show route bgp   


B*   0.0.0.0/0 [200/0] via 10.255.255.3, 00:54:33
               [200/0] via 10.255.255.2, 00:54:33
B    8.8.8.0/24 [200/0] via 10.255.255.1, 00:56:37
B    25.54.60.0/24 [20/0] via 203.0.113.6, 00:56:37
RP/0/0/CPU0:XRv-9#    </code></pre><h3 id="conclusion">Conclusion</h3><p>As usual, the best way to find the truth is by saying the wrong answer aloud.</p><p>This design is much more scalable and requires far less impact to a greenfield addition to a brownfield network. It still meets the main requirement &#x2013; reducing IPv4 / IPv6 unicast FIB entries due to low prefix / ECMP scale. The Tier-3 routers still peer with the main Route Reflector for address-families such as l2vpn evpn, for L3VPN &amp; L2VPN services.</p><pre><code>RP/0/0/CPU0:XRv-9#show bgp l2vpn evpn summary  | b Spk      

Neighbor        Spk    AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down  St/PfxRcd
10.255.255.10     0  6275     101      98        1    0    0 01:03:58          0

RP/0/0/CPU0:XRv-9#</code></pre><p>Be sure to do this once in a while; Remember that <em>perfect is the enemy of good. </em>Go for the best design you can come up with at the moment. Socialize it around, sleep on it, and give it time. The topology is out there.</p>]]></content:encoded></item><item><title><![CDATA[What's on the table?]]></title><description><![CDATA[<h3 id="inspiration">Inspiration</h3><p>I was recently discussing a design with a colleague in the industry. He was tasked with deciding on a platform for his Tier 3 access rings; These rings would be low bandwidth and potentially oversubscribed. The platform he decided on was the NCS500 series.</p><p>The main problem he was</p>]]></description><link>https://zealnetworks.ca/everything-is-on-the-table/</link><guid isPermaLink="false">62ddc6cb3153dd0001a7885e</guid><category><![CDATA[design]]></category><category><![CDATA[Routing]]></category><category><![CDATA[ios-xr]]></category><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Tue, 26 Jul 2022 03:42:27 GMT</pubDate><content:encoded><![CDATA[<h3 id="inspiration">Inspiration</h3><p>I was recently discussing a design with a colleague in the industry. He was tasked with deciding on a platform for his Tier 3 access rings; These rings would be low bandwidth and potentially oversubscribed. The platform he decided on was the NCS500 series.</p><p>The main problem he was having was delivering full tables to clients connected to the T3 ring, as the NCS500 series routers could not handle full tables in FIB. They were also low scale in general &#x2013; as also seen in the NCS55XX series &#x2013; with 4k ECMP FEC entries limitation.</p><p>The solution he landed on was to introduce PWHE&apos;s (Pseudo Wire Head-ends) into his network; The NCS500 routers would act as a point-to-point l2vpn x-connect to the S-PE&apos;s (Switching PE, that terminates the PWHE&apos;s).</p><p>I listened to the main concern he had in mind: the ability to advertise full tables to customers. I proposed he consider a BGP <code>table-policy</code> instead. He wasn&apos;t fully convinced by the idea, so I&apos;ve decided to lab it up to explore more and discover it&apos;s efficacy for myself.</p><h3 id="lab-topology">Lab Topology</h3><p>I&apos;ve created the following topology to represent a Tier-1 ring with a Tier-3 ring attached:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2022/07/image-1.png" class="kg-image" alt loading="lazy" width="1208" height="722" srcset="https://zealnetworks.ca/content/images/size/w600/2022/07/image-1.png 600w, https://zealnetworks.ca/content/images/size/w1000/2022/07/image-1.png 1000w, https://zealnetworks.ca/content/images/2022/07/image-1.png 1208w" sizes="(min-width: 1200px) 1200px"></figure><p>For the above topology, XRv-1 to 6 are our Tier 1 ring. They are acting as bigger routers, capable of holding full tables and multiple VPN services. Routers XRv-7 to 9 are the Tier 3 ring. These will act as our low scale NCS500 series routers. RR-1 is simply our IPv4 unicast route-reflector.</p><p>The two Peer routers are simply advertising EBGP prefixes to our border routers, for demonstrating the sub-optimal routing from XRv-9&apos;s perspective. I also setup a Customer CE router as an internet customer, to demonstrate it&apos;s view of the topology.</p><h3 id="configuring-pwhe">Configuring PWHE</h3><p>Now it&apos;s time to build the proposed topology. The concept of a PWHE&apos;s was fairly new to me; Thus, I had to refer to <a href="https://www.cisco.com/c/en/us/td/docs/routers/asr9000/software/asr9k-r7-4/lxvpn/configuration/guide/b-l2vpn-cg-asr9000-74x/implementing-multipoint-layer-2-services.html?dtid=osscdc000283#concept_D6AEACD99E9241ADB95CC47038203B55">documentation</a>.</p><p>First we create our PWHE interface &amp; matching L2VPN x-connect on XRv-3, acting as the S-PE. You can see that XRv-3 has an established BGP session with the CUST-1 router:</p><pre><code>RP/0/0/CPU0:XRv-3#show run formal | i &quot;PW|xconnect&quot;

Building configuration...
interface PW-Ether100 
interface PW-Ether100 ipv4 address 203.0.113.5 255.255.255.252
interface PW-Ether100 attach generic-interface-list gil1
l2vpn xconnect group pwhe 
l2vpn xconnect group pwhe p2p xc_main_interface 
l2vpn xconnect group pwhe p2p xc_main_interface interface PW-Ether100
l2vpn xconnect group pwhe p2p xc_main_interface neighbor ipv4 10.255.255.9 pw-id 100 
RP/0/0/CPU0:XRv-3#
RP/0/0/CPU0:XRv-3#show bgp sessions

Neighbor        VRF                   Spk    AS   InQ  OutQ  NBRState     NSRState
10.255.255.10   default                 0  6275     0     0  Established  None
203.0.113.6     default                 0   789     0     0  Established  None
RP/0/0/CPU0:XRv-3#
RP/0/0/CPU0:XRv-3#show arp  | i &quot;Add|PW-&quot;

Address         Age        Hardware Addr   State      Type  Interface
203.0.113.5     -          0257.cc67.a402  Interface  ARPA  PW-Ether100
203.0.113.6     00:03:29   0c05.f335.0000  Dynamic    ARPA  PW-Ether100
RP/0/0/CPU0:XRv-3#</code></pre><p>XRv-9 is delivering this connection purely via L2VPN x-connect:</p><pre><code>RP/0/RP0/CPU0:XRv-9#show run l2vpn
l2vpn
 xconnect group pwhe
  p2p xc_main_intf
   interface GigabitEthernet0/0/0/2
   neighbor ipv4 10.255.255.3 pw-id 100
   !
  !
 !
!

RP/0/RP0/CPU0:XRv-9

RP/0/RP0/CPU0:XRv-9#show mpls ldp neighbor brief 

Peer               GR  NSR  Up Time     Discovery   Addresses     Labels    
                                        ipv4  ipv6  ipv4  ipv6  ipv4   ipv6 
-----------------  --  ---  ----------  ----------  ----------  ------------
10.255.255.3:0     N   N    00:02:35    1     0     5     0     0      0    

RP/0/RP0/CPU0:XRv-9#
RP/0/RP0/CPU0:XRv-9#show l2vpn xconnect pw-id 100        
Legend: ST = State, UP = Up, DN = Down, AD = Admin Down, UR = Unresolved,
        SB = Standby, SR = Standby Ready, (PP) = Partially Programmed

XConnect                   Segment 1                       Segment 2                
Group      Name       ST   Description            ST       Description            ST    
------------------------   -----------------------------   -----------------------------
pwhe       xc_main_intf
                      UP   Gi0/0/0/2              UP       10.255.255.3    100    UP    
----------------------------------------------------------------------------------------
RP/0/RP0/CPU0:XRv-9#

\\ The BGP Upstream peers are also learning the advertised prefix from the customer

kazaii@CUST-1:~$ show ip route connected 

C&gt;* 25.54.60.0/24 is directly connected, lo, 00:14:17
C&gt;* 203.0.113.4/30 is directly connected, eth0, 00:14:17
kazaii@CUST-1:~$

kazaii@Peer-1:~$ show bgp ipv4 25.54.60.0 bestpath 
BGP routing table entry for 25.54.60.0/24
Paths: (2 available, best #2, table default)
  Advertised to non peer-group peers:
  1.1.1.2 70.20.31.2
  6275 789
    1.1.1.2 from 1.1.1.2 (10.255.255.5)
      Origin incomplete, valid, external, best (AS Path)
      Last update: Tue Jul 26 00:17:58 2022
kazaii@Peer-1:~$ 
</code></pre><p>It&apos;s worth noting that the above configuration created the pseudowire via LDP signalling. You can, however, utilize <a href="https://www.cisco.com/c/en/us/td/docs/routers/asr9000/software/asr9k-r6-3/lxvpn/configuration/guide/b-l2vpn-cg-asr9000-63x/b-l2vpn-cg-asr9000-63x_chapter_0101.html#concept_47963911837814876167396099940847023104">EVPN-VPWS</a> .. to keep this BGP signalled and less overhead.</p><blockquote>The use of EVPN for VPWS eliminates the need for signaling single-segment and multi-segment PWs for point-to-point Ethernet services. You can also configure the PWHE interface and a bridge domain access pseudowire using EVPN-VPWS.</blockquote><h3 id="customer-view-over-pwhe">Customer View over PWHE</h3><p>Finally, the Customer Router is able to reach the PWHE interface and is learning the full table </p><pre><code>kazaii@CUST-1:~$ ping 203.0.113.5 
PING 203.0.113.5 (203.0.113.5) 56(84) bytes of data.
64 bytes from 203.0.113.5: icmp_seq=1 ttl=255 time=2.31 ms
64 bytes from 203.0.113.5: icmp_seq=2 ttl=255 time=2.31 ms
64 bytes from 203.0.113.5: icmp_seq=3 ttl=255 time=1.85 ms
64 bytes from 203.0.113.5: icmp_seq=4 ttl=255 time=1.69 ms
^C
--- 203.0.113.5 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 1.689/2.040/2.313/0.277 ms
kazaii@CUST-1:~$ show bgp summary 

IPv4 Unicast Summary:
BGP router identifier 25.54.60.1, local AS number 789 vrf-id 0
BGP table version 16
RIB entries 31, using 5952 bytes of memory
Peers 1, using 21 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
203.0.113.5     4       6275         6         7        0    0    0 00:01:28           14       16

Total number of neighbors 1
kazaii@CUST-1:~$ 

kazaii@CUST-1:~$ show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       &gt; - selected route, * - FIB route, q - queued, r - rejected, b - backup

B&gt;* 1.1.1.0/30 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 1.1.1.100/32 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 2.2.2.0/30 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 2.2.2.100/32 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 8.8.8.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 23.74.88.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 50.50.50.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 60.60.60.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 66.77.230.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 70.20.31.0/30 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 70.70.70.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 99.99.99.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 173.45.20.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
B&gt;* 209.20.35.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:01:38
kazaii@CUST-1:~$ </code></pre><h3 id="pwhe-caveats">PWHE Caveats</h3><p>That wasn&apos;t so hard. What&apos;s the problem? Well, there are a few:</p><ul><li>The L2VPN x-connect terminates on XRv-3. That means all flows go through XRv-8, even if the shortest path is via XRv-7 to Peer-2, for example. That&apos;s sub-optimal routing (even if it&apos;s just one extra hop).</li><li>Load-balancing &#x2013; both ECMP and over Bundle interfaces &#x2013; is not supported by default in this setup. You need to configure <a href="https://www.cisco.com/c/en/us/td/docs/routers/asr9000/software/asr9k-r7-4/lxvpn/configuration/guide/b-l2vpn-cg-asr9000-74x/implementing-multipoint-layer-2-services.html?dtid=osscdc000283#concept_05756C1C85564ACC98C5C94F9B56243A">FAT labels</a>, also known as entropy labels. This adds more complexity to the design... (I would have demonstrated this, but my XRv routers do not support it).</li><li>The lack of load-balancing causes under-utilized links. For example, if this was our only X-connect, the link to XRv-7 would be completely unused, unless there was a ring break. This would also be true for links in the Bundle.</li><li>To balance X-connects over the links, you could program 50% of the links on XRv-2 and XRv-3... but this introduces a lot of state and planning. Especially as you can&apos;t predict the flow patterns of Customer 1 vs Customer 2, 3 etc... it would be better if ECMP hashing could balance the flows.</li></ul><p>Here is the demonstration of the sub-optimal routing:</p><pre><code>kazaii@CUST-1:~$ traceroute 99.99.99.99
traceroute to 99.99.99.99 (99.99.99.99), 30 hops max, 60 byte packets
 1  203.0.113.5 (203.0.113.5)  8.829 ms  8.621 ms  8.553 ms
 2  10.2.3.2 (10.2.3.2)  23.717 ms  23.535 ms  23.409 ms
 3  10.1.2.1 (10.1.2.1)  25.956 ms  25.807 ms  25.758 ms
 4  99.99.99.99 (99.99.99.99)  25.464 ms  25.319 ms  25.184 ms
kazaii@CUST-1:~$


kazaii@CUST-1:~$ traceroute  209.20.35.1
traceroute to 209.20.35.1 (209.20.35.1), 30 hops max, 60 byte packets
 1  203.0.113.5 (203.0.113.5)  6.066 ms  5.842 ms  5.618 ms
 2  10.3.4.4 (10.3.4.4)  11.545 ms  11.504 ms  11.365 ms
 3  10.4.5.5 (10.4.5.5)  13.402 ms  17.144 ms  17.106 ms
 4  209.20.35.1 (209.20.35.1)  16.977 ms  16.842 ms  16.820 ms
kazaii@CUST-1:~$



kazaii@Peer-1:~$ show configuration commands | match &quot;address|bgp&quot;
set interfaces ethernet eth0 address &apos;1.1.1.1/30&apos;
set interfaces ethernet eth1 address &apos;70.20.31.1/30&apos;
set interfaces loopback lo address &apos;1.1.1.100/32&apos;
set interfaces loopback lo address &apos;50.50.50.50/24&apos;
set interfaces loopback lo address &apos;60.60.60.60/24&apos;
set interfaces loopback lo address &apos;70.70.70.70/24&apos;
set interfaces loopback lo address &apos;209.20.35.1/24&apos;
set protocols bgp 123 address-family ipv4-unicast redistribute connected
set protocols bgp 123 neighbor 1.1.1.2 address-family ipv4-unicast
set protocols bgp 123 neighbor 1.1.1.2 remote-as &apos;6275&apos;
set protocols bgp 123 neighbor 70.20.31.2 address-family ipv4-unicast
set protocols bgp 123 neighbor 70.20.31.2 remote-as &apos;222&apos;
kazaii@Peer-1:~$


kazaii@Peer-2:~$ show configuration commands | match &quot;address|bgp&quot;
set interfaces ethernet eth0 address &apos;2.2.2.1/30&apos;
set interfaces ethernet eth1 address &apos;70.20.31.2/30&apos;
set interfaces loopback lo address &apos;2.2.2.100/32&apos;
set interfaces loopback lo address &apos;66.77.230.1/24&apos;
set interfaces loopback lo address &apos;99.99.99.99/24&apos;
set interfaces loopback lo address &apos;23.74.88.1/24&apos;
set interfaces loopback lo address &apos;173.45.20.1/24&apos;
set interfaces loopback lo address &apos;8.8.8.8/24&apos;
set protocols bgp 222 address-family ipv4-unicast redistribute connected
set protocols bgp 222 neighbor 2.2.2.2 address-family ipv4-unicast
set protocols bgp 222 neighbor 2.2.2.2 remote-as &apos;6275&apos;
set protocols bgp 222 neighbor 70.20.31.1 address-family ipv4-unicast
set protocols bgp 222 neighbor 70.20.31.1 remote-as &apos;123&apos;
kazaii@Peer-2:~$ </code></pre><p>As seen above, regardless of the shortest path to Peer 1 or 2, the traffic is going via XRv-3.</p><h3 id="alternative-proposal-table-policy">Alternative Proposal: Table Policy</h3><p>My alternative proposal would be to keep the peering on XRv-9, and drop the Tier-3 ring down to an IS-IS Level 1 domain. This would set the attached-bit (default route) and you could filter entries from the FIB with a table-policy. Let&apos;s take a look.</p><p>XRv-2 &amp; XRv-3 are the Level 1-2 routers (the ABR&apos;s). They are put into another area, as this is required to have the attached-bit set.</p><pre><code>
RP/0/0/CPU0:XRv-2# show run formal router isis | i &quot;49.|prop|circu&quot;

router isis zeal net 49.0001.0000.0000.0002.00
router isis zeal address-family ipv4 unicast propagate level 2 into level 1 route-policy LOO
router isis zeal interface GigabitEthernet0/0/0/0 circuit-type level-2-only
router isis zeal interface GigabitEthernet0/0/0/1 circuit-type level-2-only
router isis zeal interface GigabitEthernet0/0/0/2 circuit-type level-1
RP/0/0/CPU0:XRv-2#
RP/0/0/CPU0:XRv-2#show isis adjacency | i &quot;Lev|XR&quot;

IS-IS zeal Level-1 adjacencies:
XRv-7          Gi0/0/0/2        0cfe.1ea7.0001 Up    7    00:08:30 Yes None None
IS-IS zeal Level-2 adjacencies:
XRv-1          Gi0/0/0/0        0c7b.5763.0001 Up    28   00:09:35 Yes None None
XRv-3          Gi0/0/0/1        0c50.dac2.0001 Up    25   00:09:03 Yes None None
RP/0/0/CPU0:XRv-2#

RP/0/0/CPU0:XRv-3#show run formal router isis | i &quot;49.|prop|circu&quot;

router isis zeal net 49.0001.0000.0000.0003.00
router isis zeal address-family ipv4 unicast propagate level 2 into level 1 route-policy LOO
router isis zeal interface GigabitEthernet0/0/0/0 circuit-type level-2-only
router isis zeal interface GigabitEthernet0/0/0/1 circuit-type level-2-only
router isis zeal interface GigabitEthernet0/0/0/2 circuit-type level-1
RP/0/0/CPU0:XRv-3#
RP/0/0/CPU0:XRv-3#show isis adjacency | i &quot;Lev|XR&quot;

IS-IS zeal Level-1 adjacencies:
XRv-8          Gi0/0/0/2        0ca7.981d.0001 Up    9    00:07:42 Yes None None
IS-IS zeal Level-2 adjacencies:
XRv-2          Gi0/0/0/0        0cc6.415c.0002 Up    8    00:08:40 Yes None None
XRv-4          Gi0/0/0/1        0c9c.d3f4.0001 Up    7    00:08:40 Yes None None
RP/0/0/CPU0:XRv-3#</code></pre><p>You can see the ABR&apos;s are advertising the default route, as the attached-bit is set:</p><pre><code>RP/0/0/CPU0:XRv-9#show isis database | i &quot;LSPID|1/0&quot;

LSPID                 LSP Seq Num  LSP Checksum  LSP Holdtime  ATT/P/OL
XRv-2.00-00           0x00000007   0x4e2e        594             1/0/0
XRv-3.00-00           0x00000008   0x80ea        602             1/0/0
RP/0/0/CPU0:XRv-9#
RP/0/0/CPU0:XRv-9#show route isis


i*L1 0.0.0.0/0 [115/20] via 10.7.9.7, 00:10:10, GigabitEthernet0/0/0/1
               [115/20] via 10.8.9.8, 00:10:10, GigabitEthernet0/0/0/0
i ia 10.255.255.1/32 [115/30] via 10.7.9.7, 00:10:10, GigabitEthernet0/0/0/1
                     [115/40] via 10.8.9.8, 00:10:10, GigabitEthernet0/0/0/0 (!)
i L1 10.255.255.2/32 [115/20] via 10.7.9.7, 00:10:34, GigabitEthernet0/0/0/1
i L1 10.255.255.3/32 [115/20] via 10.8.9.8, 00:10:10, GigabitEthernet0/0/0/0
i ia 10.255.255.4/32 [115/40] via 10.7.9.7, 00:10:10, GigabitEthernet0/0/0/1 (!)
                     [115/30] via 10.8.9.8, 00:10:10, GigabitEthernet0/0/0/0
i ia 10.255.255.5/32 [115/50] via 10.7.9.7, 00:10:10, GigabitEthernet0/0/0/1 (!)
                     [115/40] via 10.8.9.8, 00:10:10, GigabitEthernet0/0/0/0
i ia 10.255.255.6/32 [115/40] via 10.7.9.7, 00:10:10, GigabitEthernet0/0/0/1
                     [115/50] via 10.8.9.8, 00:10:10, GigabitEthernet0/0/0/0 (!)
i L1 10.255.255.7/32 [115/10] via 10.7.9.7, 00:10:34, GigabitEthernet0/0/0/1
i L1 10.255.255.8/32 [115/10] via 10.8.9.8, 00:10:10, GigabitEthernet0/0/0/0
i ia 10.255.255.10/32 [115/50] via 10.7.9.7, 00:10:10, GigabitEthernet0/0/0/1
                      [115/50] via 10.8.9.8, 00:10:10, GigabitEthernet0/0/0/0
RP/0/0/CPU0:XRv-9#</code></pre><p>XR-9 also has inter-area routes to the loopbacks from the Tier-1 ring. This is because the ABR&apos;s are propagating this through, as shown in the config above and a closer look at the policy:</p><pre><code>RP/0/0/CPU0:XRv-3#show rpl route-policy LOO detail 
Tue Jul 26 02:51:52.019 UTC
prefix-set LOO
  10.255.255.0/24 le 32
end-set
!
route-policy LOO
  if destination in LOO then
    pass
  else
    drop
  endif
end-policy
!
RP/0/0/CPU0:XRv-3#</code></pre><p>This allows XRv-9 to peer with other PE&apos;s to maintain L2VPN/L3VPN services. In this case, it is simply utilizing this policy to peer with the v4 route-reflector, to learn the BGP routing table. </p><pre><code>RP/0/0/CPU0:XRv-9#show bgp sessions


Neighbor        VRF                   Spk    AS   InQ  OutQ  NBRState     NSRState
10.255.255.10   default                 0  6275     0     0  Established  None
203.0.113.6     default                 0   789     0     0  Established  None
RP/0/0/CPU0:XRv-9#</code></pre><h3 id="limiting-the-fib">Limiting the FIB</h3><p>Finally, to not overwhelm the little router&apos;s small TCAM, we are utilizing a table-policy that filters only the routes we want to install in FIB. The most crucial being the route back to the Customer... as only having the default-route would cause a routing loop ping-pong between the ABR&apos;s and XRv-9 (the ABR&apos;s learn the customer prefix via XRv-9, but XRv-9 doesn&apos;t install it in FIB so it&apos;s recursive lookup is via the default route to the ABR&apos;s)</p><figure class="kg-card kg-code-card"><pre><code>RP/0/0/CPU0:XRv-9#show rpl route-policy TBL_PLCY detail 

prefix-set TBL
  203.0.113.0/24 le 32,
  25.54.60.0/24 le 32
end-set
!
route-policy TBL_PLCY
  if destination in TBL then
    pass
  else
    drop
  endif
end-policy
!
RP/0/0/CPU0:XRv-9#


RP/0/0/CPU0:XRv-9#show route bgp


B    25.54.60.0/24 [20/0] via 203.0.113.6, 00:11:14
RP/0/0/CPU0:XRv-9#</code></pre><figcaption>The 203. prefix is just an example of how you would likely want to install your own internal public addressing, if it is routable in the core. I did not implement it so it&apos;s doing nothing in this lab.</figcaption></figure><p>Despite there only being one prefix in FIB, XRv-9 still holds the full table in RIB:</p><pre><code>RP/0/0/CPU0:XRv-9#show bgp ipv4 unicast | b Network

   Network            Next Hop            Metric LocPrf Weight Path
*&gt;i1.1.1.0/30         10.255.255.5             0    100      0 123 ?
*&gt;i1.1.1.100/32       10.255.255.5             0    100      0 123 ?
*&gt;i2.2.2.0/30         10.255.255.1             0    100      0 222 ?
*&gt;i2.2.2.100/32       10.255.255.1             0    100      0 222 ?
*&gt;i8.8.8.0/24         10.255.255.1             0    100      0 222 ?
*&gt;i23.74.88.0/24      10.255.255.1             0    100      0 222 ?
*&gt; 25.54.60.0/24      203.0.113.6              0             0 789 ?
*&gt;i50.50.50.0/24      10.255.255.5             0    100      0 123 ?
*&gt;i60.60.60.0/24      10.255.255.5             0    100      0 123 ?
*&gt;i66.77.230.0/24     10.255.255.1             0    100      0 222 ?
*&gt;i70.20.31.0/30      10.255.255.5             0    100      0 123 ?
*&gt;i70.70.70.0/24      10.255.255.5             0    100      0 123 ?
*&gt;i99.99.99.0/24      10.255.255.1             0    100      0 222 ?
*&gt;i173.45.20.0/24     10.255.255.1             0    100      0 222 ?
*&gt; 203.0.113.4/30     203.0.113.6              0             0 789 ?
*&gt;i209.20.35.0/24     10.255.255.5             0    100      0 123 ?

Processed 16 prefixes, 16 paths
RP/0/0/CPU0:XRv-9#</code></pre><p>Thus it has the capability to advertise this table to CUST-1</p><pre><code>
kazaii@CUST-1:~$ show ip route bgp

B&gt;* 1.1.1.0/30 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 1.1.1.100/32 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 2.2.2.0/30 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 2.2.2.100/32 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 8.8.8.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 23.74.88.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 50.50.50.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 60.60.60.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 66.77.230.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 70.20.31.0/30 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 70.70.70.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 99.99.99.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 173.45.20.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
B&gt;* 209.20.35.0/24 [20/0] via 203.0.113.5, eth0, weight 1, 00:11:53
kazaii@CUST-1:~$</code></pre><p>There, we solved our problem. We now have 7-tuple ECMP hashing and the link to XRv-7 is utilized. This design is fairly un-orthodox for a flat MPLS transport ring; However, it still is far less state than many L2VPN x-connects. </p><h3 id="table-policy-is-is-level-1-caveats">Table-Policy / IS-IS Level-1 Caveats</h3><p>There are &#x2013; of course &#x2013; some caveats to consider... </p><p>First, there is load-balancing, but it still does not consider the true shortest path to the border routers; It simply does flow hashing to determine the next-hop to the ABR&apos;s. I&apos;ll use this perfectly imperfect example:<br></p><pre><code>kazaii@CUST-1:~$ traceroute 209.20.35.1 
traceroute to 209.20.35.1 (209.20.35.1), 30 hops max, 60 byte packets
 1  203.0.113.5 (203.0.113.5)  0.908 ms  0.806 ms  0.786 ms
 2  10.8.9.8 (10.8.9.8)  9.258 ms  9.710 ms  9.690 ms
 3  10.3.8.3 (10.3.8.3)  7.198 ms  7.341 ms  10.798 ms
 4  10.3.4.4 (10.3.4.4)  18.422 ms  18.538 ms  18.689 ms
 5  10.4.5.5 (10.4.5.5)  19.807 ms  20.423 ms  20.400 ms
 6  209.20.35.1 (209.20.35.1)  20.490 ms * *
kazaii@CUST-1:~$ traceroute  60.60.60.60
traceroute to 60.60.60.60 (60.60.60.60), 30 hops max, 60 byte packets
 1  203.0.113.5 (203.0.113.5)  1.090 ms  0.989 ms  0.972 ms
 2  10.7.9.7 (10.7.9.7)  23.659 ms  24.971 ms  24.946 ms
 3  10.2.7.2 (10.2.7.2)  24.850 ms  25.107 ms  25.090 ms
 4  10.1.2.1 (10.1.2.1)  38.416 ms  38.583 ms  38.561 ms
 5  10.1.6.6 (10.1.6.6)  47.487 ms  47.463 ms  47.649 ms
 6  10.5.6.5 (10.5.6.5)  33.546 ms  33.672 ms  33.591 ms
 7  60.60.60.60 (60.60.60.60)  45.792 ms  23.508 ms  21.985 ms
kazaii@CUST-1:~$ </code></pre><p>If you look closely, the first flow went via the optimal path. As XRv-8 is the shortest path to Peer1. Sadly, the second flow went the sub-optimal path, via XRv-7 </p><pre><code>kazaii@Peer-1:~$ show interfaces | match 60.
                 60.60.60.60/24                         
kazaii@Peer-1:~$ show interfaces | match 209.20.
                 209.20.35.1/24                         
kazaii@Peer-1:~$ </code></pre><p>You might want to tackle this by being selective of your prefixes you install in FIB. For example, you could perform some Netflow sampling to determine where most customers are sending and receiving their traffic from. A low hanging fruit would be google&apos;s DNS:</p><pre><code>RP/0/0/CPU0:XRv-9#show run prefix-set TBL

prefix-set TBL
  203.0.113.0/24 le 32,
  25.54.60.0/24 le 32,
  8.8.8.0/24 le 32
end-set
!

RP/0/0/CPU0:XRv-9#show route bgp


B    8.8.8.0/24 [200/0] via 10.255.255.1, 00:00:31
B    25.54.60.0/24 [20/0] via 203.0.113.6, 00:00:31
RP/0/0/CPU0:XRv-9#                         
RP/0/0/CPU0:XRv-9#
RP/0/0/CPU0:XRv-9#show cef 8.8.8.0 | i &quot;/24|adja|hop&quot;

8.8.8.0/24, version 150, internal 0x1000001 0x0 (ptr 0xa143c374) [1], 0x0 (0x0), 0x0 (0x0)
 local adjacency 10.7.9.7
    next hop 10.255.255.1/32 via 10.255.255.1/32
RP/0/0/CPU0:XRv-9#
RP/0/0/CPU0:XRv-9#traceroute 8.8.8.8 so lo0


Type escape sequence to abort.
Tracing the route to 8.8.8.8

 1  10.7.9.7 [MPLS: Label 16001 Exp 0] 9 msec  0 msec  0 msec 
 2  10.2.7.2 [MPLS: Label 16001 Exp 0] 0 msec  0 msec  0 msec 
 3  10.1.2.1 0 msec  0 msec  0 msec 
 4  8.8.8.8 0 msec  0 msec  0 msec 
RP/0/0/CPU0:XRv-9#</code></pre><p>Secondly, since Segment Routing Fast-Reroute is calculated based on the IS-IS topology, we broke FRR:</p><pre><code>RP/0/0/CPU0:XRv-9#show isis fast-reroute  | utility egrep -B2 &quot;No&quot;

       E - EIGRP, A - access/subscriber, M - mobile, a - application
       i - IS-IS (redistributed from another instance)
       D - Downstream, LC - Line card disjoint, NP - Node protecting
--
L1 10.255.255.2/32 [20/115]
     via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0
       No FRR backup
--
L1 10.255.255.3/32 [20/115]
     via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0
       No FRR backup
--
L1 10.255.255.7/32 [10/115]
     via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0
       No FRR backup
--
L1 10.255.255.8/32 [10/115]
     via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0
       No FRR backup
RP/0/0/CPU0:XRv-9#</code></pre><p>That&apos;s because the Level-1 and Level-2 topologies are separate. The link between the ABR&apos;s is Level-2, thus breaking the topology ring. The simple fix is the make the circuit between the ABR&apos;s a Level 1-2 circuit. This adds a bit of overhead... but the Tier 1 router can handle it:</p><figure class="kg-card kg-code-card"><pre><code>P/0/0/CPU0:XRv-2#show isis interface gigabitEthernet 0/0/0/1 | i 1-2 

  Circuit Type:             level-1-2
RP/0/0/CPU0:XRv-2#
RP/0/0/CPU0:XRv-2#show isis adjacency | i &quot;Level|XRv-3&quot;

IS-IS zeal Level-1 adjacencies:
XRv-3          Gi0/0/0/1        0c50.dac2.0001 Up    21   00:00:17 Yes None None
IS-IS zeal Level-2 adjacencies:
XRv-3          Gi0/0/0/1        0c50.dac2.0001 Up    28   00:46:31 Yes None None
RP/0/0/CPU0:XRv-2


RP/0/0/CPU0:XRv-3#show isis interface gigabitEthernet 0/0/0/0 | i 1- 

  Circuit Type:             level-1-2
RP/0/0/CPU0:XRv-3#
RP/0/0/CPU0:XRv-3#show isis adjacency | i &quot;Level|XRv-2&quot;

IS-IS zeal Level-1 adjacencies:
XRv-2          Gi0/0/0/0        0cc6.415c.0002 Up    8    00:04:37 Yes None None
IS-IS zeal Level-2 adjacencies:
XRv-2          Gi0/0/0/0        0cc6.415c.0002 Up    7    00:50:53 Yes None None
RP/0/0/CPU0:XRv-3#


RP/0/0/CPU0:XRv-9#show isis fast-reroute | utility egrep -i &quot;/32|/0|backup&quot;

IS-IS zeal IPv4 Unicast FRR backups
       P - Primary path, SRLG - SRLG disjoint, TM - Total metric via backup
df 0.0.0.0/0 [20/115]
     via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0
       FRR backup via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0, Metric: 20
     via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0
       FRR backup via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0, Metric: 20
ia 10.255.255.1/32 [30/115]
     via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0
       FRR backup via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0, Metric: 40
L1 10.255.255.2/32 [20/115]
     via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0
       FRR backup via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0, Metric: 30
L1 10.255.255.3/32 [20/115]
     via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0
       FRR backup via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0, Metric: 30
ia 10.255.255.4/32 [30/115]
     via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0
       FRR backup via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0, Metric: 40
ia 10.255.255.5/32 [40/115]
     via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0
       FRR backup via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0, Metric: 50
ia 10.255.255.6/32 [40/115]
     via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0
       FRR backup via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0, Metric: 50
L1 10.255.255.7/32 [10/115]
     via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0
         Backup path: TI-LFA (srlg), via 10.8.9.8, GigabitEthernet0/0/0/0 XRv-8, SRGB Base: 16000, Weight: 0
L1 10.255.255.8/32 [10/115]
     via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0
         Backup path: TI-LFA (srlg), via 10.7.9.7, GigabitEthernet0/0/0/1 XRv-7, SRGB Base: 16000, Weight: 0
ia 10.255.255.10/32 [50/115]
     via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0
       FRR backup via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0, Metric: 50
     via 10.7.9.7, GigabitEthernet0/0/0/1, XRv-7, SRGB Base: 16000, Weight: 0
       FRR backup via 10.8.9.8, GigabitEthernet0/0/0/0, XRv-8, SRGB Base: 16000, Weight: 0, Metric: 50
RP/0/0/CPU0:XRv-9</code></pre><figcaption>FRR is working again!</figcaption></figure><p></p><p>Thirdly, we noted at the beginning the NCS540 has a lot of scale issues. Not just the total amount of prefixes it can hold, but also the 4096 ECMP FEC limitation. </p><p>You could combat this with a similar strategy of advertising a default route from the ABR&apos;s to the Tier 3 PE&apos;s in the L3VPN VRF. Then you could selectively import the prefixes with a route-policy &amp; prefix-set</p><pre><code>RP/0/0/CPU0:XRv-9(config)#show configuration 

Building configuration...
!! IOS XR Configuration 6.1.3
vrf TEST
 address-family ipv4 unicast
  import route-policy DEFAULT_ONLY
  import route-target
   6275:999
  !
  export route-target
   6275:999
  !
 !
!
end

RP/0/0/CPU0:XRv-9(config)#</code></pre><p>The final drawback is that IS-IS area in the net address.... to configure that in a greenfield network? No problem. Configuring this in a production ring will cause IS-IS to re-form adjacencies, effectively causing ring breaks in our example topology. Be sure to do this during an outage window.</p><h3 id="the-things-we-do-for-capex">The things we do for CapEx</h3><p>For me, this design is a lot easier to trace &amp; troubleshoot than entropy labels &amp; pseudowires. I suppose the <em>much easier </em>solution would be to spend more money on bigger routers. If only...</p>]]></content:encoded></item><item><title><![CDATA[Without a Trace]]></title><description><![CDATA[<p>How do you find problems in your network? Are you confident you <a href="https://archive.nanog.org/sites/default/files/10_Roisman_Traceroute.pdf">understand</a> tools like Traceroute? Are you familiar with how to read state in your topology? What if traceroute does not apply, like when you are tracing MACs in an L2 network? What about when traceroute is not available?</p>]]></description><link>https://zealnetworks.ca/without-a-trace/</link><guid isPermaLink="false">62cf52d6c923990001c27e41</guid><category><![CDATA[Routing]]></category><category><![CDATA[ios-xr]]></category><category><![CDATA[troubleshooting]]></category><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Thu, 14 Jul 2022 02:13:57 GMT</pubDate><content:encoded><![CDATA[<p>How do you find problems in your network? Are you confident you <a href="https://archive.nanog.org/sites/default/files/10_Roisman_Traceroute.pdf">understand</a> tools like Traceroute? Are you familiar with how to read state in your topology? What if traceroute does not apply, like when you are tracing MACs in an L2 network? What about when traceroute is not available? </p><p>Let&apos;s utilize another hypothetical scenario:</p><p>Susan, a talented member of the sysadmin team, advises Mike, from the NOC, of intermittent slowness between two points in a client&apos;s managed network. Because Susan is a pro, she provides the source &amp; destination IP, the application Network name, and some captures &amp; outputs. </p><p>She advises that some application flows &#x2013; &#xA0;like curl &#x2013; seem to be nearly instant in transmission; However, her current SSH session &amp; icmp echo requests/replies seem to be plagued with delay. She also advises that she sees no indication of packet loss.</p><pre><code>susan@Host-1:~$ ping 10.20.20.20 -c 3
PING 10.20.20.20 (10.20.20.20) 56(84) bytes of data.
64 bytes from 10.20.20.20: icmp_seq=1 ttl=60 time=208 ms
64 bytes from 10.20.20.20: icmp_seq=2 ttl=60 time=207 ms
64 bytes from 10.20.20.20: icmp_seq=3 ttl=60 time=273 ms

--- 10.20.20.20 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 207.702/229.974/273.545/30.816 ms
susan@Host-1:~$ </code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2022/07/ssh_capture_gns3_trace_latency.png" class="kg-image" alt loading="lazy" width="1305" height="413" srcset="https://zealnetworks.ca/content/images/size/w600/2022/07/ssh_capture_gns3_trace_latency.png 600w, https://zealnetworks.ca/content/images/size/w1000/2022/07/ssh_capture_gns3_trace_latency.png 1000w, https://zealnetworks.ca/content/images/2022/07/ssh_capture_gns3_trace_latency.png 1305w" sizes="(min-width: 1200px) 1200px"></figure><p>For this scenario, I am utilizing my SR refresher lab again. I have built a EVPN-SR Route-Type 5 (L3VPN) connection between XRv-1 &amp; XRv-10</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2022/07/topology_latency_trace.png" class="kg-image" alt loading="lazy" width="1820" height="911" srcset="https://zealnetworks.ca/content/images/size/w600/2022/07/topology_latency_trace.png 600w, https://zealnetworks.ca/content/images/size/w1000/2022/07/topology_latency_trace.png 1000w, https://zealnetworks.ca/content/images/size/w1600/2022/07/topology_latency_trace.png 1600w, https://zealnetworks.ca/content/images/2022/07/topology_latency_trace.png 1820w" sizes="(min-width: 1200px) 1200px"></figure><p>Mike knows that traceroute would produce less than desirable results:</p><pre><code>RP/0/0/CPU0:XRv-1#traceroute 10.255.255.10 so lo0
Sun Jul 10 17:00:02.890 UTC

Type escape sequence to abort.
Tracing the route to 10.255.255.10

 1   * 
    10.9.10.10 0 msec  * 
RP/0/0/CPU0:XRv-1</code></pre><p>Why is this so? Because someone decided to obfuscate the main thing traceroute relies on, TTL.</p><pre><code>RP/0/0/CPU0:XRv-1#show run | i propa
Sun Jul 10 17:01:02.001 UTC
Building configuration...
mpls ip-ttl-propagate disable
RP/0/0/CPU0:XRv-1#</code></pre><p>Mike now considers how he will sniff out this latency. He could check the logs of various routers for issues; Yet, how would he know which routers the flow would traverse? He knows that the equal cost paths of the routers provides multiple ways to reach the Z-end, but the ultimate path is determined by the <a href="https://www.cisco.com/c/en/us/td/docs/routers/ncs6000/software/addr-serv/configuration/guide/b_ipaddr_cg50ncs/b_ipaddr_cg50ncs_chapter_011.html">7-tuple hash calculation</a>. He also knows that traceroute might cause him to miss something &#x2013; due to the <a href="https://paris-traceroute.net/about/">paris traceroute</a> problem &#x2013; even if he found a way to perform one.</p><p>Mike desperately hopes that the issue is perhaps with the CE routers, or the last mile, as that would be a toss-over to field ops.</p><pre><code>RP/0/0/CPU0:XRv-1# ping 10.10.10.10  vrf CUST-1
Sun Jul 10 17:07:02.890 UTC
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.10.10.10, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms
RP/0/0/CPU0:XRv-1#

RP/0/0/CPU0:XRv-10#ping 10.20.20.20  vrf CUST-1
Sun Jul 10 17:07:37.458 UTC
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.20.20.20, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms
RP/0/0/CPU0:XRv-10#</code></pre><p>Clean as a whistle; Darn. It&apos;s time to put the work in. </p><p>Mike has to utilize commands that expose the actual forwarding state &#x2013; i.e. CEF / FIB &#x2013; rather than what the RIB advises <em>could</em> take place. He reviews Cisco IOS-XR documentation, the packet captures variables, and produces the following command:</p><p><code>show cef vrf CUST-1 exact-route 10.10.10.10 10.20.20.20 protocol tcp source-port 41890 destination-port 22 ingress-interface gigabitEthernet 0/0/0/1</code></p><pre><code>RP/0/0/CPU0:XRv-1#show cef vrf CUST-1 exact-route 10.10.10.10 10.20.20.20 prot$
Sun Jul 10 17:28:54.670 UTC
10.20.20.0/24, version 5, internal 0x1000001 0x0 (ptr 0xa143c3f4) [1], 0x0 (0x0), 0x208 (0xa15832d0)
 Updated Jul 13 23:29:08.783 
 local adjacency 10.1.2.2
 Prefix Len 24, traffic index 0, precedence n/a, priority 3
   via GigabitEthernet0/0/0/0
   via 10.255.255.10/32, 3 dependencies, recursive [flags 0x6000]
    path-idx 0 NHID 0x0 [0xa15ebdf4 0x0]
    recursion-via-/32
    next hop VRF - &apos;default&apos;, table - 0xe0000000
    next hop 10.255.255.10/32 via 16010/0/21
     next hop 10.1.2.2/32 Gi0/0/0/0    labels imposed {16010 81539}
RP/0/0/CPU0:XRv-1#
RP/0/0/CPU0:XRv-1#ping 10.1.2.2 count 100                 
Sun Jul 10 17:28:55.990 UTC
Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.1.2.2, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (100/100), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:XRv-1#
</code></pre><p>Mike then moves onto XRv-2. He then considers the next command he needs to consider the full packet flow, as XRv-2 is a P router simply forwarding the encapsulated packets; It does not have knowledge of the <code>CUST-1</code> VRF. <br></p><p>He knows that 16010 is the outer label and 81539 is the service label &#x2013; or the bottom label. All other parameters have not changed. He considers the following two commands:</p><p><code>show mpls forwarding exact-route label 16010 ipv4 10.10.10.10 10.20.20.20 protocol tcp source-port 41890 destination-port 22 ingress-interface gigabitEthernet 0/0/0/0 detail</code></p><p><code>show mpls forwarding exact-route label 16010 bottom-label 81539 protocol tcp source-port 41890 destination-port 22 ingress-interface gigabitEthernet 0/0/0/0 detail</code></p><p>They&apos;re not quite right.... so he scours his documentation and finds the following:</p><p><code>show mpls forwarding exact-route label-stack {16010 81539} ipv4 10.10.10.10 10.20.20.20 protocol tcp source-port 41890 destination-port 22 ingress-interface gigabitEthernet 0/0/0/0 detail</code></p><p>Perfect. Mike utilizes his IS-IS adjacency, to determine the ingress interface each router will receive the packet on. He then runs the above command and determines the next-hop. He will ping each hop and continue on, until he finds the problematic router or link. </p><pre><code>RP/0/0/CPU0:XRv-2#show isis topology | utility egrep -iw XRv-1
Sun Jul 10 17:44:53.815 UTC
XRv-1           10      XRv-1           Gi0/0/0/0       0c97.2455.0001
RP/0/0/CPU0:XRv-2#show mpls forwarding exact-route label-stack {16010 81539} i$
Sun Jul 10 17:45:14.903 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes       
Label  Label       or ID              Interface                    Switched    
------ ----------- ------------------ ------------ --------------- ------------
16010  16010       SR Pfx (idx 10)    Gi0/0/0/2    10.2.7.7        N/A         
     Updated: Jul 10 16:23:42.658
     Via: Gi0/0/0/2, Next Hop: 10.2.7.7
     Label Stack (Top -&gt; Bottom): { 16010 }
     NHID: 0x0, Encap-ID: N/A, Path idx: 0, Backup path idx: 0, Weight: 0
     MAC/Encaps: 14/18, MTU: 1500

RP/0/0/CPU0:XRv-2#ping 10.2.7.7 count 100 
Sun Jul 10 17:45:25.512 UTC
Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.2.7.7, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (100/100), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:XRv-2#

RP/0/0/CPU0:XRv-7# show isis adjacency | i XRv-2                               
Sun Jul 10 17:45:46.211 UTC
XRv-2          Gi0/0/0/0        0c3a.f889.0003 Up    26   01:22:25 Yes None None
RP/0/0/CPU0:XRv-7#show mpls forwarding exact-route label-stack {16010 81539} i$
Sun Jul 10 17:45:52.241 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes       
Label  Label       or ID              Interface                    Switched    
------ ----------- ------------------ ------------ --------------- ------------
16010  16010       SR Pfx (idx 10)    Gi0/0/0/3    10.6.7.6        N/A         
     Updated: Jul 10 16:23:44.659
     Via: Gi0/0/0/3, Next Hop: 10.6.7.6
     Label Stack (Top -&gt; Bottom): { 16010 }
     NHID: 0x0, Encap-ID: N/A, Path idx: 0, Backup path idx: 0, Weight: 0
     MAC/Encaps: 14/18, MTU: 1500

RP/0/0/CPU0:XRv-7#ping 10.6.7.6 count 100
Sun Jul 10 17:46:07.299 UTC
Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.6.7.6, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (100/100), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:XRv-7#


RP/0/0/CPU0:XRv-6#show isis adjacency | i XRv-7
Sun Jul 10 17:46:30.248 UTC
XRv-7          Gi0/0/0/5        0cf0.832b.0004 Up    9    01:23:08 Yes None None
RP/0/0/CPU0:XRv-6#show mpls forwarding exact-route label-stack {16010 81539} i$
Sun Jul 10 17:46:34.228 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes       
Label  Label       or ID              Interface                    Switched    
------ ----------- ------------------ ------------ --------------- ------------
16010  16010       SR Pfx (idx 10)    Gi0/0/0/3    10.6.9.9        N/A         
     Updated: Jul 10 16:23:44.049
     Via: Gi0/0/0/3, Next Hop: 10.6.9.9
     Label Stack (Top -&gt; Bottom): { 16010 }
     NHID: 0x0, Encap-ID: N/A, Path idx: 0, Backup path idx: 0, Weight: 0
     MAC/Encaps: 14/18, MTU: 1500

RP/0/0/CPU0:XRv-6#ping 10.6.9.9 count 100
Sun Jul 10 17:46:40.547 UTC
Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.6.9.9, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (100/100), round-trip min/avg/max = 199/204/299 ms
RP/0/0/CPU0:XRv-6#</code></pre><p>Wow. There it is. 200ms of latency! He quickly moves to the other router to see if the latency seems to be specific to the link, or the router:</p><pre><code>RP/0/0/CPU0:XRv-9#ping 10.9.10.10 count 100 
Sun Jul 10 17:48:16.181 UTC
Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.9.10.10, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (100/100), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:XRv-9#show isis adjacency | i XRv-6
Sun Jul 10 17:48:46.749 UTC
XRv-6          Gi0/0/0/1        0c83.0a4f.0004 Up    7    01:25:24 Yes None None
RP/0/0/CPU0:XRv-9#

RP/0/0/CPU0:XRv-10#  ping 10.9.10.9 count 100 
Sun Jul 10 17:48:22.900 UTC
Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 10.9.10.9, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (100/100), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:XRv-10#</code></pre><p>Both tests are clean. The issue does not appear to be XRv-9 itself. The issue seems to be when packets flow on the link between XRv-6 &amp; XRv-9. Mike passes the ticket over to the TNOC. The TNOC finds an issue with one of the DWDM shelves and takes action.</p><p>After this is completed, Susan is happy to find that SSH is now responsive and her packets are flowing without issue:</p><pre><code>susan@Host-1:~$ ping 10.20.20.1 -c 3
PING 10.20.20.1 (10.20.20.1) 56(84) bytes of data.
64 bytes from 10.20.20.1: icmp_seq=1 ttl=61 time=7.94 ms
64 bytes from 10.20.20.1: icmp_seq=2 ttl=61 time=8.39 ms
64 bytes from 10.20.20.1: icmp_seq=3 ttl=61 time=8.30 ms

--- 10.20.20.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 7.948/8.215/8.399/0.220 ms
susan@Host-1:~$ </code></pre><p>Ask yourself how you would trace a flow in your network</p>]]></content:encoded></item><item><title><![CDATA[What's changed?]]></title><description><![CDATA[<p>In Episode 134 of the The Hedge podcast, Russ White reminisces on his experience in Cisco TAC. Russ states that clients would often try to suggest they&apos;ve encountered bugs/defects causing major outages, when &#x2013; in reality &#x2013; they were often Network changes gone wrong.</p><blockquote>Whatever it was</blockquote>]]></description><link>https://zealnetworks.ca/whats-changed/</link><guid isPermaLink="false">62c0889a31a4c60001afa4f8</guid><category><![CDATA[ios]]></category><category><![CDATA[iosxr]]></category><category><![CDATA[ios-xr]]></category><category><![CDATA[changemanagement]]></category><category><![CDATA[summarization]]></category><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Sun, 03 Jul 2022 22:12:02 GMT</pubDate><content:encoded><![CDATA[<p>In Episode 134 of the The Hedge podcast, Russ White reminisces on his experience in Cisco TAC. Russ states that clients would often try to suggest they&apos;ve encountered bugs/defects causing major outages, when &#x2013; in reality &#x2013; they were often Network changes gone wrong.</p><blockquote>Whatever it was you &apos;<em>didn&apos;t change</em>&apos;, change it back<br>- Russ White</blockquote><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://rule11.tech/hedge-134-ten-things/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Hedge 134: Ten Things</div><div class="kg-bookmark-description">One of the many reasons engineers should work for a vendor, consulting company, or someone other than a single network operator at some point in their career is to develop a larger view of network &#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i0.wp.com/rule11.tech/wp-content/uploads/cropped-rule11-logo-square.png?fit=192%2C192&amp;ssl=1" alt><span class="kg-bookmark-author">rule 11 reader</span><span class="kg-bookmark-publisher">author page</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i0.wp.com/rule11.tech/wp-content/uploads/cropped-rule11-logo-square.png?fit=512%2C512&amp;ssl=1" alt></div></a><figcaption>Here is the episode in question. I highly recommend you subscribe to his Podcast.</figcaption></figure><p>In my personal experience, I&apos;ve found this insight to be true. Most network outages seem to be caused by lack of peer review, lack of testing, careless implementation, lack of change control oversight, and various other lacks of control over operations.</p><h3 id="example-scenario">Example Scenario</h3><p>Let me make a theoretical example to demonstrate. Picture an early afternoon on a beautiful July day. The NOC was out of their chairs, chatting, laughing, and discussing their activities for the upcoming weekend. Suddenly, the board went <strong>red</strong>. Moments later, tickets started to roll through the floodgates. Apps were down, customers were down &#x2013; &#xA0;there was now a Priority One incident in progress. </p><p>What&apos;s the problem? Just another day in Ops Life, no? Unfortunately, nobody had any clue what had happened. One eager operator scrolled through their alarm board and found no indication of fault; No LOS condition, adjacency lost, core device offline, etc. </p><p>What could have happened here?</p><h3 id="topology">Topology</h3><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2022/07/image.png" class="kg-image" alt loading="lazy" width="1451" height="771" srcset="https://zealnetworks.ca/content/images/size/w600/2022/07/image.png 600w, https://zealnetworks.ca/content/images/size/w1000/2022/07/image.png 1000w, https://zealnetworks.ca/content/images/2022/07/image.png 1451w" sizes="(min-width: 1200px) 1200px"><figcaption>Obviously not a 1:1 intepretation of a production network</figcaption></figure><p>To demonstrate this outage, I am using my GNS3 lab above, intended for my Segment Routing testing/refresher. This is typically a flat IS-IS topology; However, I&apos;ve changed the adjacency between <code>XRv-1</code> &amp; <code>XRv-2</code> from IS-IS to BGP. </p><p>I&apos;ve also created a set amount of &quot;Networks&quot; to be advertised to the core via <code>XRv-2</code>. These networks are then summarized via an aggregate route. This method is not uncommon to advertise a set of prefixes from a DC, region, domain, etc.</p><pre><code>RP/0/0/CPU0:XRv-1#show ip int br | i Loo  
Sat Jul  2 17:51:54.871 UTC
Loopback0                      10.255.255.1    Up              Up       default 
Loopback48                     10.48.48.1      Up              Up       default 
Loopback50                     10.50.50.1      Up              Up       default 
Loopback51                     10.50.51.1      Up              Up       default 
Loopback52                     10.50.52.1      Up              Up       default 
Loopback53                     10.50.53.1      Up              Up       default 
Loopback54                     10.50.54.1      Up              Up       default 
Loopback55                     10.50.55.1      Up              Up       default 
Loopback56                     10.50.56.1      Up              Up       default 
Loopback57                     10.50.57.1      Up              Up       default 
Loopback58                     10.50.58.1      Up              Up       default 
Loopback60                     10.60.60.1      Up              Up       default 
Loopback61                     10.60.61.1      Up              Up       default 
Loopback62                     10.60.62.1      Up              Up       default 
RP/0/0/CPU0:XRv-1#

RP/0/0/CPU0:XRv-1# show run router bgp 1 address-family ipv4 unicast     
Sat Jul  2 18:22:26.476 UTC
router bgp 1
 address-family ipv4 unicast
  aggregate-address 10.48.0.0/12 summary-only
  redistribute connected
 !
!

RP/0/0/CPU0:XRv-1#show bgp sessions
Sat Jul  2 18:24:15.598 UTC

Neighbor        VRF                   Spk    AS   InQ  OutQ  NBRState     NSRState
10.1.2.2        default                 0     2     0     0  Established  None
RP/0/0/CPU0:XRv-1#


RP/0/0/CPU0:XRv-2#show bgp ipv4 unicast neighbors 10.1.2.1 received routes | b Network
Sat Jul  2 18:27:02.247 UTC
   Network            Next Hop            Metric LocPrf Weight Path
*&gt; 10.1.2.0/24        10.1.2.1                 0             0 1 ?
*&gt; 10.48.0.0/12       10.1.2.1                               0 1 i
*&gt; 10.255.255.1/32    10.1.2.1                 0             0 1 ?
*&gt; 100.64.0.0/24      10.1.2.1                 0             0 1 ?

Processed 4 prefixes, 4 paths
RP/0/0/CPU0:XRv-2#

RP/0/0/CPU0:XRv-2#show run formal | i redist     
Sat Jul  2 18:27:36.445 UTC
Building configuration...
router isis zeal address-family ipv4 unicast redistribute bgp 2 level-2
router bgp 2 address-family ipv4 unicast redistribute isis zeal
RP/0/0/CPU0:XRv-2#</code></pre><p>The <code>summary-only</code> configuration suppresses any prefixes, within the range of <code>10.48.0.0/12</code> [<em> </em><code>10.48.0.0 - 10.63.255.255</code> ], and advertises only the aggregate route. </p><p>The rest of the core sees this aggregate, due to <code>XRv-2</code>&apos;s redistribution. They can also reach the individual subnets contained within this aggregate.</p><pre><code>RP/0/0/CPU0:XRv-10#show route 10.50.50.1
Sat Jul  2 17:51:33.993 UTC

Routing entry for 10.48.0.0/12
  Known via &quot;isis zeal&quot;, distance 115, metric 40, type level-2
  Installed Jul  2 17:41:16.075 for 00:10:17
  Routing Descriptor Blocks
    10.5.10.5, from 10.255.255.2, via GigabitEthernet0/0/0/0, Protected
      Route metric is 40
    10.9.10.9, from 10.255.255.2, via GigabitEthernet0/0/0/1, Protected
      Route metric is 40
  No advertising protos. 
RP/0/0/CPU0:XRv-10#


RP/0/0/CPU0:XRv-10#ping 10.50.50.1 so lo0
Sat Jul  2 17:52:22.050 UTC
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.50.50.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/2/9 ms
RP/0/0/CPU0:XRv-10#
RP/0/0/CPU0:XRv-10#
RP/0/0/CPU0:XRv-10#ping 10.50.55.1 so lo0
Sat Jul  2 17:52:26.869 UTC
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.50.55.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/9/29 ms
RP/0/0/CPU0:XRv-10#


RP/0/0/CPU0:XRv-10#traceroute 10.50.50.1 so lo0 probe 1         
Sat Jul  2 17:53:18.956 UTC

Type escape sequence to abort.
Tracing the route to 10.50.50.1

 1  10.5.10.5 9 msec 
 2  10.4.5.4 0 msec 
 3  10.3.4.3 0 msec 
 4  10.2.3.2 0 msec 
 5  10.1.2.1 0 msec 
RP/0/0/CPU0:XRv-10#
</code></pre><h3 id="so-what-happened">So what happened?</h3><p>Now begins the story of our outage lottery winner, John Doe. John Doe&apos;s blunder is very much<em> inspired </em>by a similar real-world scenario I witnessed. The topology, impact, and actions are changed, for the sake of discretion. </p><p>John Doe is in the provisioning team. He received a request to decommission the network of a service that had been cancelled. John Doe believed that the change approval process was cumbersome. Thus, he decided that he would quickly delete this network and update the relevant documentation. </p><p>John logged into <code>XRv-1</code> and manually deleted the network. He then went to his long overdue lunch, as it was nearly 2 pm in the afternoon. </p><p>John did <em>not</em> inform the NOC he made this change. He did not utilize monitoring systems to see the impact he caused. He also did not validate the configuration he was implementing.</p><pre><code>RP/0/0/CPU0:XRv-1#
RP/0/0/CPU0:XRv-1#configure 
Sat Jul  2 17:53:43.904 UTC
RP/0/0/CPU0:XRv-1(config)#no interface loopback 5*
RP/0/0/CPU0:XRv-1(config)#commit
Sat Jul  2 17:54:00.703 UTC
RP/0/0/CPU0:XRv-1(config)#end
RP/0/0/CPU0:XRv-1#</code></pre><p>John was in and out of that configuration in ~17 seconds. <br><br>What was the blunder? John&apos;s intended Network to delete was the one attached to <code>Lo58</code>. What did he actually type? <code>Loopback 5*</code> . This <code>&apos;*&apos;</code> acts like a <a href="https://en.wikipedia.org/wiki/Wildcard_character">wildcard</a> character. That means John unintentionally deleted networks <code>50 - 59</code> , along with network <code>58</code>.<br><br>John&apos;s <code>shift</code> key just caused some major impact.</p><h3 id="troubleshooting">Troubleshooting</h3><p>The NOC figures there is a bug, a failed ASIC, a hung router, etc. They engage escalation resource, Jenny Bourne. Jenny decides to trace from a relevant PE router, <code>XRv-10</code>, to the defined networks in outage. </p><pre><code>RP/0/0/CPU0:XRv-10#traceroute 10.50.50.1 so lo0 probe 1 
Sat Jul  2 17:55:17.378 UTC

Type escape sequence to abort.
Tracing the route to 10.50.50.1

 1  10.5.10.5 0 msec 
 2  10.4.5.4 0 msec 
 3  10.3.4.3 0 msec 
 4  10.2.3.2 0 msec 
 5   * 
 6   * 
 7   * 
 8   * 
 9  
RP/0/0/CPU0:XRv-10#
RP/0/0/CPU0:XRv-10#ping 10.50.55.1 so lo0                          
Sat Jul  2 17:54:19.641 UTC
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.50.55.1, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
RP/0/0/CPU0:XRv-10#ping 10.50.50.1 so lo0
Sat Jul  2 17:54:35.460 UTC
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.50.50.1, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
RP/0/0/CPU0:XRv-10#</code></pre><p>This trace shows that, in hop 4, packets get to the link between <code>XRv-3</code> and <code>XRv-2</code>. Then it seems like <code>XRv-2</code> or <code>XRv-1</code> was dropping the traffic. </p><p>She checked Router 2:</p><pre><code>RP/0/0/CPU0:XRv-2#show cef 10.50.50.0 detail  | i &quot;version|via|Inter|Giga&quot;
Sat Jul  2 18:35:02.247 UTC
10.48.0.0/12, version 51, internal 0x1000001 0x0 (ptr 0xa143c1f4) [1], 0x0 (0x0), 0x0 (0x0)
   via 10.1.2.1/32, 2 dependencies, recursive, bgp-ext [flags 0x6020]
    next hop 10.1.2.1/32 via 10.1.2.1/32
    Hash  OK  Interface                 Address
    0     Y   GigabitEthernet0/0/0/0    10.1.2.1       
RP/0/0/CPU0:XRv-2</code></pre><p>This looks alright. <code>XRv-2</code> had a valid route to <code>XRv-1</code> . She then checked router 1.</p><pre><code>RP/0/0/CPU0:XRv-1#show route 10.50.50.1
Sat Jul  2 18:03:16.485 UTC

Routing entry for 10.48.0.0/12
  Known via &quot;bgp 1&quot;, distance 200, metric 0, type locally generated
  Installed Jul  2 17:41:15.775 for 00:22:00
  Routing Descriptor Blocks
    directly connected, via Null0
      Route metric is 0
  No advertising protos. 
RP/0/0/CPU0:XRv-1#</code></pre><p>Next-hop via <code>Null0</code> , that means this router is throwing packets in the garbage. She then checked to see what&apos;s changed on the router.</p><pre><code>RP/0/0/CPU0:XRv-1#show configuration commit list | utility egrep -C1 &quot;~&quot;  
Sat Jul  2 17:57:38.308 UTC
SNo. Label/ID              User      Line                Client      Time Stamp
~~~~ ~~~~~~~~              ~~~~      ~~~~                ~~~~~~      ~~~~~~~~~~
1    1000000064            jdoe    con0_0_CPU0         CLI         Sat Jul  2 17:54:00 2022
RP/0/0/CPU0:XRv-1#</code></pre><h3 id="resolution">Resolution</h3><p>It appears her colleague, John, made a change. She checked to see what it entailed.</p><pre><code>RP/0/0/CPU0:XRv-1#
RP/0/0/CPU0:XRv-1#configure 
Sat Jul  2 17:59:24.871 UTC
RP/0/0/CPU0:XRv-1(config)#
RP/0/0/CPU0:XRv-1(config)#load rollback changes last 1
Building configuration...
Loading.
611 bytes parsed in 1 sec (593)bytes/sec
RP/0/0/CPU0:XRv-1(config)#show commit changes diff 
Sat Jul  2 17:59:46.179 UTC
Building configuration...
!! IOS XR Configuration 6.1.3
+  interface Loopback50
+   ipv4 address 10.50.50.1 255.255.255.255
   !
+  interface Loopback51
+   ipv4 address 10.50.51.1 255.255.255.255
   !
+  interface Loopback52
+   ipv4 address 10.50.52.1 255.255.255.255
   !
+  interface Loopback53
+   ipv4 address 10.50.53.1 255.255.255.255
   !
+  interface Loopback54
+   ipv4 address 10.50.54.1 255.255.255.255
   !
+  interface Loopback55
+   ipv4 address 10.50.55.1 255.255.255.255
   !
+  interface Loopback56
+   ipv4 address 10.50.56.1 255.255.255.255
   !
+  interface Loopback57
+   ipv4 address 10.50.57.1 255.255.255.255
   !
+  interface Loopback58
+   ipv4 address 10.50.58.1 255.255.255.255
   !
end

RP/0/0/CPU0:XRv-1(config)#commit
Sat Jul  2 17:59:52.409 UTC
RP/0/0/CPU0:XRv-1(config)#end
RP/0/0/CPU0:XRv-1#</code></pre><p>She observed that John deleted the networks above. Since customers &amp; the NOC were complaining, and she recognized the networks to be valid for production, she did not hesistate to restore the prefixes. </p><p>Immediately, after the commit, she checked connectivity.</p><pre><code>RP/0/0/CPU0:XRv-10#traceroute 10.50.50.1 so lo0 probe 1 
Sat Jul  2 17:59:57.298 UTC

Type escape sequence to abort.
Tracing the route to 10.50.50.1

 1  10.5.10.5 0 msec 
 2  10.4.5.4 0 msec 
 3  10.3.4.3 0 msec 
 4  10.2.3.2 0 msec 
 5  10.1.2.1 0 msec 
RP/0/0/CPU0:XRv-10#ping 10.50.50.1 so lo0               
Sat Jul  2 18:00:02.288 UTC
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.50.50.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/2/9 ms
RP/0/0/CPU0:XRv-10#  </code></pre><p>Jenny confirmed with the NOC that the board is going green and in-band connectivity appeared restored. </p><h3 id="post-mortem">Post-Mortem</h3><p>Mr. Doe came back from a delicious lunch to find he caused quite a headache for his colleagues. They schedule a meeting and discuss some things that could be done better:</p><p>John could&apos;ve done the following</p><ul><li>Informed <em>anyone</em> in operations, if not the NOC, that he is about to make a change. The details of the change do not matter, as long as <em>someone</em> knows he is working on the network.</li><li>He could&apos;ve ran that same <code>show commit changes diff</code> command Jenny had utilized, prior to hitting commit. That would&apos;ve exposed the gravity of his typo.</li><li>He could&apos;ve added a comment to his change. In the event that this change was more complex, and Jenny had doubts that his change was the clear impact, she could&apos;ve reviewed the change request / documentation related to his config to see what the scope and impact should be:</li></ul><pre><code>RP/0/0/CPU0:XRv-1#
RP/0/0/CPU0:XRv-1#configure 
Sat Jul  2 18:35:14.153 UTC
RP/0/0/CPU0:XRv-1(config)#no interface loopback 5*
RP/0/0/CPU0:XRv-1(config)#commit comment &quot;CRQ1234&quot;
Sat Jul  2 18:35:35.252 UTC
RP/0/0/CPU0:XRv-1(config)#end
RP/0/0/CPU0:XRv-1#


RP/0/0/CPU0:XRv-1#show configuration commit list 1 detail 
Sat Jul  2 18:36:12.599 UTC

   1) CommitId: 1000000069                 Label: NONE
      UserId:   jdoe                       Line:  con0_0_CPU0
      Client:   CLI                        Time:  Sat Jul  2 18:35:35 2022
      Comment:   &quot;CRQ1234&quot; 
RP/0/0/CPU0:XRv-1#

RP/0/0/CPU0:XRv-1

!!! Or: !!!

RP/0/0/CPU0:XRv-1#configure 
Sat Jul  2 18:38:13.711 UTC
RP/0/0/CPU0:XRv-1(config)#no interface loopback 5*
RP/0/0/CPU0:XRv-1(config)#commit comment &quot;Decom Subscriber Net 58&quot;
Sat Jul  2 18:38:25.040 UTC
RP/0/0/CPU0:XRv-1(config)#
RP/0/0/CPU0:XRv-1(config)#
RP/0/0/CPU0:XRv-1(config)#end
RP/0/0/CPU0:XRv-1#

RP/0/0/CPU0:XRv-1#show configuration commit list 1 detail 
Sat Jul  2 18:38:41.769 UTC

   1) CommitId: 1000000073                 Label: NONE
      UserId:   jdoe                       Line:  con0_0_CPU0
      Client:   CLI                        Time:  Sat Jul  2 18:38:25 2022
      Comment:   &quot;Decom Subscriber Net 58&quot; 
RP/0/0/CPU0:XRv-1#</code></pre><p>What could the organization do better?</p><ul><li>Well, it would be great if the NOC received notifications when someone makes a change on a core device. That would&apos;ve provided a timestamp &amp; change location for the NOC to trace down, without Jenny&apos;s help. This could be SNMP traps, or Slack hooks.</li><li>Make it clear to operators that the Network is a controlled utility, not a cowboy ranch. John should&apos;ve created an implementation plan and reviewed it&apos;s contents. He then should&apos;ve submitted a change request to be approved.</li><li>The org should think harder about how they control changes. Maybe it&apos;s time to consider a CI/CD pipeline to decom provisioned resources. The pipeline could even add a comment with the job ID, or the commit id.... Of course, that introduces it&apos;s own set of problems and technical debt. </li></ul><figure class="kg-card kg-code-card"><pre><code>RP/0/0/CPU0:XRv-1#show configuration commit list 1 detail 
Sat Jul  2 18:38:41.769 UTC

   1) CommitId: 1000000073                 Label: NONE
      UserId:   ansible                       Line:  con0_0_CPU0
      Client:   CLI                        Time:  Sat Jul  2 18:38:25 2022
      Comment:   &quot;0ea3815881&quot; 
RP/0/0/CPU0:XRv-1#</code></pre><figcaption>Likely the client would be something more like netconf</figcaption></figure><p>Shoulda&apos;-Woulda&apos;-Coulda&apos;. The only thing for certain would be that John owed Jenny a stiff drink.</p>]]></content:encoded></item><item><title><![CDATA[DBIUA OSPF Continued]]></title><description><![CDATA[OSPF finds a way]]></description><link>https://zealnetworks.ca/ospf-part-2-dbiua/</link><guid isPermaLink="false">619497b87b4d3800011f42c0</guid><category><![CDATA[DBIUA]]></category><category><![CDATA[Routing]]></category><category><![CDATA[Ubiquiti]]></category><category><![CDATA[WISP]]></category><category><![CDATA[OSPF]]></category><category><![CDATA[selfhosted]]></category><dc:creator><![CDATA[Mark Prosser]]></dc:creator><pubDate>Fri, 24 Dec 2021 16:06:05 GMT</pubDate><content:encoded><![CDATA[<p></p><p>When I wrote my last post, a long while ago, I had promised to complete the story; &#xA0;I am now completing that promise in time for Christmas.</p><h3 id="lets-start-with-the-configuration">Let&apos;s start with the configuration </h3><figure class="kg-card kg-code-card"><pre><code>###[OSPF]###

#// protocol config

set protocols ospf area 0 network 10.0.0.0/8
set protocols ospf area 0 network 172.16.0.0/12
set protocols ospf passive-interface default
set protocols ospf passive-interface-exclude {interface name}
set protocols ospf parameters abr-type cisco
set protocols ospf parameters router-id {loopback IP}


#// optional config to advertise a default route to internet 

set protocols ospf default-information originate metric 10
set protocols ospf default-information originate metric-type 1


#// Interface config 

set interfaces ethernet {interface name} ip ospf authentication md5 key-id 1 md5-key {our key}
set interfaces ethernet {interface name} ip ospf cost {10, 50} 

### 10 for primary/members, 50 for backup</code></pre><figcaption>Standardized template for routers</figcaption></figure><p>The above can tell us the following:</p><ol><li>We are enabling OSPF on all interfaces that have an IP in the subnets above.</li><li>All interfaces are passive unless otherwise explicitly enabled (this means they will not form OSPF adjacencies or send Hello packets)</li><li>We are using authentication. This prevents rogue routers on point-to-multipoint radios joining our OSPF network</li><li>We are using static costing (metrics) to control traffic directions (as mentioned in the previous post)</li><li>The routers that are connected to the internet advertise a default route into OSPF. We&apos;ve selected metric type 1 to increment the cost as it passes through hops in the network. This would matter most if we had multiple viable internet connections, at opposite ends of the core ring, or at the end of a spoke chain.</li></ol><h3 id="now-lets-look-at-the-topology">Now let&apos;s look at the Topology</h3><p><br>Through trial and tribulation, we have threaded the needle again and again. The end results are two radio network core &quot;Rings&quot; that connect to our main internet connection, which is a fiber connection on Blakely island. </p><p>We also have a backup radio transit at our Water Tank location.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2021/12/DBIUA_Ring.png" class="kg-image" alt loading="lazy" width="384" height="331"><figcaption>Ring 1 (PoP = point of presence)</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2021/12/DBIUA_Ring_Two.png" class="kg-image" alt loading="lazy" width="384" height="331"><figcaption>Ring 2 (PoP = point of presence)</figcaption></figure><p>This ultimately collapses to make our core ring (with a shortcut path)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2021/12/Combined_Ring.drawio-1.png" class="kg-image" alt loading="lazy" width="439" height="403"><figcaption>Our static costing is revealed here</figcaption></figure><h3 id="connections-to-the-members">Connections to the members</h3><p><br>Each PoP could have multiple relay sites daisy-chained below it. These points have no alternate paths, they are just means to reach members who are further away from one of our PoP&apos;s.</p><figure class="kg-card kg-image-card"><img src="https://zealnetworks.ca/content/images/2021/12/Member_Relay_Routing.drawio.png" class="kg-image" alt loading="lazy" width="649" height="745" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/Member_Relay_Routing.drawio.png 600w, https://zealnetworks.ca/content/images/2021/12/Member_Relay_Routing.drawio.png 649w"></figure><p>In the above diagram, if the connection between Su-PoP and the Watertank fails, there is an alternate path via Ne-PoP; However, if Relay 1 to Relay 2 fails, then everything south of Relay 2 is, unfortunately, down. </p><p>You have to imagine that off of every PoP, there is is at least one relay. Each relay has a PtMP radio that serves another relay, and potentially directly connected members. </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2021/12/Member_Distribution.drawio-1.png" class="kg-image" alt loading="lazy" width="851" height="753" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/Member_Distribution.drawio-1.png 600w, https://zealnetworks.ca/content/images/2021/12/Member_Distribution.drawio-1.png 851w"></figure><h3 id="what-makes-ospf-so-dynamic">What makes OSPF so dynamic?</h3><p></p><p>All the time, OSPF routers are chatting. The two things they are sending are updates on the topology, and heartbeats &#x2013; or keepalives &#x2013; in the form of &quot;Hello&quot; packets.</p><figure class="kg-card kg-image-card"><img src="https://zealnetworks.ca/content/images/2021/12/DBIUA_OSPF_Update.drawio.png" class="kg-image" alt loading="lazy" width="484" height="149"></figure><p>Let&apos;s take a look:</p><figure class="kg-card kg-code-card"><pre><code>root@wt-er:~# tcpdump -i eth0 host 224.0.0.5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:44:26.228788 IP 10.0.0.7 &gt; ospf-all.mcast.net: OSPFv2, Hello, length 64
17:44:26.229488 IP 10.0.0.40 &gt; ospf-all.mcast.net: OSPFv2, Hello, length 64
17:44:29.205888 IP 10.0.0.4 &gt; ospf-all.mcast.net: OSPFv2, Hello, length 64
17:44:29.214227 IP 10.0.0.13 &gt; ospf-all.mcast.net: OSPFv2, Hello, length 64
17:44:31.221995 IP 10.0.0.3 &gt; ospf-all.mcast.net: OSPFv2, Hello, length 64
17:44:31.469316 IP 10.0.0.40 &gt; ospf-all.mcast.net: OSPFv2, LS-Update, length 92
^C
6 packets captured
52 packets received by filter
4 packets dropped by kernel
root@wt-er:~#

</code></pre><figcaption>this capture was only for a handful of seconds</figcaption></figure><p>From this packet capture, we can see that this router at our tank location is receiving multiple keepalives from it&apos;s peers (on a point-to-multipoint radio). <br><br>By default, for broadcast or Point-to-Point interfaces, the interval in which OSPF routers send these hellos is 10 seconds and it will declare the link dead if a hello is not received within 40 seconds</p><p>We can also see that it&apos;s sending these keepalives to the <a href="https://en.wikipedia.org/wiki/Multicast">multicast</a> address of 224.0.0.5 (<a href="https://en.wikipedia.org/wiki/Multicast_address#Notable_IPv4_multicast_addresses">All OSPF Routers</a>). Yes, multicast transport is required for OSPF to work &#x2013; unless you <a href="https://en.wikipedia.org/wiki/Generic_Routing_Encapsulation">encapsulate it</a>. <br><br>If you&apos;re not familiar with multicast, think of it this way. In the song &quot;Hey Ya!&quot;, Andr&#xE9; 3000 yells &quot;Okay now, ladies...&quot; and the <em>only</em> the women respond, &quot;Yeah?&quot;. Well, now imagine he yells out &quot;Hello, OSPF routers [224.0.0.5]&quot;. The routers would know it is they that are being addressed.</p><p>Broadcasts, in the case of ARP, are more like yelling &quot;HEY, EVERYBODY!&quot; ... and continuing with, &quot;.... I&apos;m looking for 10.0.0.25&quot;. Everyone, except for .25, then realizes their attention wasn&apos;t actually needed and discards the message from their brains.</p><p>Continuing on, Let&apos;s take a closer look at a Hello packet:</p><figure class="kg-card kg-code-card"><pre><code>root@wt-er:~# tcpdump -i eth0 host 224.0.0.5 -vv 
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:52:54.281058 IP (tos 0xc0, ttl 1, id 36, offset 0, flags [DF], proto OSPF (89), length 100)
    10.0.0.7 &gt; ospf-all.mcast.net: OSPFv2, Hello, length 64
        Router-ID 172.x.x.15, Backbone Area, Authentication Type: MD5 (2)
        Key-ID: 1, Auth-Length: 16, Crypto Sequence Number: 0x0017be2c
        Options [External]
          Hello Timer 10s, Dead Timer 40s, Mask 255.255.255.0, Priority 1
          Designated Router 10.0.0.40, Backup Designated Router 10.0.0.13
          Neighbor List:
            172.x.x.1
            172.x.x.7
            172.x.x.3
            172.x.x.8
            172.x.x.20</code></pre><figcaption>Loopback IPs redacted</figcaption></figure><p>The above Hello packet shows many things:<br></p><ol><li>A list of our neighbours&apos; neighbours</li><li>It&apos;s network mask</li><li>What Auth type (MD5) and the Key-ID it matches (1)</li><li>Which Area it&apos;s in (backbone / Area 0)</li><li>It&apos;s router-ID (as we set in the config)</li><li>Who it&apos;s Designated Router &amp; Backup DR are (more on that later)<br></li></ol><p>For OSPF routers to start exchanging prefixes, some things must match: </p><ol><li>Area ID</li><li>Authentication (if enabled)</li><li>Hello and Dead Intervals </li><li>MTU Size</li><li>Subnet mask (on broadcast interfaces only)</li></ol><h3 id="redundancy">Redundancy</h3><p>Redundancy comes into play when the primary path, calculated by lowest cost, fails. The OSPF router will wait until the dead timer expires and then re-calculate the best path it knows from the Link-State database. <br></p><p>We can see this below in the scenario where Mr. Tomato wants to send TPS reports to Mr. Skull Racer. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2021/12/DBIUA_Ring_Routing_PreFail.drawio.png" class="kg-image" alt loading="lazy" width="774" height="436" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/DBIUA_Ring_Routing_PreFail.drawio.png 600w, https://zealnetworks.ca/content/images/2021/12/DBIUA_Ring_Routing_PreFail.drawio.png 774w"><figcaption>Ridiculous diagram, I know</figcaption></figure><p>In the scenario, the link between PoP 3 and 4 is struck by lightning (very real possibility, considering we strap majority of our equipment <a href="https://www.youtube.com/watch?v=bG6N11n9XqY">to trees</a>). PoP 3 waits up to 40 seconds to receive a hello packet from PoP 4, then it will declare the path dead and re-calculate to go via the &quot;long-haul&quot; path.<br><br>Beyond that, it will also do the <em>neighbourly</em> thing and update it&apos;s OSPF neighbours that it&apos;s &quot;link state&quot; has changed, thus causing a chain reaction in the Topology to re-calculate a new link-state topology.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2021/12/DBIUA_Ring_Fail.drawio-3.png" class="kg-image" alt loading="lazy" width="774" height="464" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/DBIUA_Ring_Fail.drawio-3.png 600w, https://zealnetworks.ca/content/images/2021/12/DBIUA_Ring_Fail.drawio-3.png 774w"></figure><h3 id="a-magnifying-glass-view">A magnifying glass view</h3><p>To understand how the topology is built, we can look at what happens when a new router comes onto the network. To demonstrate this, I built the following mini lab topology:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2021/12/image-2.png" class="kg-image" alt loading="lazy" width="738" height="787" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/image-2.png 600w, https://zealnetworks.ca/content/images/2021/12/image-2.png 738w" sizes="(min-width: 720px) 720px"><figcaption>All the interface costing is the same. I just moved the internet connection to the &quot;Tank&quot;. Also, VyOS is as close as one can get to EdgeOS code &amp; syntax, within a virtual lab</figcaption></figure><p>When an OSPF router first comes online, it must go through the various OSPF <a href="https://www.cisco.com/c/en/us/support/docs/ip/open-shortest-path-first-ospf/13685-13.html">states</a> to reach the &quot;Full&quot; state with it&apos;s neighbour.</p><p>Once they have proved Bi-directional connectivity (both routers have seen the other routers hello packet), they will both offer a DB Description update. </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2021/12/image-4.png" class="kg-image" alt loading="lazy" width="884" height="627" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/image-4.png 600w, https://zealnetworks.ca/content/images/2021/12/image-4.png 884w"></figure><p>You can see in frame 6, that Router 7 has 442 bytes worth of information to inform Router 8 about. Here&apos;s what that consists of:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2021/12/image-5.png" class="kg-image" alt loading="lazy" width="872" height="614" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/image-5.png 600w, https://zealnetworks.ca/content/images/2021/12/image-5.png 872w"></figure><p>It&apos;s a list of all the Link-State Advertisements (LSAs) it has received. These LSAs were advertised by the routers in the topology. </p><p>For a closer look, we can see this on the router itself.</p><pre><code>vyos@VyOS-7:~$ show ip ospf database 

       OSPF Router with ID (172.16.1.7)

                Router Link States (Area 0.0.0.0)

Link ID         ADV Router      Age  Seq#       CkSum  Link count
172.16.1.1      172.16.1.1       813 0x8000000e 0x70d7 4
172.16.1.2      172.16.1.2       803 0x80000009 0x4b41 3
172.16.1.3      172.16.1.3       802 0x8000000d 0x677b 4
172.16.1.4      172.16.1.4       791 0x8000000c 0xae48 4
172.16.1.5      172.16.1.5       742 0x80000008 0xee7e 3
172.16.1.6      172.16.1.6       803 0x80000008 0x5edd 3
172.16.1.7      172.16.1.7       820 0x80000008 0x79ce 3
172.16.1.8      172.16.1.8       711 0x80000005 0xe4b3 2

                Net Link States (Area 0.0.0.0)

Link ID         ADV Router      Age  Seq#       CkSum
10.1.2.2        172.16.1.2       994 0x80000002 0xc249
10.1.5.5        172.16.1.5        22 0x80000002 0x9b64
10.1.6.6        172.16.1.6      1323 0x80000002 0x8e6d
10.2.3.3        172.16.1.3       572 0x80000002 0xb352
10.3.4.4        172.16.1.4       991 0x80000002 0xa45b
10.3.6.6        172.16.1.6       763 0x80000002 0x8a6d
10.4.5.5        172.16.1.5       952 0x80000002 0x9564
10.4.7.7        172.16.1.7       690 0x80000002 0x7b76
10.7.8.8        172.16.1.8        71 0x80000002 0x687f

                AS External Link States

Link ID         ADV Router      Age  Seq#       CkSum  Route
0.0.0.0         172.16.1.2       723 0x80000004 0x186e E1 0.0.0.0/0 [0x0]

vyos@VyOS-7:~$</code></pre><p>You can see it contains details about the routers on the topology, and the numbers of links they are responsible for. It also contains the prefixes, both internal and external (the default route we injected via our configuration), along with their metrics (cost). </p><p>Let&apos;s look at a prefix more precisely:<br></p><pre><code>vyos@VyOS-7:~$ show ip ospf database network 10.4.5.5   

       OSPF Router with ID (172.16.1.7)

                Net Link States (Area 0.0.0.0)

  LS age: 1087
  Options: 0x2  : *|-|-|-|-|-|E|*
  LS Flags: 0x6  
  LS Type: network-LSA
  Link State ID: 10.4.5.5 (address of Designated Router)
  Advertising Router: 172.16.1.5
  LS Seq Number: 80000002
  Checksum: 0x9564
  Length: 32
  Network Mask: /24
        Attached Router: 172.16.1.4
        Attached Router: 172.16.1.5

vyos@VyOS-7:~$ </code></pre><p>As the the prefix itself subtley hints, we can see this prefix is a /24 that lives between Router 4 &amp; 5. Once router 8 received this in it&apos;s database, and determines it&apos;s the best path, it can then install it in it&apos;s Routing table and Forwarding table.</p><p>In the exchange, you can see there are also LS Requests and LS Updates. This is the routers comparing their databases and making sure that they have the most correct &amp; true information. After an LS Update is sent by a neighbour, the other neighbour will send back an LS Acknowledge, like an Ack to a Syn in TCP.</p><p>Periodically, on your topology, you will see LS Updates flood. Don&apos;t worry, as this is just <em>neighbourly </em>routers advising their neighbours what the current status of their links are. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2021/12/image-6.png" class="kg-image" alt loading="lazy" width="866" height="630" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/image-6.png 600w, https://zealnetworks.ca/content/images/2021/12/image-6.png 866w"><figcaption>Here is router 5 sending it&apos;s update. This was flooded to router 4, 7 and ultimately to router 8</figcaption></figure><h3 id="topology-changes">Topology Changes</h3><p></p><p>Finally, let&apos;s look at a topology change. To simulate a link loss, like in the skull &amp; tomato link failure, I will shutdown the link between router 7 &amp; 8. This will isolate router 8 from the network</p><pre><code>vyos@VyOS-7:~$ show interfaces | match /24
eth0             10.4.7.7/24                       u/u  
eth1             10.7.8.7/24                       u/u  
vyos@VyOS-7:~$ configure 
[edit]
vyos@VyOS-7# set interfaces ethernet eth1 disable
[edit]
vyos@VyOS-7# show | compare
[edit interfaces ethernet eth1]
+disable
[edit]
vyos@VyOS-7# commit;save;exit
Saving configuration to &apos;/config/config.boot&apos;...
Done
exit
vyos@VyOS-7:~$ </code></pre><p>Now let&apos;s see what a packet capture between router 3 &amp; router 4 looks like:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zealnetworks.ca/content/images/2021/12/image-12.png" class="kg-image" alt loading="lazy" width="465" height="122"><figcaption>The packet link capture is one of many beauties provided by GNS3</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2021/12/image-7.png" class="kg-image" alt loading="lazy" width="881" height="747" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/image-7.png 600w, https://zealnetworks.ca/content/images/2021/12/image-7.png 881w"></figure><p>Router 4, who receives the update first, floods it to it&apos;s neighbours, including Router 3. This LS update states It has two updates for a Router-LSA &amp; it&apos;s Network LSA. It now is responsible for links 10.4.7.7 &amp; 172.16.1.7 (note: 10.7.8.7 is absent). </p><p>Also, note the LS Age on the LSAs. For the Router-LSA, it&apos;s LS age is 2 seconds, which is good. For the Network LSA of 10.7.8.7, it&apos;s LS Age is 3600 seconds, which is the maximum. This effectively tells the routers to delete this from their routing table. </p><p>Since Router 7 was the only viable way to reach this prefix from the topology, this route will effectively disappear. As will 172.16.1.8&apos;s prefix, as it was only listed as an attached router on this Network-LSA.</p><figure class="kg-card kg-image-card"><img src="https://zealnetworks.ca/content/images/2021/12/image-8.png" class="kg-image" alt loading="lazy" width="407" height="279"></figure><p><br>Now, let&apos;s restore the link and see what happens</p><pre><code>vyos@VyOS-7:~$ configure 
[edit]
vyos@VyOS-7# delete interfaces ethernet eth1 disable 
[edit]
vyos@VyOS-7# show | compare
[edit interfaces ethernet eth1]
-disable
[edit]
vyos@VyOS-7# commit;save;exit
Saving configuration to &apos;/config/config.boot&apos;...
Done
exit
vyos@VyOS-7:~$ </code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2021/12/image-10.png" class="kg-image" alt loading="lazy" width="872" height="593" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/image-10.png 600w, https://zealnetworks.ca/content/images/2021/12/image-10.png 872w"></figure><p>Router 4 then receives &amp; floods an LS-Update from Router 7. This LS-Update advises that Router 7 now has link-state that includes 10.7.8.0/24 being reachable. </p><p>We&apos;ll also receive the LSA&apos;s from router 8, informing us that this prefix is just fine and we can continue to route to it, restoring connections for our members downstream of router 7</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2021/12/image-11.png" class="kg-image" alt loading="lazy" width="872" height="502" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/image-11.png 600w, https://zealnetworks.ca/content/images/2021/12/image-11.png 872w"></figure><p></p><p>If there is a way, OSPF will find it</p><!--kg-card-begin: html--><iframe src="https://giphy.com/embed/VHW0X0GEQQjiU" width="480" height="287" frameborder="0" class="giphy-embed" allowfullscreen></iframe><p><a href="https://giphy.com/gifs/editingandlayout-VHW0X0GEQQjiU">via GIPHY</a></p><!--kg-card-end: html--><p></p><h3 id="point-to-multipoint-considerations">Point-To-Multipoint Considerations</h3><p></p><p>The last thing I&apos;d like to mention is considerations of bandwidth and flows for PtMP links. When you consider the chatty nature of OSPF (Hellos, Flooding updates, etc.), there&apos;s a lot going on all the time. </p><p>When you imagine a broadcast domain that is setup on a PtMP radio, there could be a lot of routers connected. If each router needs to maintain a full adjancency, there&apos;s a lot of synchronization to be done. </p><p>This could cause bandwidth &amp; packet/frame processing to grow exponentially, when there are more important packets to be pushed like Zoom packets. </p><p>To solve this, OSPF has a process called the <a href="https://www.cisco.com/c/en/us/support/docs/ip/open-shortest-path-first-ospf/7039-1.html#t21">Designated Router (DR) Election</a>. This process essentially elects two routers to be responsible for performing the Sychronization of the Link-State DB with neigbours, drastically cutting down on noise.</p><p>In our Tank example, as we saw in our first tcpdump, there are a fair amount of routers on this segment.</p><pre><code>me@wt-er:~$ show ip ospf neighbor | match &quot;Neig|eth0&quot;
Neighbor ID     Pri   State            Dead Time   Address         Interface           Instance ID
172.x.x.7       1   2-Way/DROther    00:00:31    10.0.0.3        eth0                    0
172.x.x.3       1   2-Way/DROther    00:00:29    10.0.0.4        eth0                    0
172.x.x.15      1   2-Way/DROther    00:00:34    10.0.0.7        eth0                    0
172.x.x.8       1   Full/Backup      00:00:30    10.0.0.13       eth0                    0
172.x.x.20      1   Full/DR          00:00:33    10.0.0.40       eth0                    0
me@wt-er:~$</code></pre><p>By default, OSPF will select the router with the highest priority (you can manually configure this) as the DR and the second highest as the Backup DR (BDR). If all priorities are equal, it will then look for the highest router-id. </p><p>In the above output, .20 is selected as the DR because it has the highest Loopback / Router-ID. &#xA0;Router 15 would typically be the BDR, but it may have not been online / reachable, at the time of DR election. If the DR election were to be done again, it would likely become the BDR. </p><p>You&apos;ll also notice that the other routers do not form a Full adjacency. They stay in the &quot;2-way&quot; state. Do not be alarmed when you see this. This is because they have two-way connectivity, as proven by their hellos, but they do not Exchange DBDs or LSAs.</p><p>Now consider the placement of your Designated router; If your PtMP radio has low bandwidth capability, you might want to be weary of where your DR is placed. </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://zealnetworks.ca/content/images/2021/12/PtMP_Routing.drawio.png" class="kg-image" alt loading="lazy" width="792" height="594" srcset="https://zealnetworks.ca/content/images/size/w600/2021/12/PtMP_Routing.drawio.png 600w, https://zealnetworks.ca/content/images/2021/12/PtMP_Routing.drawio.png 792w"></figure><p>In my mock example above, Su-PoP has two relays connected on a PtMP radio. Relay 2 was selected as the DR (this would not be abnormal, as our router-id increments as we onboard routers farther down the chain). <br><br>As it&apos;s role entails, the DR must keep it&apos;s neighbours informed on the state of the Link-State topology. However, if it is doing so with Relay 1, which is also a PtMP spoke, traffic doubles as it <a href="https://en.wikipedia.org/wiki/Hairpinning">hairpins</a> through the radio at the PoP. This would make the 442 bytes we saw in a previous capture double to to 884 bytes as it hairpins through the radio (442 bytes in, and 442 bytes out).</p><p>This could be problematic, if you have an oversubscribed or low bandwidth capability radio, such as a 900Mhz radio. </p><p>This is also something to consider, should a user behind Relay 1 need to communicate directly with a user behind Relay 2. In this scenario, you might want to consider deploying dedicated radios between the PoP &amp; these relay sites, allowing the router to handle the traffic with dedicated bandwidth, per link.</p><h3 id="conclusion">Conclusion</h3><p>I will say that I am fairly happy with the state of the routing. Things go down, things come back up; OSPF finds a way. It&apos;s also relatively easy to on-board new sites and members, especially after some of the design optimizations Chris has made for the topology.</p><p>We get <strong>a lot </strong>of emails and inquiries from various people around the world, trying to replicate our setup. I hope this post answers most of your questions. I hope the hyperlinks I included expand on your knowledge even further. If not, please do reach out and I will be happy to elaborate.</p><p>If I could offer one piece of advice, It would be to keep it super simple (KISS model); Allow your configuration to be be greater for the sum of it&apos;s parts. </p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p>]]></content:encoded></item></channel></rss>