<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>break.build.repeat</title><description>Notes from learning networking, Azure, Bash and system design by doing.</description><link>https://break-build-repeat.uk/</link><item><title>Moving from Ubuntu to Omarchy</title><link>https://break-build-repeat.uk/blog/migrating-ubuntu-to-omarchy/</link><guid isPermaLink="true">https://break-build-repeat.uk/blog/migrating-ubuntu-to-omarchy/</guid><description>No real reason to leave Ubuntu except curiosity. I put Omarchy on a spare SATA SSD and forced myself to get better at Linux.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ubuntu was working fine. Nothing was broken, nothing was annoying me, and I had no good reason to change it.&lt;/p&gt;
&lt;p&gt;I did it anyway, out of curiosity. I’d been hearing about Omarchy, an opinionated Arch-based setup built around the Hyprland tiling window manager, and I wanted to see what it felt like. This is what the first stretch of using it has been like, written while I’m still fumbling for the right keys.&lt;/p&gt;
&lt;h2 id=&quot;why-a-second-drive&quot;&gt;Why a second drive&lt;/h2&gt;
&lt;p&gt;I didn’t want to wipe a working machine on a whim, so I put a spare SATA SSD in the PC and installed Omarchy on that. Ubuntu stayed untouched on its own drive.&lt;/p&gt;
&lt;p&gt;That turned out to be the right call. If I got stuck, or hated it, I could pick the other drive in the boot menu and be back where I started. It took the pressure off. I was trying something out, not betting my main machine on it.&lt;/p&gt;
&lt;h2 id=&quot;moving-everything-over&quot;&gt;Moving everything over&lt;/h2&gt;
&lt;p&gt;This was the part I expected to be painful, and it wasn’t. Getting my stuff from one install to the other was easy, much easier than I’d braced for.&lt;/p&gt;
&lt;p&gt;I moved everything. I had a drive big enough to hold all my data, so there was no deciding what to keep and what to leave behind.&lt;/p&gt;
&lt;p&gt;Having both systems on separate drives in the same machine helped a lot. Nothing felt like it was gone.&lt;/p&gt;
&lt;h2 id=&quot;the-experience&quot;&gt;The experience&lt;/h2&gt;
&lt;p&gt;I like it. I’m still figuring out the keybindings, and my hands keep reaching for the Ubuntu way of doing things, but the overall experience has won me over.&lt;/p&gt;
&lt;p&gt;A tiling window manager changes how you think about windows. Instead of dragging things around and stacking them, you tell the system what you want open and it arranges them. It’s built around the keyboard, which is exactly why my muscle memory is currently useless.&lt;/p&gt;
&lt;p&gt;The thing I notice most is the speed. Ubuntu was never slow, but Omarchy is so quick that it makes Ubuntu feel slower in hindsight.&lt;/p&gt;
&lt;h2 id=&quot;the-real-reason&quot;&gt;The real reason&lt;/h2&gt;
&lt;p&gt;If I’m honest, curiosity was the starting point, but the reason I’m sticking with it is that it forces me to get better at Linux.&lt;/p&gt;
&lt;p&gt;Ubuntu is forgiving. Most things just work, and when they don’t, there’s a button or a Software Center entry that sorts it out. That’s a good thing, but it also means I’ve been able to use Linux for years without properly understanding it. Omarchy puts me closer to the machine. Config lives in files I have to read, and when something isn’t right I have to work out why.&lt;/p&gt;
&lt;p&gt;I work with systems for a living and run a homelab, so that discomfort is the point.&lt;/p&gt;
&lt;h2 id=&quot;what-broke&quot;&gt;What broke&lt;/h2&gt;
&lt;p&gt;Sound. I had no working audio for ages. It turned out to be three separate problems stacked on top of each other, so fixing any one of them still left me with silence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. The wrong default output.&lt;/strong&gt; PipeWire had its default set to “USB Audio S/PDIF Output”, a digital output with nothing connected to it. Everything I played went there, silently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Muted below PipeWire.&lt;/strong&gt; The sound card’s PCM 0 and PCM 1 playback outputs were switched off in the ALSA hardware mixer. That layer sits underneath PipeWire, so the normal volume and mute controls never show it. I turned them back on at 69%.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. A plug that wasn’t properly in.&lt;/strong&gt; The card reported both the speaker and headphone jacks as “not available”. I tried different jacks, direct ALSA test tones and the monitor’s audio, and heard nothing from any of it. The cause was that the plug wasn’t pushed in firmly after I’d briefly unplugged it. Once I seated it properly, the card detected the headphones on the Headphone output. My earlier test beeps had been going to the Speaker output, which is why I never heard them.&lt;/p&gt;
&lt;p&gt;The lesson is that audio on Linux is a stack, and each layer can fail independently: the physical jack, the hardware mixer, then PipeWire’s choice of output. A fault in a lower layer won’t show up in the layers above it. Next time I’ll work from the bottom up and check each layer before assuming the problem is in the one I’m looking at.&lt;/p&gt;
&lt;p&gt;It cost me a lot of time, but I understand how the pieces fit together far better than I did.&lt;/p&gt;
&lt;p&gt;Sound was the big one, but it wasn’t the only thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Per-app settings and tiny fonts.&lt;/strong&gt; Almost everything is customisable on a per-app basis, which is great until you’re the one who has to do it. Text was small at first, and what looked fine in one app was too small in the next. Some apps didn’t load the way I wanted, and fixing each one meant its own bit of fiddling. The flexibility is real, and so is the effort of getting it all how I like it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keybindings.&lt;/strong&gt; Beyond my hands reaching for the Ubuntu shortcuts, I ran into bindings that didn’t do what I expected. In a setup built around the keyboard, a wrong binding stops you in your tracks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dual screens.&lt;/strong&gt; I use two monitors, and they needed different display settings. Each one is configured separately, so the fix for one screen doesn’t carry over to the other.&lt;/p&gt;
&lt;p&gt;The apps I fiddled with most were Visual Studio Code, Blender and my media app.&lt;/p&gt;
&lt;p&gt;I’ll add to this section as I find more.&lt;/p&gt;
&lt;h3 id=&quot;what-other-people-ran-into&quot;&gt;What other people ran into&lt;/h3&gt;
&lt;p&gt;Experiences vary a lot. One &lt;a href=&quot;https://ochagavia.nl/blog/from-wsl-to-bare-metal-linux/&quot;&gt;blogger&lt;/a&gt; found hardware support on a ThinkPad stellar, with a working system minutes after the installer. Others hit trouble. None of the following happened to me, but they’re worth knowing about before you try this yourself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA on first boot.&lt;/strong&gt; A &lt;a href=&quot;https://github.com/basecamp/omarchy/issues/4&quot;&gt;GitHub issue&lt;/a&gt; describes Hyprland stuck in a loop after install on an RTX 4060 Ti, fixed by installing the NVIDIA drivers from a TTY.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arch underneath.&lt;/strong&gt; Omarchy is Arch with opinionated defaults, so you get the rolling release and its sharp edges too. The same blogger thinks Ubuntu Desktop or Fedora KDE would take less tinkering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gaming.&lt;/strong&gt; Compatibility depends on the game, anti-cheat and launcher, so keep a fallback if that matters to you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are individual reports, not proper testing, so treat them as anecdote. The sensible advice is what I did by accident: try it on a spare drive first, and check audio and displays before you commit.&lt;/p&gt;
&lt;h2 id=&quot;where-i-am-now&quot;&gt;Where I am now&lt;/h2&gt;
&lt;p&gt;For now I’m booting Omarchy. Ubuntu is still on its own drive if I need it.&lt;/p&gt;
&lt;p&gt;I’m not done learning it, and I’ll keep updating this post as I experiment. But so far I’m enjoying it, and it’s a good reminder that the best way to learn something is to make yourself live in it.&lt;/p&gt;
</content:encoded><category>linux</category><category>omarchy</category><category>hyprland</category><category>migration</category></item><item><title>Really understanding IPv4 and IPv6</title><link>https://break-build-repeat.uk/blog/really-understanding-ipv4-and-ipv6/</link><guid isPermaLink="true">https://break-build-repeat.uk/blog/really-understanding-ipv4-and-ipv6/</guid><description>I knew what a subnet was. I didn&apos;t know what it was for. An evening with ipconfig and some binary sorted that out.</description><pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve typed &lt;code&gt;ipconfig&lt;/code&gt; thousands of times. I look at the IP address, ignore the two lines underneath it, and get on with my day.&lt;/p&gt;
&lt;p&gt;If you’d asked me last week what a subnet was, I’d have given you a reasonable answer. A range of addresses. A chunk of a network. What I couldn’t have told you is what it’s &lt;em&gt;for&lt;/em&gt;. What does my PC do with that mask? I had the definition and none of the understanding, which is an uncomfortable thing to notice when networking is part of your job.&lt;/p&gt;
&lt;p&gt;So I sat down with my own machine and worked through it from the top. This is what I found, along with the things I got wrong on the way.&lt;/p&gt;
&lt;h2 id=&quot;what-my-machine-told-me&quot;&gt;What my machine told me&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Ethernet adapter Ethernet 3:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   IPv4 Address. . . . . . . . . . . : 192.168.1.181&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Subnet Mask . . . . . . . . . . . : 255.255.255.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Default Gateway . . . . . . . . . : 192.168.1.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;192.168.1.181&lt;/code&gt; is my PC. &lt;code&gt;192.168.1.1&lt;/code&gt; is my router, which Windows calls the default gateway. The mask is the line I’d been ignoring for years, and it turns out to be the interesting one.&lt;/p&gt;
&lt;h2 id=&quot;the-mask-answers-one-question&quot;&gt;The mask answers one question&lt;/h2&gt;
&lt;p&gt;Every time my PC sends anything, it has to decide: is the destination on my network, or somewhere else? If it’s a neighbour, it delivers directly. If it isn’t, it gives the packet to the router and lets the router worry about it.&lt;/p&gt;
&lt;p&gt;The mask is how it decides. Stack the two on top of each other:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Address  192 . 168 .  1  . 181&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Mask     255 . 255 . 255 .  0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Where the mask says &lt;code&gt;255&lt;/code&gt;, that number has to match for someone to be a neighbour. Where it says &lt;code&gt;0&lt;/code&gt;, anything goes. So for me, anything starting &lt;code&gt;192.168.1.&lt;/code&gt; is next door, and everything else goes to the router.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Destination&lt;/th&gt;
&lt;th&gt;Starts &lt;code&gt;192.168.1.&lt;/code&gt;?&lt;/th&gt;
&lt;th&gt;My PC…&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;192.168.1.44&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;delivers it directly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;192.168.2.44&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;hands it to the gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;8.8.8.8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;hands it to the gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The bit that surprised me is that the last two rows are the same. My PC has no idea &lt;code&gt;8.8.8.8&lt;/code&gt; is Google, out on the internet, while &lt;code&gt;192.168.2.44&lt;/code&gt; is a private address. It does one comparison and that’s the end of its involvement.&lt;/p&gt;
&lt;p&gt;It also explains something about my own setup. My &lt;a href=&quot;https://break-build-repeat.uk/projects/family-hub&quot;&gt;homelab&lt;/a&gt; isn’t on that &lt;code&gt;192.168.1.&lt;/code&gt; network. It sits behind its own OPNsense firewall, which is plugged into my router for now while I test it, and it has its own subnets split across VLANs. The house and the homelab aren’t neighbours, so nothing gets from one side to the other without going through that firewall. That makes it the one place I get to decide what’s allowed across. The VLANs are up and running, though there’s still a lot of work to do on them. At least now I understand why the design works.&lt;/p&gt;
&lt;h2 id=&quot;so-whats-a-24&quot;&gt;So what’s a /24?&lt;/h2&gt;
&lt;p&gt;Each of those four numbers is 8 bits, which is why none of them goes above 255. Four numbers, 32 bits in total.&lt;/p&gt;
&lt;p&gt;The mask is a single line drawn through those 32 bits. Everything left of the line is the network, and everything right of it is the individual device. A &lt;code&gt;255&lt;/code&gt; means all 8 bits of that number are on the network side. I’ve got three of those, 3 × 8 is 24, and that’s the whole story behind &lt;code&gt;/24&lt;/code&gt;. It’s the same mask as &lt;code&gt;255.255.255.0&lt;/code&gt;, written in a way that’s quicker to type. The slash style is called CIDR notation.&lt;/p&gt;
&lt;p&gt;It counts locked &lt;em&gt;bits&lt;/em&gt;, not locked numbers. That distinction didn’t seem important until about ten minutes later.&lt;/p&gt;
&lt;p&gt;The picture that made it click for me was a postal address. The network part is the street, the device part is the house number, and the mask tells you where the street name stops.&lt;/p&gt;
&lt;p&gt;Have a play with it. Drag the slider and watch what happens to the line, the mask and the address count:&lt;/p&gt;
&lt;p&gt;&lt;subnet-calc ip=&quot;192.168.1.181&quot; prefix=&quot;24&quot;&gt;&lt;/subnet-calc&gt;&lt;/p&gt;
&lt;h2 id=&quot;when-the-line-lands-in-the-middle-of-a-number&quot;&gt;When the line lands in the middle of a number&lt;/h2&gt;
&lt;p&gt;My PC has a second network adapter that Hyper-V created, and it ruined my nice simple rule:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   IPv4 Address. . . . . . . . . . . : 172.24.160.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Subnet Mask . . . . . . . . . . . : 255.255.240.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;240&quot;&gt;
&lt;li&gt;Not 255, not 0. You can’t say “this number must match” or “this number is free” any more, and this is the point where I had to stop avoiding binary.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each bit is a switch with a fixed value. Add up the ones that are on:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;128  64  32  16   8   4   2   1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; 1   1   1   1    0   0   0   0     = 240&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;128 + 64 + 32 + 16 is 240. The first four switches are on, so in that third number the first four bits belong to the network and the last four belong to the device. Two full numbers plus four bits: 8 + 8 + 4, which is &lt;code&gt;/20&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It leads to something that looks wrong at first. &lt;code&gt;172.24.170.5&lt;/code&gt; is a neighbour of &lt;code&gt;172.24.160.1&lt;/code&gt;. 160 is &lt;code&gt;1010 0000&lt;/code&gt; and 170 is &lt;code&gt;1010 1010&lt;/code&gt;. The first four bits match, and those are the only ones the mask cares about.&lt;/p&gt;
&lt;p&gt;Try the Hyper-V preset in the calculator above and you’ll see the line sitting in the middle of the third number.&lt;/p&gt;
&lt;h2 id=&quot;how-many-devices-fit&quot;&gt;How many devices fit?&lt;/h2&gt;
&lt;p&gt;Only the free bits matter here, and every extra free bit doubles the count.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CIDR&lt;/th&gt;
&lt;th&gt;Free bits&lt;/th&gt;
&lt;th&gt;Addresses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/24&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/23&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/22&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1,024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/21&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;2,048&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/20&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;4,096&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/16&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;65,536&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You lose two from every network. The first address is the name of the network itself, and the last is the broadcast address, which means “everyone here”. So my &lt;code&gt;/24&lt;/code&gt; at home fits 254 devices. Azure keeps five per subnet for itself, so a &lt;code&gt;/24&lt;/code&gt; there gets you 251.&lt;/p&gt;
&lt;p&gt;Move the line left and you get fewer, bigger networks. Move it right and you get more, smaller ones. As far as I can tell, that trade-off is most of what subnet design is.&lt;/p&gt;
&lt;h2 id=&quot;the-things-i-got-wrong&quot;&gt;The things I got wrong&lt;/h2&gt;
&lt;p&gt;All three of these were mine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Counting from zero.&lt;/strong&gt; I confidently said the highest number you can make with four bits was 16. It’s 15. Sixteen is how many values there are, because zero counts as one of them. Then I decided three bits went from 0 to 8. They go from 0 to 7.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thinking a bigger slash means a bigger network.&lt;/strong&gt; I had it the wrong way round. A bigger number after the slash locks more bits, which leaves fewer free ones, so the network is smaller. A &lt;code&gt;/25&lt;/code&gt; is half the size of a &lt;code&gt;/24&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assuming &lt;code&gt;.0&lt;/code&gt; and &lt;code&gt;.255&lt;/code&gt; are always reserved.&lt;/strong&gt; I thought every address ending in those was off limits. That’s a habit from &lt;code&gt;/24&lt;/code&gt;, not the rule. The reserved addresses are the first and last of the whole network, wherever those fall. In my Hyper-V &lt;code&gt;/20&lt;/code&gt;, &lt;code&gt;172.24.160.255&lt;/code&gt; and &lt;code&gt;172.24.161.0&lt;/code&gt; are perfectly ordinary addresses in the middle of the range.&lt;/p&gt;
&lt;h2 id=&quot;and-then-ipv6&quot;&gt;And then IPv6&lt;/h2&gt;
&lt;p&gt;The same &lt;code&gt;ipconfig&lt;/code&gt; output had a few lines I’ve always scrolled straight past. I’ve swapped my real addresses for made-up ones, for reasons that’ll be obvious in a minute:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   IPv6 Address. . . . . . . . . . . : 2001:db8:a1b2:c3d4:7c1e:52a9:f03b:6d84&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Temporary IPv6 Address. . . . . . : 2001:db8:a1b2:c3d4:e9f0:41c7:2b6a:95d3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Default Gateway . . . . . . . . . : fe80::1a2b:3cff:fe4d:5e6f%12&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I knew IPv6 was written in hex. What I hadn’t appreciated was the scale: I’d assumed it was IPv4 with a couple more numbers bolted on the end. It’s 128 bits instead of 32, which is why it needs hex in the first place. Nobody wants to read sixteen dotted decimals.&lt;/p&gt;
&lt;p&gt;The idea underneath is the same one I’d spent the evening on. One line, network on the left, device on the right. It’s nearly always a &lt;code&gt;/64&lt;/code&gt;, so the line sits bang in the middle and you don’t need any of the binary from earlier:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2001:db8:a1b2:c3d4 : 7c1e:52a9:f03b:6d84&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     network      |       device&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A few things do change.&lt;/p&gt;
&lt;p&gt;There’s no NAT. That’s the trick my router uses on IPv4, swapping each device’s private address for its own single public one on the way out. It exists because IPv4 only has about 4.3 billion addresses for the whole planet, so everything in my house has to share. A single IPv6 &lt;code&gt;/64&lt;/code&gt; has around 18 quintillion. Every device gets a real, public address of its own.&lt;/p&gt;
&lt;p&gt;That &lt;code&gt;fe80::&lt;/code&gt; gateway address is link-local, meaning it only works on my own street. It’s how my PC talks to the router without needing a public address to do it.&lt;/p&gt;
&lt;p&gt;And the “temporary” address is a privacy thing. Without NAT, every site I visit sees my PC’s own address. So Windows makes up a second one with a random device half, uses it for outgoing connections, and throws it away after a while. I guessed it was something to do with incognito mode, which was the right idea in the wrong place.&lt;/p&gt;
&lt;h2 id=&quot;hang-on-is-that-safe&quot;&gt;Hang on, is that safe?&lt;/h2&gt;
&lt;p&gt;That was my first reaction. Every device in my house has a public address?&lt;/p&gt;
&lt;p&gt;It turns out NAT was never the thing keeping me safe. It hid my devices by accident, as a side effect of sharing one address. The actual protection is the firewall. By default a home router drops any connection that starts from outside and only lets in replies to things you asked for, and Windows Firewall sits behind that as a second layer.&lt;/p&gt;
&lt;p&gt;An address says where you are. A firewall decides who gets to knock. Azure works the same way: you can give a VM a public IP, and a Network Security Group decides what reaches it.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;
&lt;p&gt;I want to see what NAT does to a packet on its way out of my house. Then DHCP, because something handed my PC that mask and I’d like to know what. After that I’m going to carve up an Azure VNet and get the subnet sizes wrong on purpose.&lt;/p&gt;
&lt;p&gt;Three short posts a week is the plan. If I can’t explain it, I don’t know it.&lt;/p&gt;
</content:encoded><category>networking</category><category>IPv4</category><category>IPv6</category><category>subnetting</category></item></channel></rss>