<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>DevOpsChops Diaries</title>
 <link href="https://devopschops.com/atom.xml" rel="self"/>
 <link href="https://devopschops.com/"/>
 <updated>2023-07-02T21:38:47+00:00</updated>
 <id>https://devopschops.com</id>
 <author>
   <name>Laurence Tennant</name>
   <email>admin@devopschops.com</email>
 </author>

 
 <entry>
   <title>Procrastination</title>
   <link href="https://devopschops.com/blog/procrastination/"/>
   <updated>2023-07-02T00:00:00+00:00</updated>
   <id>https://devopschops.com/blog/procrastination</id>
   <content type="html">&lt;p&gt;When I last blogged here, I was spending a large amount of my free time on the &lt;em&gt;DevOpsChops&lt;/em&gt; side project. The project was taking shape incredibly quickly and I could see myself releasing it in a month or two with the progress being made. Since then, I’ve spent approximately zero time on it.&lt;/p&gt;

&lt;p&gt;The original culprit was winning a Nintendo Switch. I considered giving it away, but first I just had to play &lt;em&gt;Breath of the Wild&lt;/em&gt; as it was heralded as one of the top games of all time. Turns it it’s also a very time-consuming adventure to complete. That ate up almost a month of time. After that I somehow convinced myself that I needed to play some classic PC games as a form of “research” into improving the game aspect of &lt;em&gt;DevOpsChops&lt;/em&gt;. Before I knew it I’d worked through the entire &lt;em&gt;BioShock&lt;/em&gt; series (all excellent), a number of puzzle games like &lt;em&gt;Braid&lt;/em&gt; and &lt;em&gt;Talos Principle&lt;/em&gt;, and even a few VR games.&lt;/p&gt;

&lt;p&gt;I don’t regret that I played these games but I do regret that I haven’t spent any time on &lt;em&gt;DevOpsChops&lt;/em&gt;. There are so many great video games out there and you could spend all your spare time playing them. They seemed to make me lazier, by providing big in-game rewards for straightforward and engaging goal-oriented work.&lt;/p&gt;

&lt;p&gt;Worse, they seemed to sap my creative drive and made me despair of making something cool myself, as the level of craftmanship in games like &lt;em&gt;BioShock&lt;/em&gt; is just awe-inspiring making any indie effort look basic. I need to recognize that few experiences are going to compare to playing one of the top reviewed games ever produced by a large, renowed studio. And that’s fine! There’s a galaxy of space for all sorts of creations to exist and thrive in.&lt;/p&gt;

&lt;p&gt;There’s a regular pattern that myself and many of my friends fall into. We get obsessed by a particular side project or field of study for a while, before something else catches our fancy. In some ways this is an advantage; in the fast moving world of software it’s good to always be experimenting with new technologies, and if a fixation is not particularly healthy (such as video games) it never seems to last too long.&lt;/p&gt;

&lt;p&gt;But it also means that my hard drive and notebooks are full of half-finished projects. When I look through some of these projects, I think, it’s not perfect but people would have liked it, I should have just released it! I’m determined not to let &lt;em&gt;DevOpsChops&lt;/em&gt; be one of those projects.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>CORS Request Failing in Firefox but not Chrome</title>
   <link href="https://devopschops.com/blog/cors-request-firefox/"/>
   <updated>2023-04-06T00:00:00+00:00</updated>
   <id>https://devopschops.com/blog/cors-request-firefox</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;The error&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While developing websites I test in both Chromium and Firefox. I recently ran into a problem where VM launch requests from the DevOpsChops website frontend would always work in Chromium, but would occasionally fail in Firefox. A VM launch request here is an AJAX POST request where a user clicks a button, then waits 3-5 seconds for a VM to be launched and then they get a shell on the VM.&lt;/p&gt;

&lt;p&gt;Specifically, the error appearing in the browser console was: “The Same Origin Policy disallows reading the remote resource at http://127.0.0.1:8888/. (Reason: CORS request did not succeed). Status code: (null)”&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/cors-firefox.png&quot; alt=&quot;CORS request failing in Firefox&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I instinctively searched for the wording of the error, and all the answers were about broken CORS policies. I soon realized that the error I was seeing wasn’t really to do with CORS. It was only reported as a CORS failure since it was a &lt;a href=&quot;https://ieftimov.com/posts/deep-dive-cors-history-how-it-works-best-practices/#preflight-requests&quot;&gt;complex request&lt;/a&gt; (POST request with JSON body) that never got a response. The real issue was not receiving a response from the server.&lt;/p&gt;

&lt;p&gt;So why was I getting a server response in Chromium but not in Firefox? A clue was that this error occurred more often when my CPU was busy. This was related to timing in some way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Further research led to a Mozilla Bugzilla report &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1602154&quot;&gt;“Empty response from POST AJAX request from Datatables”&lt;/a&gt;, where similar behaviour was occurring on POST requests to an interactive tables site, although the response was empty rather than throwing a CORS error. The root cause is that Firefox has a configuration setting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;network.http.network-changed.timeout&lt;/code&gt; which is set to 5 by default. Network requests which are inactive for over 5 seconds are killed.&lt;/p&gt;

&lt;p&gt;When I increased this setting in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;about:config&lt;/code&gt; I no longer faced the error. My long-term fix has been for the DevOpsChops server to keep the connection alive by pushing partial responses until the full response can be sent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Future of Firefox&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But, it does make me think that behaviour like this is part of the reason for Firefox’s decline. Chrome is more tolerant of badly-written websites and the problem with DataTables was never resolved. Many Firefox users won’t bother to figure out why a website won’t work and will simply switch to Chrome. Some technical websites like &lt;a href=&quot;https://kodekloud.com&quot;&gt;KodeKloud&lt;/a&gt; recommend only using Chrome because it’s easier for them than spending the effort on making sure their site is fully compatible.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>5 Games for Learning Linux and the Command Line</title>
   <link href="https://devopschops.com/blog/games-for-learning-linux/"/>
   <updated>2023-03-28T00:00:00+00:00</updated>
   <id>https://devopschops.com/blog/games-for-learning-linux</id>
   <content type="html">&lt;p&gt;The command line presents an interactive environment which can be adapted to games quite easily. A lot of old-school text adventure games like Zork and MUDs were based on the command line. This post focusses rather on games which teach you GNU/Linux-centric command line knowledge in the process of playing.&lt;/p&gt;

&lt;h2 id=&quot;overthewire-bandit-2012&quot;&gt;OverTheWire Bandit (2012?)&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://overthewire.org/wargames/bandit/&quot;&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/bandit.png&quot; alt=&quot;Bandit&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A classic series of command line challenges on a server that is accessed over SSH. User permissions are the mechanism used to restrict access to each level. I put the question mark after 2012 as apparently the original game has been around a lot longer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pros:&lt;/em&gt; Fun variety of challenges that escalate in difficulty and encourage self-study and exploration. Additional wargames dive deeper into areas like binary exploitation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cons:&lt;/em&gt; Aimed at absolute beginners but some will find just the SSHing in and challenge conventions confusing. The password mechanism for accessing the next level is somewhat clunky.&lt;/p&gt;

&lt;h2 id=&quot;command-line-murders-2013&quot;&gt;Command Line Murders (2013)&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/veltman/clmystery&quot;&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/commandlinemurders.png&quot; alt=&quot;Command line murders&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There’s been a murder, and you’re a detective. The evidence is spread out among multiple text files. You have to write text wrangling and filtering commands to narrow down the culprit. There’s also a similar &lt;a href=&quot;https://mystery.knightlab.com/&quot;&gt;murder mystery for SQL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pros:&lt;/em&gt; Great theme, fun premise. Multiple ways to solve. Hints and a cheatsheet are provided for less experienced players.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cons:&lt;/em&gt; Too short, can be solved in less than 10 minutes if you know your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grep&lt;/code&gt;. Could have been designed so that unveiling the final answer was more satisfying.&lt;/p&gt;

&lt;h2 id=&quot;command-challenge-2017&quot;&gt;Command Challenge (2017)&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://cmdchallenge.com/&quot;&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/cmdchallenge.png&quot; alt=&quot;Command challenge&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a series of mini command line tasks that you have to perform, e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Print the relative file paths, one path per line for all filenames that start with &quot;access.log&quot; in the current directory.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pros:&lt;/em&gt; Fast UI and it’s addictive. Alternative solutions are offered which are interesting to read.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cons:&lt;/em&gt; Uses a non-interactive shell with one-shot Docker images rather than providing a realistic environment. Some valid solutions don’t work. Most challenges are easy and it doesn’t scale up to a substantial level of difficulty by the end.&lt;/p&gt;

&lt;h2 id=&quot;bashcrawl-2019&quot;&gt;Bashcrawl (2019)&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://gitlab.com/slackermedia/bashcrawl&quot;&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/bashcrawl.png&quot; alt=&quot;Bashcrawl&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a dungeon crawler game where each room is a directory, objects inside the room are files, and interactive objects are shell scripts. So you naturally have to use command line tools to explore the dungeon.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pros:&lt;/em&gt; The idea of mapping a filesystem to a game environment is a strong one. This feels more like an actual game than any of the others here, and simple commands are learned quickly by repetition.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cons:&lt;/em&gt; Some of the instructions, in trying overly to be noob-friendly (“drag and drop this folder into your terminal”) manage to cause more confusion. Tracking game state is done manually perhaps to teach environment variables but this gets tedious. The game is only for beginners; if you know too much it’s easy to break.&lt;/p&gt;

&lt;h2 id=&quot;sadservers-2022&quot;&gt;SadServers (2022)&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://sadservers.com/&quot;&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/sadservers.png&quot; alt=&quot;Sadservers&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Billed as “like LeetCode for Linux”, this contains a number of individual timed troubleshooting challenges that are similar to hands-on SRE interviews.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pros:&lt;/em&gt; Realistic scenarios that make debugging fun. Not aimed at beginners, the challenges touch on advanced topics. Challenges require you to use tools that help you understand Linux at a deeper level, which you rarely get outside of a real-life context.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cons:&lt;/em&gt; The UI isn’t great and you have to wait a while for instances to launch, which spoils the immersion. Some of the challenges are obscure and don’t clearly communicate a teachable idea.&lt;/p&gt;

&lt;h2 id=&quot;suggested-order&quot;&gt;Suggested order&lt;/h2&gt;

&lt;p&gt;Overall, there’s strong and weak points to each of these games. For complete beginners, Bashcrawl is a great way to start, and after some fluency on the command line has been reached, Command Challenge and Bandit could be used to expand one’s repertoire. After that, Command Line Murders could be considered a fun “final boss” to the Command Challenge. Finally, SadServers is less game-like but still exemplifies the more difficult end of the spectrum of acquiring Linux skills through play.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Announcing DevOpsChops</title>
   <link href="https://devopschops.com/blog/devopschops-progress/"/>
   <updated>2023-03-23T00:00:00+00:00</updated>
   <id>https://devopschops.com/blog/devopschops-progress</id>
   <content type="html">&lt;p&gt;DevOpsChops is a game that I’m building based on the command line. You might need to fullscreen the video to see the demo clearly:&lt;/p&gt;

&lt;video autoplay=&quot;autoplay&quot; loop=&quot;loop&quot; controls=&quot;&quot; style=&quot;width:100%;height:auto;&quot;&gt;
  &lt;source src=&quot;/public/progress.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;

&lt;p&gt;There are number of self-contained challenges which rapidly build up fluency in Linux, networking, cloud, databases and related areas. Challenges on high-level DevOps concepts are also on the roadmap.&lt;/p&gt;

&lt;p&gt;On the backend, the VMs are running on &lt;a href=&quot;https://firecracker-microvm.github.io/&quot;&gt;Firecracker&lt;/a&gt;, so they launch fast and are isolated from the host system. Much of the work so far has been in creating a VM templating system that enables challenges to be fully specified in a few lines of configuration.&lt;/p&gt;

&lt;p&gt;I think that existing DevOps learning resources are pretty dull on average. They tend to overwhelm learners with the massive amount of tools and teach them in a lecture style. What is lost is the idea of &lt;em&gt;play&lt;/em&gt;, where you are motivated to explore and seek out answers for your own problems. Memorising details is unimportant compared to knowing how to diagnose an issue and how to find a solution. Linux, Kubernetes, AWS are complex but (mostly :D) reasonable systems that you can gain an intuition for after enough hands-on experience.&lt;/p&gt;

&lt;p&gt;So that’s why I refer to this project as a game. It borrows ideas from &lt;a href=&quot;https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity)&quot;&gt;CTFs&lt;/a&gt;, in transforming what would otherwise be learning abstruse material into a competitive, social, engaging experience. While fixing systems may be less exciting than pwning them, I aim to make up for this with a sleek platform and well-written content which slowly escalates in difficulty until players find themselves debugging realistic scenarios.&lt;/p&gt;

&lt;p&gt;Software engineers in general say they wish they knew more about these topics. Ultimately, DevOpsChops is an attempt to lower the activation energy and build something which is simply fun to play.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Games and the Future of Education</title>
   <link href="https://devopschops.com/blog/games-future-education/"/>
   <updated>2023-03-20T00:00:00+00:00</updated>
   <id>https://devopschops.com/blog/games-future-education</id>
   <content type="html">&lt;p&gt;I &lt;a href=&quot;https://laurencetennant.com/games-future-education&quot;&gt;wrote up a summary on my main blog&lt;/a&gt; of a talk which makes great points about games design.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Communicating Between Firecracker microVMs using Linux Bridges</title>
   <link href="https://devopschops.com/blog/communicating-between-firecracker-microvms-using-bridges/"/>
   <updated>2023-03-16T00:00:00+00:00</updated>
   <id>https://devopschops.com/blog/communicating-between-firecracker-microvms-using-bridges</id>
   <content type="html">&lt;p&gt;The &lt;a href=&quot;https://github.com/firecracker-microvm/firecracker/blob/main/docs/network-setup.md&quot;&gt;Firecracker doc on network setup&lt;/a&gt; works well for basic use cases. The doc shows you how to communicate between your host and Firecracker VMs, firstly by using a TAP device then in the advanced case by using a bridge device.&lt;/p&gt;

&lt;p&gt;Up until now, I’ve only needed to use host-to-guest communication. But, I now want to enable VMs to network with each other. I created a bridge with its own /24, then attached two TAP devices to it, and launched microVMs configured with IPs in that subnet. Host-to-guest networking still worked, but networking between the VMs did not.&lt;/p&gt;

&lt;h3 id=&quot;unicasts-not-welcome-here&quot;&gt;Unicasts not welcome here&lt;/h3&gt;

&lt;p&gt;More specifically, broadcast packets were being forwarded over the bridge, but not normal unicast packets. For instance I noticed that ARP requests (which are broadcasted to all hosts in a LAN) from one microVM were reaching the other VM. This was seen in the destination VM’s ARP table and in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tcpdump&lt;/code&gt;. But the ARP replies which are unicasted from the receiving host to the requestor were getting dropped between the bridge and the requesting VM. This was odd because the packet MAC addresses matched the TAP devices and everything seemed to be configured correctly.&lt;/p&gt;

&lt;p&gt;I found that nobody on the Internet seems to know how to fix this either. There’s an &lt;a href=&quot;https://github.com/firecracker-microvm/firecracker-demo/issues/18&quot;&gt;issue on the Firecracker GitHub&lt;/a&gt; and posts on StackExchange but no guide or hints anywhere as to how to get Firecracker-to-Firecracker communication working. In fact there’s lots of questions on StackExchange about this bridge behaviour in general, where only broadcasts make it through. Unfortunately the answer was usually that an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iptables&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arptables&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ebtables&lt;/code&gt; rule was interfering, or that a particular &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sysctl&lt;/code&gt; setting had been overlooked (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net.ipv4.ip_forward&lt;/code&gt;), none of which applied in my case.&lt;/p&gt;

&lt;h3 id=&quot;turning-the-bridge-into-a-pseudo-hub&quot;&gt;Turning the bridge into a pseudo-hub&lt;/h3&gt;

&lt;p&gt;After discussing with a friend, I decided that an approach to try was to flush the MAC table of the bridge. Linux bridges behave like switches so with an empty MAC table it should flood all its ports until it knows on which port it can find a device.&lt;/p&gt;

&lt;p&gt;Here’s the setup, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8f4b9e2676&lt;/code&gt; is the bridge and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8f4b9e2676_1&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8f4b9e2676_2&lt;/code&gt; are TAP devices attached to microVMs with internally assigned IP addresses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10.0.80.2&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10.0.80.3&lt;/code&gt; respectively.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ip a
34: 8f4b9e2676: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 32:a4:c3:78:36:a7 brd ff:ff:ff:ff:ff:ff
    inet 10.0.80.1/24 scope global 8f4b9e2676
       valid_lft forever preferred_lft forever
    inet6 fe80::30a4:c3ff:fe78:36a7/64 scope link
       valid_lft forever preferred_lft forever
35: 8f4b9e2676_1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc fq_codel master 8f4b9e2676 state UP group default qlen 1000
    link/ether 56:ea:d1:d7:a1:f4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::54ea:d1ff:fed7:a1f4/64 scope link
       valid_lft forever preferred_lft forever
36: 8f4b9e2676_2: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc fq_codel master 8f4b9e2676 state UP group default qlen 1000
    link/ether 22:19:21:28:85:56 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::2019:21ff:fe28:8556/64 scope link
       valid_lft forever preferred_lft forever
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brctl&lt;/code&gt; you can see the MAC addresses of the interfaces connected to the ports of the bridge:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo brctl showmacs 8f4b9e2676
port no mac addr                is local?       ageing timer
  2     22:19:21:28:85:56       yes                0.00
  2     22:19:21:28:85:56       yes                0.00
  1     56:ea:d1:d7:a1:f4       yes                0.00
  1     56:ea:d1:d7:a1:f4       yes                0.00
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A few &lt;a href=&quot;https://techglimpse.com/convert-linux-bridge-hub-vm-interospection/&quot;&gt;handy guides&lt;/a&gt; say to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brctl setageing 0&lt;/code&gt; in order to make the bridge act like a hub. But, I found it only worked to remove learned MAC addresses, not to remove the MAC addresses marked as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yes&lt;/code&gt; under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is local?&lt;/code&gt;. Still, it’s an important first step although the modern solution is to append &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ageing 0&lt;/code&gt; to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ip link&lt;/code&gt; command when creating the bridge.&lt;/p&gt;

&lt;p&gt;After further research, but there’s really not a lot of good resources on this, it’s possible to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bridge fdb&lt;/code&gt; command to manipulate the routing table at a lower level:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo bridge fdb show | grep 8f4b9e2676
33:33:00:00:00:01 dev 8f4b9e2676 self permanent
01:00:5e:00:00:6a dev 8f4b9e2676 self permanent
33:33:00:00:00:6a dev 8f4b9e2676 self permanent
01:00:5e:00:00:01 dev 8f4b9e2676 self permanent
01:00:5e:00:00:fb dev 8f4b9e2676 self permanent
33:33:ff:78:36:a7 dev 8f4b9e2676 self permanent
33:33:00:00:00:fb dev 8f4b9e2676 self permanent
32:a4:c3:78:36:a7 dev 8f4b9e2676 vlan 1 master 8f4b9e2676 permanent
32:a4:c3:78:36:a7 dev 8f4b9e2676 master 8f4b9e2676 permanent
56:ea:d1:d7:a1:f4 dev 8f4b9e2676_1 vlan 1 master 8f4b9e2676 permanent
56:ea:d1:d7:a1:f4 dev 8f4b9e2676_1 master 8f4b9e2676 permanent
33:33:00:00:00:01 dev 8f4b9e2676_1 self permanent
01:00:5e:00:00:01 dev 8f4b9e2676_1 self permanent
33:33:ff:d7:a1:f4 dev 8f4b9e2676_1 self permanent
33:33:00:00:00:fb dev 8f4b9e2676_1 self permanent
22:19:21:28:85:56 dev 8f4b9e2676_2 vlan 1 master 8f4b9e2676 permanent
22:19:21:28:85:56 dev 8f4b9e2676_2 master 8f4b9e2676 permanent
33:33:00:00:00:01 dev 8f4b9e2676_2 self permanent
01:00:5e:00:00:01 dev 8f4b9e2676_2 self permanent
33:33:ff:28:85:56 dev 8f4b9e2676_2 self permanent
33:33:00:00:00:fb dev 8f4b9e2676_2 self permanent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And delete the routes that set the bridge as the master for the TAP devices:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo bridge fdb del 56:ea:d1:d7:a1:f4 dev 8f4b9e2676_1 master
$ sudo bridge fdb del 22:19:21:28:85:56 dev 8f4b9e2676_2 master
$ sudo brctl showmacs 8f4b9e2676
port no mac addr                is local?       ageing timer
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’s also necessary to configure the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bridge-nf-call-iptables&lt;/code&gt; kernel parameter. This disables packets from passing over the bridge from being processed by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iptables&lt;/code&gt;. I don’t understand why this needs to be done, since I removed all &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iptables&lt;/code&gt; rules and set all policies to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCEPT&lt;/code&gt; and yet networking still didn’t work until I set it:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo sysctl -w net.bridge.bridge-nf-call-iptables=0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And now, amazingly, the inter-microVM communication works! From inside the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10.0.80.2&lt;/code&gt; VM:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ping 10.0.80.3
PING 10.0.80.3 (10.0.80.3) 56(84) bytes of data.
64 bytes from 10.0.80.3: icmp_seq=1 ttl=64 time=1.37 ms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tcpdump&lt;/code&gt; of the bridge shows the packets going back and forth as expected. This feels like a massive hack and I’m not sure why it works when the correct MAC entries didn’t, but until I figure out what was going wrong originally, it will do the job. I only want to connect a maximum of two Firecracker VMs together, so the flooding won’t result in extra network traffic.&lt;/p&gt;

</content>
 </entry>
 

</feed>
