<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>
    Posts on ForwardingPlane.net
    
    </title>
    <link>https://forwardingplane.net/post/</link>
    <description>Recent content 
    
    in Posts on ForwardingPlane.net
    </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    
    
    <copyright>Copyright (c) 2025, all rights reserved.</copyright>
    <lastBuildDate>Thu, 12 Mar 2026 00:00:00 +0000</lastBuildDate>
    
    
        <atom:link href="https://forwardingplane.net/post/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Linkwarden with docker compose and nginx proxy manager</title>
      <link>https://forwardingplane.net/post/2026-03-12-self-host-linkwarden-docker-compose/</link>
      <pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2026-03-12-self-host-linkwarden-docker-compose/</guid>
      <description>&lt;p&gt;[Linkwarden(https://github.com/linkwarden/linkwarden) is a tool for better managing bookmarks. If you&amp;rsquo;re nything like me, you keep 1000 browser tabs open across a series of profiles, with full intention of revisiting them later, and then never do. A colleague shpoed me linkwarden and I was interested straight away. I did have a few hangups, however:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I don&amp;rsquo;t want to rely on a cloud service if I don&amp;rsquo;t have to&lt;/li&gt;
&lt;li&gt;I prefer to control my own content&lt;/li&gt;
&lt;li&gt;I am not a big fan of docker, which is required for self hosting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I got over the docker hangup since it wasn&amp;rsquo;t really an option to do any other way and got straight to it. Very quickly I ran into the near-universal issues I have with docker:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;poor understanding or lack of attention of networking by the developers (this needs to run over IPv6 for me to use it)&lt;/li&gt;
&lt;li&gt;spotty documentation for running this securely via a SSL enabled web service&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As I have done with other services that require docker, I went to nginx proxy manager. This container is a nice front end for proxying services via SSL / NGINX, and is far easier to wrestle than something like Traefik.&lt;/p&gt;
&lt;p&gt;After much fighting of the docker compose file I ended up with this, which works.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;services:
  postgres:
    image: postgres:16-alpine
    env_file: .env
    restart: always
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    networks:
      - linkwarden-network
  linkwarden:
    env_file: .env
    environment:
      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
    restart: always
    # build: . # uncomment to build from source
    image: ghcr.io/linkwarden/linkwarden:latest # comment to build from source
    ports:
      - 3000:3000
    volumes:
      - ./data:/data/data
    depends_on:
      - postgres
      - meilisearch
    networks:
      - linkwarden-network
  meilisearch:
    image: getmeili/meilisearch:v1.12.8
    restart: always
    env_file:
      - .env
    networks:
      - linkwarden-network
    volumes:
      - ./meili_data:/meili_data
  nginx-proxy-manager:
    image: jc21/nginx-proxy-manager:latest
    container_name: npm
    ports:
      - &amp;quot;81:81&amp;quot;    # Admin interface
      - &amp;quot;80:80&amp;quot;    # HTTP
      - &amp;quot;443:443&amp;quot;  # HTTPS
    volumes:
      - ./npm/data:/data
      - ./npm/letsencrypt:/etc/letsencrypt
    networks:
      - linkwarden-network
networks:
  linkwarden-network:
    driver: bridge
    enable_ipv6: true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This configuration will work with NPM front ending the https pieces, and will also work behind cloudflare. You&amp;rsquo;ll need to find the address of the container to put into the NPM proxy manager. This can be found with the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo docker inspect &amp;lt;container ID&amp;gt; | grep IP&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The output should look similar to&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;buraglio@dockhost1:/opt/linkwarden$ sudo docker inspect af8e7a6c4edd | grep IP
                &amp;quot;RSS_SUBSCRIPTION_LIMIT_PER_USER=&amp;quot;,
                &amp;quot;PIPEDRIVE_CUSTOM_NAME=&amp;quot;,
                &amp;quot;NEXT_PUBLIC_PIPEDRIVE_ENABLED=&amp;quot;,
                &amp;quot;PIPEDRIVE_CLIENT_ID=&amp;quot;,
                &amp;quot;PIPEDRIVE_CLIENT_SECRET=&amp;quot;,
                    &amp;quot;IPAMConfig&amp;quot;: null,
                    &amp;quot;IPAddress&amp;quot;: &amp;quot;172.19.0.4&amp;quot;,
                    &amp;quot;IPPrefixLen&amp;quot;: 16,
                    &amp;quot;IPv6Gateway&amp;quot;: &amp;quot;fd64:b2a0:6eac:1::1&amp;quot;,
                    &amp;quot;GlobalIPv6Address&amp;quot;: &amp;quot;fd64:b2a0:6eac:1::4&amp;quot;,
                    &amp;quot;GlobalIPv6PrefixLen&amp;quot;: 64,
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;for anyone who would rather not deal with this amount of complexity, linkwarden has a &lt;a href=&#34;https://linkwarden.app/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;very reasonable hosted option&lt;/a&gt; .&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mikrotik wireguard optimization</title>
      <link>https://forwardingplane.net/post/2026-02-17-routeros-wireguard-optimization/</link>
      <pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2026-02-17-routeros-wireguard-optimization/</guid>
      <description>&lt;p&gt;Most modern mikrotik can handle reasonable wireguard performance, but it is a CPU based encryption model, so there are some tweaks that can be made to improve performance. The following can be used to optimize for better wireguard behavior. However, it should be noted that unlike the IPSec capabilities that are measured and reported on the Mikrotik product pages for each platform, wireguard limits are not published for any mikrotik platform. This can be translated into &amp;ldquo;you get what you get&amp;rdquo;, essentially, and as stated, wireguard is all CPU based, so perfornmance and scale will be limited by CPU.&lt;/p&gt;
&lt;h3 id=&#34;set-the-queuing-for-the-wan-interface-to-fq-codel-or-cake&#34;&gt;Set the queuing for the WAN interface to &lt;code&gt;fq-codel&lt;/code&gt; or &lt;code&gt;cake&lt;/code&gt;&lt;/h3&gt; &lt;p&gt;&lt;strong&gt;FQ-CoDel&lt;/strong&gt; and &lt;strong&gt;CAKE&lt;/strong&gt; are both modern queue management systems designed to reduce bufferbloat and ensure fair bandwidth distribution, but CAKE offers several enhancements:&lt;/p&gt;
&lt;p&gt;1. &lt;strong&gt;Flow Hashing&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FQ-CoDel&lt;/strong&gt;: Uses a basic hash to assign packets to flows, which can lead to collisions under high flow counts. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CAKE&lt;/strong&gt;: Uses an &lt;strong&gt;8-way set-associative hash&lt;/strong&gt;, drastically reducing collisions and improving flow isolation. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2. &lt;strong&gt;Fairness&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FQ-CoDel&lt;/strong&gt;: Fairness is per-flow—clients with more connections get more bandwidth. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CAKE&lt;/strong&gt;: Adds &lt;strong&gt;per-host fairness&lt;/strong&gt; (via Cobalt), so a client with 10 connections doesn’t dominate one with 1. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3. &lt;strong&gt;Shaping &amp;amp; Overhead Handling&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FQ-CoDel&lt;/strong&gt;: Often paired with a separate shaper (e.g., HTB), increasing CPU use. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CAKE&lt;/strong&gt;: Includes an &lt;strong&gt;integrated shaper&lt;/strong&gt;, is more CPU-efficient, and supports &lt;strong&gt;framing compensation&lt;/strong&gt; (e.g., for PPPoE, ATM). &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4. &lt;strong&gt;MSS &amp;amp; MTU Awareness&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CAKE&lt;/strong&gt;: Tracks packet sizes in &lt;strong&gt;bytes&lt;/strong&gt;, not packets, avoiding issues with large GSO/GRO packets. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FQ-CoDel&lt;/strong&gt;: Uses packet count, which can misrepresent memory usage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;5. &lt;strong&gt;Diffserv Support&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CAKE&lt;/strong&gt;: Built-in &lt;strong&gt;DiffServ mode&lt;/strong&gt; for traffic class prioritization. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FQ-CoDel&lt;/strong&gt;: No native Diffserv support.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/queue type
add kind=cake name=cake
/queue interface
set sfp-sfpplus1 queue=cake
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or, with &lt;code&gt;fq_codel&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/queue type
add kind=fq-codel name=fq-codel
/queue interface
set sfp-sfpplus1 queue=fq-codel
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;disable-fasttrack-for-the-wireguard-interface&#34;&gt;Disable fasttrack for the wireguard interface&lt;/h3&gt; &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/ip firewall raw add action=notrack chain=prerouting in-interface=wg1   
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Set the correct MTU and MSS in order to to account for encapsulation overhead. 
Clamp MSS on TCP traffic to prevent fragmentation.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/ip firewall mangle add protocol=tcp tcp-flags=syn action=change-mss new-mss=1400 chain=forward out-interface=wg1   
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;strong&gt;MTU&lt;/strong&gt; and &lt;strong&gt;MSS&lt;/strong&gt; are related but distinct values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MTU (Maximum Transmission Unit)&lt;/strong&gt; = 1420 bytes: This is the largest IP packet size the WireGuard interface can transmit, including all headers. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MSS (Maximum Segment Size)&lt;/strong&gt; = 1400 bytes: This is the largest payload size for &lt;strong&gt;TCP data&lt;/strong&gt; within that packet, excluding the TCP and IP headers. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The difference accounts for the &lt;strong&gt;40-byte overhead&lt;/strong&gt; of the TCP and IPv4 headers (20 bytes each). Explicitly:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MSS = MTU - 40
1400 = 1420 - 40
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Setting MSS to 1400 ensures that when TCP adds its 40-byte header, the total packet size (1440 bytes) stays safely below the effective path MTU, preventing fragmentation. However, since WireGuard itself adds ~80 bytes of encapsulation overhead, the outer packet must be smaller — therefor setting the WireGuard interface MTU to &lt;strong&gt;1420&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;This combination avoids fragmentation and packet drops, especially on paths with lower MTU or blocked ICMP (which breaks Path MTU Discovery).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>IPv6 address formatting</title>
      <link>https://forwardingplane.net/post/2026-02-06-v6fmt-zsh/</link>
      <pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2026-02-06-v6fmt-zsh/</guid>
      <description>&lt;p&gt;IPv6 has a monumental amount of flexibility. That flexibility flow over into the address format, which can be - in some cases - a bit frustrating. Since IPv6 address can be presented in several ways, and this can be frustrating for those writing code to suport IPv6 or engineers trying to create templates. It can also be painful during troubleshooting. In an effort to craft something that is similar to my &lt;a href=&#34;https://www.forwardingplane.net/configuration-archive/useful-zsh-recipes-for-network-engineers/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;mac address shell tool&lt;/a&gt; , I wanted something similar for IPv6 addresses.&lt;/p&gt;
&lt;p&gt;Remembering that my programming skills are not teriffic, and all self-taught (ok, I leanred some Apple Basic in the 80s, some C in college, and used Perl in the &amp;ldquo;olden days&amp;rdquo;) This proved the rule that developing for all permutations of a valid IPv6 address can be somewhat daunting.&lt;/p&gt;
&lt;p&gt;After a lot of attempts this is what works:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;└─[$] v6fmt 3fff:0209:0001:0000:0000:0000:0000:0001                                                                                                                        [13:33:44]
Expanded:      3fff:0209:0001:0000:0000:0000:0000:0001
Compressed:    3fff:209:1::1
Uppercase:     3FFF:209:1::1
URL format:    [3fff:209:1::1]
Dotted:        3.f.f.f.0.2.0.9.0.0.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1
Binary:        0011111111111111:0000001000001001:0000000000000001:0000000000000000:0000000000000000:0000000000000000:0000000000000000:0000000000000001
Reverse DNS:   1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.9.0.2.0.f.f.f.3.ip6.arpa
Type:          Global Unicast

Compression permutations:
  3fff:209:1:0:0:0:0:1
  3fff:209:1::0:0:1
  3fff:209:1::0:1
  3fff:209:1::1
  3fff:209:1:0::0:1
  3fff:209:1:0::1
  3fff:209:1:0:0::1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Even this seemingly simple bit of text wrangling was painful. there are probably better ways to do this, and likely more simple tools, but I wanted this to be part of my operating shell, so here we are. Add this into your &lt;code&gt;.zshrc&lt;/code&gt; and it should work. I am unsure if it works with bash, but I suspect because of the parameter expansion flags, globbing, and array work that is unique to zsh, it likely will not.&lt;/p&gt;
&lt;p&gt;This is also available in as a web service on &lt;a href=&#34;https://www.ipv6.army/utilities/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ipv6.army&lt;/a&gt;  and as an update to &lt;a href=&#34;https://github.com/buraglio/ipv6utils&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ipv6utils&lt;/a&gt; .&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;v6fmt() {
  local ip=&amp;quot;$1&amp;quot;

  [[ -z &amp;quot;$ip&amp;quot; ]] &amp;amp;&amp;amp; { print -r -- &amp;quot;Usage: v6fmt &amp;lt;ipv6-address&amp;gt;[/prefix-length]&amp;quot; &amp;gt;&amp;amp;2; return 1 }

  # Normalize: lowercase, strip whitespace
  ip=&amp;quot;${ip:l}&amp;quot;
  ip=&amp;quot;${ip//[[:space:]]}&amp;quot;

  # Strip and save optional prefix length
  local prefix_len=&amp;quot;&amp;quot;
  if [[ &amp;quot;$ip&amp;quot; == */* ]]; then
    prefix_len=&amp;quot;${ip#*/}&amp;quot;
    ip=&amp;quot;${ip%/*}&amp;quot;
  fi

  # Strip URL brackets and zone ID
  ip=&amp;quot;${ip#\[}&amp;quot;
  ip=&amp;quot;${ip%\]}&amp;quot;
  ip=&amp;quot;${ip%%\%*}&amp;quot;

  # Handle embedded IPv4 (e.g., ::ffff:192.0.2.1)
  if [[ &amp;quot;$ip&amp;quot; == *:*.* ]]; then
    local v4=&amp;quot;${ip##*:}&amp;quot;
    local v6pfx=&amp;quot;${ip%:*}&amp;quot;
    if [[ &amp;quot;$v4&amp;quot; == *.*.*.* ]]; then
      local -a octs=(${(s:.:)v4})
      local h1 h2
      printf -v h1 &#39;%02x%02x&#39; &amp;quot;${octs[1]}&amp;quot; &amp;quot;${octs[2]}&amp;quot;
      printf -v h2 &#39;%02x%02x&#39; &amp;quot;${octs[3]}&amp;quot; &amp;quot;${octs[4]}&amp;quot;
      ip=&amp;quot;${v6pfx}:${h1}:${h2}&amp;quot;
    fi
  fi

  # Basic validation
  if [[ ! &amp;quot;$ip&amp;quot; =~ ^[0-9a-f:]+$ ]]; then
    print -r -- &amp;quot;Error: Invalid IPv6 address&amp;quot; &amp;gt;&amp;amp;2
    return 1
  fi

  # Expand :: notation
  local prefix suffix zeros_needed full_ip i g
  if [[ &amp;quot;$ip&amp;quot; == *::* ]]; then
    prefix=&amp;quot;${ip%%::*}&amp;quot;
    suffix=&amp;quot;${ip#*::}&amp;quot;

    local pre_count=0 suf_count=0
    for g in ${(s.:.)prefix}; [[ -n &amp;quot;$g&amp;quot; ]] &amp;amp;&amp;amp; ((pre_count++))
    for g in ${(s.:.)suffix}; [[ -n &amp;quot;$g&amp;quot; ]] &amp;amp;&amp;amp; ((suf_count++))

    zeros_needed=$((8 - pre_count - suf_count))
    full_ip=&amp;quot;$prefix&amp;quot;
    for ((i = 0; i &amp;lt; zeros_needed; i++)); do
      full_ip=&amp;quot;${full_ip}:0000&amp;quot;
    done
    [[ -n &amp;quot;$suffix&amp;quot; ]] &amp;amp;&amp;amp; full_ip=&amp;quot;${full_ip}:${suffix}&amp;quot;
    full_ip=&amp;quot;${full_ip#:}&amp;quot;
  else
    full_ip=&amp;quot;$ip&amp;quot;
  fi

  # Split into 8 groups
  local groups=(${(s.:.)full_ip})
  while (( $#groups &amp;lt; 8 )); do groups+=(&#39;0000&#39;); done
  (( $#groups &amp;gt; 8 )) &amp;amp;&amp;amp; groups=(&amp;quot;${(@)groups[1,8]}&amp;quot;)

  # Pad each group to 4 hex digits
  local full_groups=() padded
  for g in $groups; do
    g=&amp;quot;${g#0}&amp;quot;
    [[ -z &amp;quot;$g&amp;quot; ]] &amp;amp;&amp;amp; g=0
    printf -v padded &#39;%04x&#39; &amp;quot;0x${g}&amp;quot;
    full_groups+=(&amp;quot;$padded&amp;quot;)
  done

  # Build expanded string
  local expanded=&amp;quot;${full_groups[1]}&amp;quot;
  for ((i = 2; i &amp;lt;= 8; i++)); do
    expanded=&amp;quot;${expanded}:${full_groups[i]}&amp;quot;
  done

  # Strip leading zeros per group
  local short_groups=()
  for g in $full_groups; do
    while [[ &amp;quot;$g&amp;quot; == 0?* &amp;amp;&amp;amp; &amp;quot;$g&amp;quot; != &amp;quot;0&amp;quot; ]]; do g=&amp;quot;${g#0}&amp;quot;; done
    short_groups+=(&amp;quot;$g&amp;quot;)
  done

  # Build no-compression form
  local nocompress=&amp;quot;${short_groups[1]}&amp;quot;
  for ((i = 2; i &amp;lt;= 8; i++)); do
    nocompress=&amp;quot;${nocompress}:${short_groups[i]}&amp;quot;
  done

  # Find longest run of consecutive zero groups (RFC 5952)
  local best_start=-1 best_len=0 cur_start=-1 cur_len=0
  for ((i = 1; i &amp;lt;= 8; i++)); do
    if [[ &amp;quot;${short_groups[i]}&amp;quot; == &amp;quot;0&amp;quot; ]]; then
      [[ &amp;quot;$cur_start&amp;quot; == -1 ]] &amp;amp;&amp;amp; cur_start=$((i - 1))
      ((cur_len++))
    else
      if (( cur_len &amp;gt; best_len )); then
        best_len=$cur_len
        best_start=$cur_start
      fi
      cur_start=-1
      cur_len=0
    fi
  done
  if (( cur_len &amp;gt; best_len )); then
    best_len=$cur_len
    best_start=$cur_start
  fi

  # Build canonical (compressed) form per RFC 5952
  local canonical
  if (( best_len &amp;gt; 1 )); then
    canonical=&amp;quot;&amp;quot;
    for ((i = 1; i &amp;lt;= 8; i++)); do
      if (( i == best_start + 1 )); then
        canonical=&amp;quot;${canonical}::&amp;quot;
        ((i = best_start + best_len))
        continue
      fi
      [[ -n &amp;quot;$canonical&amp;quot; &amp;amp;&amp;amp; &amp;quot;${canonical[-1]}&amp;quot; != &#39;:&#39; ]] &amp;amp;&amp;amp; canonical=&amp;quot;${canonical}:&amp;quot;
      canonical=&amp;quot;${canonical}${short_groups[i]}&amp;quot;
    done
  else
    canonical=&amp;quot;$nocompress&amp;quot;
  fi

  # === Derived formats ===

  # Suffix for prefix length display
  local sfx=&amp;quot;&amp;quot;
  [[ -n &amp;quot;$prefix_len&amp;quot; ]] &amp;amp;&amp;amp; sfx=&amp;quot;/${prefix_len}&amp;quot;

  # Hex string (32 nibbles, no separators)
  local hex_str=&amp;quot;${expanded//:/}&amp;quot;

  # Dotted notation (each nibble separated by dots)
  local dotted=&amp;quot;&amp;quot;
  for ((i = 1; i &amp;lt;= ${#hex_str}; i++)); do
    (( i &amp;gt; 1 )) &amp;amp;&amp;amp; dotted=&amp;quot;${dotted}.&amp;quot;
    dotted=&amp;quot;${dotted}${hex_str[i]}&amp;quot;
  done

  # Binary representation (16-bit groups separated by :)
  local -A h2b=(
    0 0000 1 0001 2 0010 3 0011
    4 0100 5 0101 6 0110 7 0111
    8 1000 9 1001 a 1010 b 1011
    c 1100 d 1101 e 1110 f 1111
  )
  local binary=&amp;quot;&amp;quot;
  for ((i = 1; i &amp;lt;= ${#hex_str}; i++)); do
    binary=&amp;quot;${binary}${h2b[${hex_str[i]}]}&amp;quot;
    (( i % 4 == 0 &amp;amp;&amp;amp; i &amp;lt; ${#hex_str} )) &amp;amp;&amp;amp; binary=&amp;quot;${binary}:&amp;quot;
  done

  # Reverse DNS (ip6.arpa)
  local rdns=&amp;quot;&amp;quot;
  for ((i = ${#hex_str}; i &amp;gt;= 1; i--)); do
    (( i &amp;lt; ${#hex_str} )) &amp;amp;&amp;amp; rdns=&amp;quot;${rdns}.&amp;quot;
    rdns=&amp;quot;${rdns}${hex_str[i]}&amp;quot;
  done
  rdns=&amp;quot;${rdns}.ip6.arpa&amp;quot;

  # Address type classification
  local addr_type
  if [[ &amp;quot;$expanded&amp;quot; == &amp;quot;0000:0000:0000:0000:0000:0000:0000:0001&amp;quot; ]]; then
    addr_type=&amp;quot;Loopback&amp;quot;
  elif [[ &amp;quot;$expanded&amp;quot; == &amp;quot;0000:0000:0000:0000:0000:0000:0000:0000&amp;quot; ]]; then
    addr_type=&amp;quot;Unspecified&amp;quot;
  elif [[ &amp;quot;$expanded&amp;quot; == 0000:0000:0000:0000:0000:ffff:* ]]; then
    addr_type=&amp;quot;IPv4-Mapped&amp;quot;
  elif [[ &amp;quot;$expanded&amp;quot; == 0064:ff9b:0000:0000:0000:0000:* ]]; then
    addr_type=&amp;quot;NAT64 Well-Known Prefix (RFC 6052)&amp;quot;
  elif [[ &amp;quot;$expanded&amp;quot; == 0064:ff9b:0001:* ]]; then
    addr_type=&amp;quot;NAT64 Local-Use Prefix (RFC 8215)&amp;quot;
  elif [[ &amp;quot;$expanded&amp;quot; == 0100:0000:0000:0000:* ]]; then
    addr_type=&amp;quot;Discard-Only (RFC 6666)&amp;quot;
  elif [[ &amp;quot;$expanded&amp;quot; == 2001:0db8:* ]]; then
    addr_type=&amp;quot;Documentation (RFC 3849)&amp;quot;
  elif [[ &amp;quot;$expanded&amp;quot; == 2001:0000:* ]]; then
    addr_type=&amp;quot;Teredo (RFC 4380)&amp;quot;
  elif [[ &amp;quot;$expanded&amp;quot; == 2002:* ]]; then
    addr_type=&amp;quot;6to4 (RFC 3056)&amp;quot;
  elif [[ &amp;quot;${expanded[1,2]}&amp;quot; == &amp;quot;fe&amp;quot; ]]; then
    case &amp;quot;${expanded[3]}&amp;quot; in
      [89ab]) addr_type=&amp;quot;Link-Local&amp;quot; ;;
      [cdef]) addr_type=&amp;quot;Site-Local (Deprecated)&amp;quot; ;;
      *) addr_type=&amp;quot;Unknown&amp;quot; ;;
    esac
  elif [[ &amp;quot;${expanded[1,2]}&amp;quot; == &amp;quot;fc&amp;quot; || &amp;quot;${expanded[1,2]}&amp;quot; == &amp;quot;fd&amp;quot; ]]; then
    addr_type=&amp;quot;Unique Local Address (ULA)&amp;quot;
  elif [[ &amp;quot;${expanded[1,2]}&amp;quot; == &amp;quot;ff&amp;quot; ]]; then
    case &amp;quot;${expanded[4]}&amp;quot; in
      1) addr_type=&amp;quot;Multicast (Interface-Local)&amp;quot; ;;
      2) addr_type=&amp;quot;Multicast (Link-Local)&amp;quot; ;;
      4) addr_type=&amp;quot;Multicast (Admin-Local)&amp;quot; ;;
      5) addr_type=&amp;quot;Multicast (Site-Local)&amp;quot; ;;
      8) addr_type=&amp;quot;Multicast (Organization-Local)&amp;quot; ;;
      e) addr_type=&amp;quot;Multicast (Global)&amp;quot; ;;
      *) addr_type=&amp;quot;Multicast&amp;quot; ;;
    esac
  elif [[ &amp;quot;${expanded[1]}&amp;quot; == [23] ]]; then
    addr_type=&amp;quot;Global Unicast&amp;quot;
  else
    addr_type=&amp;quot;Reserved&amp;quot;
  fi

  # === Output ===

  printf &#39;%-14s %s\n&#39; &amp;quot;Expanded:&amp;quot; &amp;quot;${expanded}${sfx}&amp;quot;
  printf &#39;%-14s %s\n&#39; &amp;quot;Compressed:&amp;quot; &amp;quot;${canonical}${sfx}&amp;quot;
  printf &#39;%-14s %s\n&#39; &amp;quot;Uppercase:&amp;quot; &amp;quot;${canonical:u}${sfx}&amp;quot;
  printf &#39;%-14s %s\n&#39; &amp;quot;URL format:&amp;quot; &amp;quot;[${canonical}]&amp;quot;
  printf &#39;%-14s %s\n&#39; &amp;quot;Dotted:&amp;quot; &amp;quot;$dotted&amp;quot;
  printf &#39;%-14s %s\n&#39; &amp;quot;Binary:&amp;quot; &amp;quot;$binary&amp;quot;
  printf &#39;%-14s %s\n&#39; &amp;quot;Reverse DNS:&amp;quot; &amp;quot;$rdns&amp;quot;
  printf &#39;%-14s %s\n&#39; &amp;quot;Type:&amp;quot; &amp;quot;$addr_type&amp;quot;

  # Compression permutations
  print &amp;quot;&amp;quot;
  print &amp;quot;Compression permutations:&amp;quot;
  print &amp;quot;  $nocompress&amp;quot;

  local start end sub_start sub_len out
  for ((start = 0; start &amp;lt; 8; )); do
    [[ &amp;quot;${short_groups[start+1]}&amp;quot; != &amp;quot;0&amp;quot; ]] &amp;amp;&amp;amp; { ((start++)); continue }

    end=$start
    while (( end &amp;lt; 8 )) &amp;amp;&amp;amp; [[ &amp;quot;${short_groups[end+1]}&amp;quot; == &amp;quot;0&amp;quot; ]]; do
      ((end++))
    done

    for ((sub_start = start; sub_start &amp;lt;= end - 2; sub_start++)); do
      for ((sub_len = 2; sub_len &amp;lt;= end - sub_start; sub_len++)); do
        out=&amp;quot;&amp;quot;
        for ((i = 1; i &amp;lt;= sub_start; i++)); do
          [[ -n &amp;quot;$out&amp;quot; ]] &amp;amp;&amp;amp; out=&amp;quot;${out}:&amp;quot;
          out=&amp;quot;${out}${short_groups[i]}&amp;quot;
        done
        out=&amp;quot;${out}::&amp;quot;
        for ((i = sub_start + sub_len + 1; i &amp;lt;= 8; i++)); do
          [[ -n &amp;quot;$out&amp;quot; &amp;amp;&amp;amp; &amp;quot;${out[-1]}&amp;quot; != &#39;:&#39; ]] &amp;amp;&amp;amp; out=&amp;quot;${out}:&amp;quot;
          out=&amp;quot;${out}${short_groups[i]}&amp;quot;
        done
        print &amp;quot;  $out&amp;quot;
      done
    done

    ((start = end))
  done
}
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
    <item>
      <title>IPB 193 - IPv6 Basics – Troubleshooting</title>
      <link>https://forwardingplane.net/post/2026-02-05-ipv6buzz-193/</link>
      <pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2026-02-05-ipv6buzz-193/</guid>
      <description>&lt;p&gt;Are you struggling to get IPv6 working, whether in a lab or even a pilot deployment? Ed, Nick, and Tom walk through the essentials of IPv6 troubleshooting, revealing the non-negotiable differences between IPv4 and IPv6 that can trip up even experienced network engineers. They break down why blocking all ICMP, like in v4, will instantly break your v6 network and why understanding multicast is critical to scalable IPv6.&lt;/p&gt;
&lt;p&gt;Have a listen:&lt;/p&gt;
&lt;iframe width=&#34;320&#34; height=&#34;30&#34; src=&#34;https://packetpushers.net/?powerpress_embed=73850-podcast&amp;amp;powerpress_player=mediaelement-audio&#34; title=&#34;Blubrry Podcast Player&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;Episode Links:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://packetpushers.net/podcasts/ipv6-buzz/ipb192-ipv6-lab-update/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IPB192 - IPv6 Lab Update&lt;/a&gt; &lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>IPB 192 - IPv6 Lab Update</title>
      <link>https://forwardingplane.net/post/2026-01-22-ipv6buzz-192/</link>
      <pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2026-01-22-ipv6buzz-192/</guid>
      <description>&lt;p&gt;Thinking of setting up an IPv6 lab this year? Our hosts dive into a major update on building and testing modern IPv6 networks, focusing on the game-changing “IPv6-mostly” architecture. They break down the essential components you need to get this working, including DHCP Option 108 and the nitty gritty of client support.&lt;/p&gt;
&lt;p&gt;In this episode, Tom incorrectly identifies Debian 13 as the platform he got IPv6-mostly working on when in reality it was CentOS 9 Stream. In his defense, Tom had been fixated all week on how cool he thinks Debian is generally (Debian, sadly, doesn’t feel the same way about him) and his old-man brain didn’t catch the error in real time (even after bringing up the EPEL repo). He sincerely regrets and is low-key mortified about the error but doesn’t want any listeners to labor under the misconception that CentOS is a no-go with IPv6-mostly.&lt;/p&gt;
&lt;p&gt;Have a listen:&lt;/p&gt;
&lt;iframe width=&#34;320&#34; height=&#34;30&#34; src=&#34;https://packetpushers.net/?powerpress_embed=73627-podcast&amp;amp;powerpress_player=mediaelement-audio&#34; title=&#34;Blubrry Podcast Player&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;Show links:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://packetpushers.net/podcasts/ipv6-buzz/ipb173-the-ipv6-test-pod-project/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IPB173: The IPv6 Test Pod Project&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/toreanderson/clatd/tree/master&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CLATD: a CLAT / SIIT-DC Edge Relay implementation for Linux&lt;/a&gt; &lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>IPB 191 - IPv6 Predictions for 2026</title>
      <link>https://forwardingplane.net/post/2026-01-08-ipv6buzz-191/</link>
      <pubDate>Thu, 08 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2026-01-08-ipv6buzz-191/</guid>
      <description>&lt;p&gt;Will Microsoft’s CLAT bring widespread adoption rates for IPv6? Will there be significant advancements in corporate and cloud adoption as well? Will this finally be the year we see the fix for the RFC 6724? Ed Horley, Tom Coffeen, and Nick Buraglio make their predictions for the new year in the first IPv6 Buzz of 2026.&lt;/p&gt;
&lt;p&gt;Have a listen:&lt;/p&gt;
&lt;iframe width=&#34;320&#34; height=&#34;30&#34; src=&#34;https://packetpushers.net/?powerpress_embed=73506-podcast&amp;amp;powerpress_player=mediaelement-audio&#34; title=&#34;Blubrry Podcast Player&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt; 
&lt;p&gt;Episode Links:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ipv6.army/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IPv6.army&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://rfc6724.vyncke.org/index.php&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;RFC6724 options picker&lt;/a&gt; &lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hosted email options for 2026</title>
      <link>https://forwardingplane.net/post/2025-12-26-hosted-email-options-2026/</link>
      <pubDate>Fri, 26 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2025-12-26-hosted-email-options-2026/</guid>
      <description>&lt;p&gt;Email. Possibly the most useful and least sexy of the core set of internet applictions. In past lives I ran &lt;a href=&#34;https://en.wikipedia.org/wiki/Microsoft_Exchange_Server&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Microsoft Exchange&lt;/a&gt; , &lt;a href=&#34;https://en.wikipedia.org/wiki/Postfix_%28software%29&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Postfix&lt;/a&gt; , &lt;a href=&#34;https://en.wikipedia.org/wiki/Cc:Mail&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;cc:Mail&lt;/a&gt; , and very, very large &lt;a href=&#34;https://en.wikipedia.org/wiki/Sendmail&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Sendmail&lt;/a&gt;  installations. Since early 2005, though, I have outsourced my own personal email to Google. As an original &amp;ldquo;google Apps for Your Domain&amp;rdquo; tester, I had early access to the bevy of tools that Google had to offer, and at my favorite price - $0.
Occasionally I&amp;rsquo;d look at other options, but I always come back to GSuite.&lt;/p&gt;
&lt;p&gt;This time around I put some time into it, taking some notes and fully intending to try to move my primary domain away. I had a set of &amp;ldquo;must&amp;rdquo; requirements, but am willing to make some major concessions.&lt;/p&gt;
&lt;h3 id=&#34;must-do&#34;&gt;Must do:&lt;/h3&gt; &lt;ul&gt;
&lt;li&gt;Web Interface&lt;/li&gt;
&lt;li&gt;Integrated calendar support&lt;/li&gt;
&lt;li&gt;Vacation / Away message&lt;/li&gt;
&lt;li&gt;Up to 10 users (negotiable - 6 would work)&lt;/li&gt;
&lt;li&gt;Decent Spam control&lt;/li&gt;
&lt;li&gt;Filtering / tagging with robust match criteria&lt;/li&gt;
&lt;li&gt;Reasonably strong email search capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;nice-to-have-no-preference-in-weight&#34;&gt;Nice to have, no preference in weight:&lt;/h3&gt; &lt;ul&gt;
&lt;li&gt;Supports Email Alias&lt;/li&gt;
&lt;li&gt;Supports multi-recepient aliases&lt;/li&gt;
&lt;li&gt;Suports IPv6&lt;/li&gt;
&lt;li&gt;Supports catch-all for domain&lt;/li&gt;
&lt;li&gt;Drive / storage support&lt;/li&gt;
&lt;li&gt;Office / Productivity suite included&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;out-of-scope&#34;&gt;Out of scope&lt;/h3&gt; &lt;ul&gt;
&lt;li&gt;Self Hosting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve tasted that pain and simply have no desire to do it again.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I will also add that I do, in fact, like gmail hosting. It&amp;rsquo;s worked for me for literally two decades. It has essentially everything I need and my requirements are fairly tightly tied to it. Coincidentally, one of the largest concerns I have for this potential move is that 1. I will miss something I truly need, and secondarily, but only slightly, that I will have a bear of a time de-coupling what I use &amp;ldquo;Login with Google&amp;rdquo; for. Ideally those things would all become passkeys, but we all know that process is slow.
A looming, but not insignificant issue, too, is the mining of my data for advertising (kinda came to grips with that, sadly) and more concerningly AI. Google is all-in and I don&amp;rsquo;t necessarily want my personal email to be used for that even if it is largely inevitable due to the sheer footprint of gmail. I like privacy, and did move one of my mail domains to proton for about 8 months a few years ago.&lt;/p&gt;
&lt;p&gt;This is obviously non-comprehensive and should be double checked as things chance and I can make mistakes.&lt;/p&gt;
&lt;h1 id=&#34;comprehensive-family-email-service-comparison-q4-2025--q1-2026&#34;&gt;Comprehensive Family Email Service Comparison (Q4 2025 / Q1 2026)&lt;/h1&gt; Google Workspace • Apple iCloud+ / Apple One Mail • &lt;h2 id=&#34;google-workspace--apple-icloud--apple-one-mail--proton-family-referral-linkhttpsprtnrefxe0ekre2--microsoft-365-family--fastmail--cloudflare-email-routing&#34;&gt;&lt;a href=&#34;https://pr.tn/ref/XE0EKRE2&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Proton Family; Referral Link&lt;/a&gt;  • Microsoft 365 Family • Fastmail • Cloudflare Email Routing&lt;/h2&gt; &lt;p&gt;This post makes an attemt to compare, to the best possible approxomation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google Workspace&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apple iCloud+ / Apple One Mail&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proton Family&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft 365 Family&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fastmail&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Email Routing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;with emphasis on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Custom domains&lt;/li&gt;
&lt;li&gt;Aliases and groups&lt;/li&gt;
&lt;li&gt;Hosting vs forwarding (Cloudflare)&lt;/li&gt;
&lt;li&gt;Ecosystem / apps&lt;/li&gt;
&lt;li&gt;Spam filtering&lt;/li&gt;
&lt;li&gt;IPv6 and standards&lt;/li&gt;
&lt;li&gt;Costs and typical use cases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cloudflare.com/developer-platform/products/email-routing/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cloudflare email routing&lt;/a&gt;  is fundamentally different from the other four: it provides &lt;strong&gt;routing/forwarding&lt;/strong&gt;, not mailboxes or a hosted inbox, but it is powerful and could be used to simply move around an email address.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-overall-positioning&#34;&gt;1. Overall positioning&lt;/h2&gt; &lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Type of service&lt;/th&gt;
&lt;th&gt;Hosting vs forwarding&lt;/th&gt;
&lt;th&gt;Ideal for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Workspace&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full email + productivity suite&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hosting&lt;/strong&gt;: mailboxes + apps&lt;/td&gt;
&lt;td&gt;Families / small orgs wanting Gmail + Docs/Drive/Meet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Apple iCloud+ / One&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Consumer iCloud storage + mail&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hosting&lt;/strong&gt;: mailboxes in Apple&amp;rsquo;s cloud&lt;/td&gt;
&lt;td&gt;All‑Apple households&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Proton Family&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Privacy‑focused encrypted bundle&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hosting&lt;/strong&gt;: encrypted mailboxes&lt;/td&gt;
&lt;td&gt;Families prioritizing privacy and Swiss jurisdiction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft 365 Family&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Consumer Office + Outlook + OneDrive&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hosting&lt;/strong&gt;: Outlook mailboxes&lt;/td&gt;
&lt;td&gt;Families needing Office apps + 1 TB/user storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fastmail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Independent email &amp;amp; calendar service&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hosting&lt;/strong&gt;: mailboxes + calendar/contacts&lt;/td&gt;
&lt;td&gt;Power users wanting flexible, standards-based email with custom domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloudflare Email Routing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Email routing/forwarding layer only&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Forwarding only&lt;/strong&gt;: no inboxes, no sending&lt;/td&gt;
&lt;td&gt;Using your own inbox elsewhere with free custom-domain addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Cloudflare Email Routing acts as an SMTP “traffic director”: it receives mail for your domain, then forwards it on to another mailbox you own (Gmail, Outlook, Proton, etc.). It &lt;strong&gt;does not&lt;/strong&gt; store mail long‑term or provide an inbox, and you cannot send mail directly from Cloudflare’s addresses without pairing it with another outbound provider.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-custom-domains-aliases-and-groups&#34;&gt;2. Custom domains, aliases, and groups&lt;/h2&gt; &lt;h3 id=&#34;21-core-domain--family-structure&#34;&gt;2.1 Core domain &amp;amp; family structure&lt;/h3&gt; &lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Google Workspace&lt;/th&gt;
&lt;th&gt;Apple iCloud+ / One&lt;/th&gt;
&lt;th&gt;Proton Family&lt;/th&gt;
&lt;th&gt;Microsoft 365 Family&lt;/th&gt;
&lt;th&gt;Fastmail&lt;/th&gt;
&lt;th&gt;Cloudflare Email Routing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custom domain for email&lt;/td&gt;
&lt;td&gt;Yes (first‑class)&lt;/td&gt;
&lt;td&gt;Yes via iCloud+&lt;/td&gt;
&lt;td&gt;Yes, multiple domains&lt;/td&gt;
&lt;td&gt;Not in consumer; needs business&lt;/td&gt;
&lt;td&gt;Yes (first‑class, up to 100 domains)&lt;/td&gt;
&lt;td&gt;Yes (for routing only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who owns the mailbox?&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;Apple&lt;/td&gt;
&lt;td&gt;Proton&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;Fastmail (Australian, independent)&lt;/td&gt;
&lt;td&gt;Your downstream provider (Gmail, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;ldquo;Family plan&amp;rdquo; concept&lt;/td&gt;
&lt;td&gt;Business plan used by family&lt;/td&gt;
&lt;td&gt;iCloud Family Sharing&lt;/td&gt;
&lt;td&gt;Dedicated family bundle&lt;/td&gt;
&lt;td&gt;Family plan (up to 6 users)&lt;/td&gt;
&lt;td&gt;Family plan options available&lt;/td&gt;
&lt;td&gt;N/A (per domain; no user accounts)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per‑user separation&lt;/td&gt;
&lt;td&gt;Full accounts&lt;/td&gt;
&lt;td&gt;Individual Apple IDs&lt;/td&gt;
&lt;td&gt;Separate encrypted accounts&lt;/td&gt;
&lt;td&gt;Separate Microsoft accounts&lt;/td&gt;
&lt;td&gt;Full separate accounts&lt;/td&gt;
&lt;td&gt;Not applicable (no mailboxes)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;22-aliases-groups-and-catchall&#34;&gt;2.2 Aliases, groups, and catch‑all&lt;/h3&gt; &lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Google Workspace&lt;/th&gt;
&lt;th&gt;Apple iCloud+&lt;/th&gt;
&lt;th&gt;Proton Family&lt;/th&gt;
&lt;th&gt;Microsoft 365 Family&lt;/th&gt;
&lt;th&gt;Fastmail&lt;/th&gt;
&lt;th&gt;Cloudflare Email Routing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Aliases per user&lt;/td&gt;
&lt;td&gt;Many (up to ~30)&lt;/td&gt;
&lt;td&gt;Several per iCloud mailbox&lt;/td&gt;
&lt;td&gt;Multiple addresses/aliases per user&lt;/td&gt;
&lt;td&gt;Multiple per Outlook.com account&lt;/td&gt;
&lt;td&gt;600+ per account&lt;/td&gt;
&lt;td&gt;Many routing rules per domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aliases serve inbox where?&lt;/td&gt;
&lt;td&gt;Same user mailbox&lt;/td&gt;
&lt;td&gt;Same Apple ID mailbox&lt;/td&gt;
&lt;td&gt;Same Proton mailbox&lt;/td&gt;
&lt;td&gt;Same Outlook mailbox&lt;/td&gt;
&lt;td&gt;Same Fastmail mailbox&lt;/td&gt;
&lt;td&gt;Forward to &lt;em&gt;another&lt;/em&gt; provider&amp;rsquo;s mailbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared/group email (e.g., support@)&lt;/td&gt;
&lt;td&gt;First‑class groups, shared mailboxes&lt;/td&gt;
&lt;td&gt;No true groups; manual forwarding&lt;/td&gt;
&lt;td&gt;No multi‑user group inbox&lt;/td&gt;
&lt;td&gt;No consumer distribution list&lt;/td&gt;
&lt;td&gt;First‑class aliases and folder sharing&lt;/td&gt;
&lt;td&gt;Can create &lt;code&gt;support@&lt;/code&gt; → single destination mailbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One address → multiple recipients&lt;/td&gt;
&lt;td&gt;Yes (groups / distribution lists)&lt;/td&gt;
&lt;td&gt;Not natively&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Not in consumer tier&lt;/td&gt;
&lt;td&gt;Not directly; use forwarding rules&lt;/td&gt;
&lt;td&gt;One rule = one destination; fan‑out requires tricks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catch‑all&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported (catch‑all can forward anywhere)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare difference:&lt;/strong&gt;&lt;br&gt;
Cloudflare can easily create many addresses and a catch‑all, but &lt;strong&gt;each routing rule forwards to one destination mailbox&lt;/strong&gt;. A given &lt;code&gt;support@domain.com&lt;/code&gt; rule goes to a single inbox, not multiple users directly. If you want fan‑out, you chain Cloudflare into another system (e.g., a list at your final provider, or use Workers for custom logic).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-hosting-vs-forwarding-in-practical-terms&#34;&gt;3. Hosting vs forwarding in practical terms&lt;/h2&gt; &lt;h3 id=&#34;31-what-hosting-means-google-apple-proton-microsoft&#34;&gt;3.1 What “hosting” means (Google, Apple, Proton, Microsoft)&lt;/h3&gt; &lt;p&gt;For &lt;strong&gt;Google Workspace, Apple iCloud+, Proton Family, Microsoft 365 Family&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They host:
&lt;ul&gt;
&lt;li&gt;Mailboxes (inboxes, sent mail, etc.)&lt;/li&gt;
&lt;li&gt;IMAP/POP/SMTP or similar protocols&lt;/li&gt;
&lt;li&gt;Storage and indexing, search, spam filtering&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You log in directly to them to read and send mail.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;32-what-forwarding-means-cloudflare-email-routing&#34;&gt;3.2 What “forwarding” means (Cloudflare Email Routing)&lt;/h3&gt; &lt;p&gt;For &lt;strong&gt;Cloudflare Email Routing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare:
&lt;ul&gt;
&lt;li&gt;Receives mail for your domain (MX records point to Cloudflare).&lt;/li&gt;
&lt;li&gt;Does light processing and authentication checks.&lt;/li&gt;
&lt;li&gt;Immediately forwards mail to another mailbox you own (e.g., &lt;code&gt;you@gmail.com&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Does not provide:
&lt;ul&gt;
&lt;li&gt;A mailbox UI,&lt;/li&gt;
&lt;li&gt;Long‑term storage,&lt;/li&gt;
&lt;li&gt;Native ability to send mail as that address.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To &lt;strong&gt;send&lt;/strong&gt; mail as &lt;code&gt;you@yourdomain.com&lt;/code&gt; when using Cloudflare:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You configure your final mail provider (Gmail/Outlook/Proton via SMTP, etc.) to send mail with that From address.&lt;/li&gt;
&lt;li&gt;Cloudflare is invisible in the outbound path; it only affects inbound mail.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-cloud-app-ecosystems-and-integration&#34;&gt;4. Cloud app ecosystems and integration&lt;/h2&gt; &lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Google Workspace&lt;/th&gt;
&lt;th&gt;Apple iCloud+ / One&lt;/th&gt;
&lt;th&gt;Proton Family&lt;/th&gt;
&lt;th&gt;Microsoft 365 Family&lt;/th&gt;
&lt;th&gt;Fastmail&lt;/th&gt;
&lt;th&gt;Cloudflare Email Routing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Email client&lt;/td&gt;
&lt;td&gt;Gmail web + apps, IMAP/POP&lt;/td&gt;
&lt;td&gt;Mail apps + iCloud.com&lt;/td&gt;
&lt;td&gt;Proton web/app + Bridge&lt;/td&gt;
&lt;td&gt;Outlook desktop/web/mobile&lt;/td&gt;
&lt;td&gt;Modern web client, full IMAP/SMTP/JMAP&lt;/td&gt;
&lt;td&gt;None (uses your target provider&amp;rsquo;s client)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documents/Office&lt;/td&gt;
&lt;td&gt;Docs, Sheets, Slides&lt;/td&gt;
&lt;td&gt;Pages, Numbers, Keynote&lt;/td&gt;
&lt;td&gt;None (use external editors)&lt;/td&gt;
&lt;td&gt;Word, Excel, PowerPoint, OneNote&lt;/td&gt;
&lt;td&gt;None (use external editors)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Google Drive&lt;/td&gt;
&lt;td&gt;iCloud Drive&lt;/td&gt;
&lt;td&gt;Proton Drive (encrypted)&lt;/td&gt;
&lt;td&gt;OneDrive (1 TB/user)&lt;/td&gt;
&lt;td&gt;File storage (varies by plan)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calendar&lt;/td&gt;
&lt;td&gt;Google Calendar&lt;/td&gt;
&lt;td&gt;Apple Calendar&lt;/td&gt;
&lt;td&gt;Proton Calendar&lt;/td&gt;
&lt;td&gt;Outlook Calendar&lt;/td&gt;
&lt;td&gt;Fastmail Calendar (CalDAV)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extra privacy tools&lt;/td&gt;
&lt;td&gt;Admin + security tools&lt;/td&gt;
&lt;td&gt;Private Relay (limited), Hide My Email&lt;/td&gt;
&lt;td&gt;Encrypted Calendar/Drive, VPN, Pass&lt;/td&gt;
&lt;td&gt;Defender, Family Safety&lt;/td&gt;
&lt;td&gt;Masked Email, privacy-focused by default&lt;/td&gt;
&lt;td&gt;Email security/analytics via routing rules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Cloudflare fits as a useful &lt;strong&gt;front‑door&lt;/strong&gt; in front of whichever hosted mailbox solution you choose, rather than competing with them directly.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-spam-filtering-rules-and-quality&#34;&gt;5. Spam filtering, rules, and quality&lt;/h2&gt; &lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Google Workspace&lt;/th&gt;
&lt;th&gt;Apple iCloud+&lt;/th&gt;
&lt;th&gt;Proton Family&lt;/th&gt;
&lt;th&gt;Microsoft 365 Family&lt;/th&gt;
&lt;th&gt;Fastmail&lt;/th&gt;
&lt;th&gt;Cloudflare Email Routing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Spam filtering strength&lt;/td&gt;
&lt;td&gt;Industry‑leading ML filtering&lt;/td&gt;
&lt;td&gt;Good consumer filtering&lt;/td&gt;
&lt;td&gt;Good, sometimes strict&lt;/td&gt;
&lt;td&gt;Enterprise‑grade &lt;a href=&#34;https://en.wikipedia.org/wiki/Microsoft_Exchange_Server&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Exchange&lt;/a&gt;  backend&lt;/td&gt;
&lt;td&gt;Excellent, customizable filtering&lt;/td&gt;
&lt;td&gt;Light filtering &amp;amp; auth checks; major filtering is at destination mailbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rules / filters&lt;/td&gt;
&lt;td&gt;Powerful filters + labels&lt;/td&gt;
&lt;td&gt;Basic rules&lt;/td&gt;
&lt;td&gt;Powerful filtering &amp;amp; labels&lt;/td&gt;
&lt;td&gt;Rich Outlook rules&lt;/td&gt;
&lt;td&gt;Very powerful Sieve-based filtering&lt;/td&gt;
&lt;td&gt;Routing rules; advanced scripting via Workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abuse protections&lt;/td&gt;
&lt;td&gt;Mature anti‑abuse stack&lt;/td&gt;
&lt;td&gt;Good enough for consumers&lt;/td&gt;
&lt;td&gt;Strong, privacy‑centric&lt;/td&gt;
&lt;td&gt;Enterprise‑grade protections&lt;/td&gt;
&lt;td&gt;Strong anti-spam, manual learning&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Sender_Policy_Framework&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SPF&lt;/a&gt; /&lt;a href=&#34;https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DKIM&lt;/a&gt; /&lt;a href=&#34;https://en.wikipedia.org/wiki/DMARC&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DMARC&lt;/a&gt; ‑aware forwarding and &lt;a href=&#34;https://en.wikipedia.org/wiki/Sender_Rewriting_Scheme&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SRS&lt;/a&gt;  rewriting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Cloudflare&amp;rsquo;s main contribution is &lt;strong&gt;properly forwarding authenticated mail&lt;/strong&gt; (&lt;a href=&#34;https://en.wikipedia.org/wiki/Sender_Policy_Framework&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SPF&lt;/a&gt; , &lt;a href=&#34;https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DKIM&lt;/a&gt; , &lt;a href=&#34;https://en.wikipedia.org/wiki/DMARC&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DMARC&lt;/a&gt; ) without breaking deliverability, not spam scoring. The downstream mailbox still does the heavy spam work.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-ipv6-and-standards&#34;&gt;6. IPv6 and standards&lt;/h2&gt; &lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network / Standard&lt;/th&gt;
&lt;th&gt;Google Workspace&lt;/th&gt;
&lt;th&gt;Apple iCloud Mail&lt;/th&gt;
&lt;th&gt;Proton Mail / Family&lt;/th&gt;
&lt;th&gt;Microsoft 365 Family&lt;/th&gt;
&lt;th&gt;Fastmail&lt;/th&gt;
&lt;th&gt;Cloudflare Email Routing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IPv6 on MX (inbound mail)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt; (dual‑stack)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt; (dual‑stack)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt; (IPv4‑only MX)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt; (dual‑stack)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt; (IPv4‑only MX)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;: Cloudflare MX supports IPv6 for inbound&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPv6 on SMTP (outbound)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt; (IPv4‑only)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt; (IPv4‑only SMTP)&lt;/td&gt;
&lt;td&gt;N/A (forwarding only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forwarding over IPv6&lt;/td&gt;
&lt;td&gt;Will connect to upstream via IPv6 if destination MX has AAAA&lt;/td&gt;
&lt;td&gt;Will connect to upstream via IPv6 if destination MX has AAAA&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Will connect to upstream via IPv6 if destination MX has AAAA&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Will connect to upstream via IPv6 if destination MX has AAAA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Sender_Policy_Framework&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SPF&lt;/a&gt; /&lt;a href=&#34;https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DKIM&lt;/a&gt; /&lt;a href=&#34;https://en.wikipedia.org/wiki/DMARC&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DMARC&lt;/a&gt; &lt;/td&gt;
&lt;td&gt;Fully supported&lt;/td&gt;
&lt;td&gt;Supported, mostly automatic&lt;/td&gt;
&lt;td&gt;Fully supported&lt;/td&gt;
&lt;td&gt;Fully supported&lt;/td&gt;
&lt;td&gt;Fully supported, easy setup&lt;/td&gt;
&lt;td&gt;Preserves auth; uses &lt;a href=&#34;https://en.wikipedia.org/wiki/Sender_Rewriting_Scheme&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SRS&lt;/a&gt;  for envelope sender rewriting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS control&lt;/td&gt;
&lt;td&gt;You manage domain DNS&lt;/td&gt;
&lt;td&gt;Limited to Apple&amp;rsquo;s UI&lt;/td&gt;
&lt;td&gt;You manage domain DNS&lt;/td&gt;
&lt;td&gt;Full in business; fixed in consumer&lt;/td&gt;
&lt;td&gt;Full DNS control&lt;/td&gt;
&lt;td&gt;Cloudflare manages DNS if domain is on Cloudflare&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Key points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Email Routing&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Provides IPv6‑capable MX endpoints.&lt;/li&gt;
&lt;li&gt;Forwards mail using IPv6 when the &lt;em&gt;destination&lt;/em&gt; provider supports it; falls back to IPv4 otherwise.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proton Mail&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;As of now, Proton’s MX records are &lt;strong&gt;IPv4‑only&lt;/strong&gt;, so mail directly to Proton requires IPv4 connectivity.&lt;/li&gt;
&lt;li&gt;This limitation disappears if you place Cloudflare in front, since Cloudflare terminates on IPv4 and can still be dual‑stack at the outer edge. However, the web front ends are also IPv4-only, so Proton is functionally a single stacked solution as if now. They have slowly been rolling IPv6 out for things like VPN, so I do expect it &amp;ldquo;some day&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-costs-and-typical-usage-patterns&#34;&gt;7. Costs and typical usage patterns&lt;/h2&gt; &lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Plan type&lt;/th&gt;
&lt;th&gt;Approx yearly cost (US)&lt;/th&gt;
&lt;th&gt;Users&lt;/th&gt;
&lt;th&gt;Storage headline&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;Business Starter&lt;/td&gt;
&lt;td&gt;~$72/user/year&lt;/td&gt;
&lt;td&gt;Per user&lt;/td&gt;
&lt;td&gt;30 GB/user (more in higher tiers)&lt;/td&gt;
&lt;td&gt;Business product used by families&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple iCloud+ Family&lt;/td&gt;
&lt;td&gt;200 GB–2 TB tiers&lt;/td&gt;
&lt;td&gt;~$36–$120/year total&lt;/td&gt;
&lt;td&gt;Up to 6&lt;/td&gt;
&lt;td&gt;200 GB–2 TB shared iCloud&lt;/td&gt;
&lt;td&gt;Includes mail + Photos + Drive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proton Family&lt;/td&gt;
&lt;td&gt;Family bundle&lt;/td&gt;
&lt;td&gt;~$240–$360/year total&lt;/td&gt;
&lt;td&gt;~6&lt;/td&gt;
&lt;td&gt;Hundreds of GB–few TB encrypted&lt;/td&gt;
&lt;td&gt;Includes VPN + Pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft 365 Family&lt;/td&gt;
&lt;td&gt;Family plan&lt;/td&gt;
&lt;td&gt;~$100/year total&lt;/td&gt;
&lt;td&gt;Up to 6&lt;/td&gt;
&lt;td&gt;1 TB OneDrive per user (6 TB total)&lt;/td&gt;
&lt;td&gt;Includes Office apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fastmail&lt;/td&gt;
&lt;td&gt;Standard/Professional&lt;/td&gt;
&lt;td&gt;~$50–$120/user/year&lt;/td&gt;
&lt;td&gt;Per user&lt;/td&gt;
&lt;td&gt;30–100 GB/user (varies by plan)&lt;/td&gt;
&lt;td&gt;Independent, standards-focused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Email Routing&lt;/td&gt;
&lt;td&gt;Included with Cloudflare&lt;/td&gt;
&lt;td&gt;Typically free for routing&lt;/td&gt;
&lt;td&gt;Per domain&lt;/td&gt;
&lt;td&gt;None (no mailbox storage)&lt;/td&gt;
&lt;td&gt;You must still pay for a mailbox provider&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Cloudflare Email Routing effectively reduces cost by letting you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use a free/cheap mailbox (Gmail, Outlook.com, etc.).&lt;/li&gt;
&lt;li&gt;Put your &lt;strong&gt;custom domain branding&lt;/strong&gt; in front via Cloudflare.&lt;/li&gt;
&lt;li&gt;Avoid paying for separate hosted mail per domain when all you need is forwarding.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-choosing-where-cloudflare-fits-in&#34;&gt;8. Choosing where Cloudflare fits in&lt;/h2&gt; &lt;p&gt;Practical patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Forwarding into Gmail/Outlook/Proton:&lt;/strong&gt;&lt;br&gt;
Use Cloudflare MX for your domain, route &lt;code&gt;name@domain.com&lt;/code&gt; to a Gmail/Outlook/Proton mailbox. You manage spam and sending from that provider; Cloudflare only routes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alias and catch‑all front‑end:&lt;/strong&gt;&lt;br&gt;
Use Cloudflare to generate many aliases or a catch‑all, all forwarding into one or a few real mailboxes. This keeps your main mailbox provider simple and cheap.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Not a replacement for a real host:&lt;/strong&gt;&lt;br&gt;
Cloudflare does not replace Google Workspace, Proton, or Microsoft 365. You still need one of them (or some other host) for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mailbox storage&lt;/li&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;Calendars/contacts&lt;/li&gt;
&lt;li&gt;Sending mail&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-quick-best-use-summary-including-cloudflare&#34;&gt;9. Quick “best use” summary including Cloudflare&lt;/h2&gt; &lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Google Workspace&lt;/strong&gt; – Best when you want &lt;em&gt;full&lt;/em&gt; business‑grade email hosting, collaboration, and admin for a family or small group.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apple iCloud+&lt;/strong&gt; – Best for an all‑Apple household that wants simple, integrated mail and storage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Proton Family&lt;/strong&gt; – Best for families that value privacy, encryption, and Swiss jurisdiction over convenience and integrations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Microsoft 365 Family&lt;/strong&gt; – Best for families wanting Office apps plus large personal storage (1 TB per user) with solid consumer email.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fastmail&lt;/strong&gt; – Best for power users and email enthusiasts who want a clean, standards-based email experience with excellent custom domain support, powerful filtering, and no ads or tracking from an independent provider.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare Email Routing&lt;/strong&gt; – Best as a &lt;strong&gt;free, DNS‑level front door&lt;/strong&gt; to give your domain professional emails that forward into an existing mailbox; useful when you want:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Custom domain addresses,&lt;/li&gt;
&lt;li&gt;No separate mail server,&lt;/li&gt;
&lt;li&gt;And are happy to keep a Gmail/Outlook/Proton mailbox behind it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;For me, google is probably still the clear winner, but it does come with the large pill of &amp;ldquo;if the product is free, you&amp;rsquo;re the product&amp;rdquo;. A very close tie for second is Proton and, presumably Fastmail. I have no experience with Fastmail but it looks very promising.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Last updated: December 29th, 2025, Added Fastmail.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>PB190 - IPv6 in Kubernetes Deployments</title>
      <link>https://forwardingplane.net/post/2025-12-18-ipv6buzz-190/</link>
      <pubDate>Thu, 18 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2025-12-18-ipv6buzz-190/</guid>
      <description>&lt;p&gt;Kubernetes is a popular container orchestration platform. Today’s IPv6 Buzz episode explores the benefits of using IPv6 in Kubernetes, and how Kubernetes uses IP addresses in both the control plane and data plane. We also address why the adoption rate is estimated to be so low, from default configurations to issues with non-IPv6-aware applications inside containers. Our guest to help cover this topic is &lt;a href=&#34;https://www.linkedin.com/in/wim-henderickx-393b3a/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Wim Henderickx&lt;/a&gt; , CTO of the IP Division at Nokia.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/dual-stack/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Kubernetes Dual stack&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://documentation.ubuntu.com/canonical-kubernetes/latest/snap/howto/networking/ipv6/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;How to set up an IPv6-only Kubernetes cluster&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://medium.com/@wim.henderickx&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Wim Henderickx’s Medium Blog&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Take a listen here:&lt;/p&gt;
&lt;iframe width=&#34;320&#34; height=&#34;30&#34; src=&#34;https://packetpushers.net/?powerpress_embed=73395-podcast&amp;amp;powerpress_player=mediaelement-audio&#34; title=&#34;Blubrry Podcast Player&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;</description>
    </item>
    
    <item>
      <title>IETF v6ops Working Group on Software Gone Wild</title>
      <link>https://forwardingplane.net/post/2025-12-11-sgw-podcast-203/</link>
      <pubDate>Thu, 11 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2025-12-11-sgw-podcast-203/</guid>
      <description>&lt;p&gt;In a triumphant return, Ivan Pepelnjak has resurected the Software Gone Wild podcast! As some may recall, I was a co-host on SGW for quite a while, eventually branching out into the &lt;a href=&#34;https://www.modem.show&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;MODEM.show&lt;/a&gt;  in around 2020. Well, MODEM has concluded, and SGW has returned.&lt;/p&gt;
&lt;p&gt;It was quite fun to &amp;ldquo;get the band back together&amp;rdquo; and record this one.&lt;/p&gt;
&lt;p&gt;From the &lt;a href=&#34;https://blog.ipspace.net/2025/12/v6ops-ietf-working-group/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;podcast post&lt;/a&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The first IPv6 specs were published in 1995, and yet 30 years later, we still have a pretty active &lt;a href=&#34;https://datatracker.ietf.org/wg/v6ops/about/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IETF working group&lt;/a&gt;  focused on “developing guidelines for the deployment and operation of new and existing IPv6 networks.” (taken from the &lt;a href=&#34;https://datatracker.ietf.org/doc/charter-ietf-v6ops/05/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;old charter&lt;/a&gt; ; they &lt;a href=&#34;https://datatracker.ietf.org/doc/charter-ietf-v6ops/06/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;updated it&lt;/a&gt;  in late October 2025). Why is it taking so long, and what problems are they trying to solve?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Nick Buraglio, one of the working group chairs, provided some answers in &lt;a href=&#34;http://media.blubrry.com/ipspace/stream.ipspace.net/nuggets/podcast/Show_203-IETF_v6ops_Working_Group_with_Nick_Buraglio.mp3&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Episode 203&lt;/a&gt;  of the Software Gone Wild podcast.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;http://media.blubrry.com/ipspace/stream.ipspace.net/nuggets/podcast/Show_203-IETF_v6ops_Working_Group_with_Nick_Buraglio.mp3&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Listen here&lt;/a&gt; .&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>PB189 - RFC 9898 – Neighbor Discovery Considerations in IPv6 Deployments</title>
      <link>https://forwardingplane.net/post/2025-12-04-ipv6buzz-189/</link>
      <pubDate>Thu, 04 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2025-12-04-ipv6buzz-189/</guid>
      <description>&lt;p&gt;The newly published &lt;a href=&#34;https://www.rfc-editor.org/rfc/rfc9898.pdf&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;RFC 9898&lt;/a&gt;  is the discussion of today’s podcast. The IPv6 Buzz crew explore the complexities of neighbor discovery and review solutions for both operators and architects. They share how this RFC serves as a single, detailed resource to improve your understanding of neighbor discovery and to reduce the potential attack surface in your IPv6 networks.
Neighbor Discovery is one of the more complex pieces of IPv6 and this document aims to provide clarity on nearly all aspects of how it works. This ain&amp;rsquo;t your grandfathers ARP.&lt;/p&gt;
&lt;p&gt;Full disclosure, I was one of the co-authors of this RFC =)&lt;/p&gt;
&lt;iframe width=&#34;320&#34; height=&#34;30&#34; src=&#34;https://packetpushers.net/?powerpress_embed=73137-podcast&amp;powerpress_player=mediaelement-audio&#34; title=&#34;Blubrry Podcast Player&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;</description>
    </item>
    
    <item>
      <title>IPB188 - IPv6 Adoption for an Entire Country</title>
      <link>https://forwardingplane.net/post/2025-11-20-ipv6buzz-188/</link>
      <pubDate>Thu, 20 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2025-11-20-ipv6buzz-188/</guid>
      <description>&lt;p&gt;What does it take for an entire country to adopt IPv6? Our guest today is &lt;a href=&#34;https://www.linkedin.com/in/tenanoia-veronica-simona-554b681b/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Tenanoia (Noia) Simona&lt;/a&gt; , CEO of &lt;a href=&#34;https://www.tuvalutelecom.tv/about-us&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Tuvalu Telecommunications Corporation&lt;/a&gt; , the country’s sole telecommunications provider. She’s here to walk us through the difficulties of connecting the many islands of Tuvalu and their journey to achieving one of the world’s highest IPv6 adoption rates.
This was a fin one where we roamed around into undesea fiber, long haul, satellite, and peering. Oh, and their strong support for IPv6.&lt;/p&gt;
&lt;iframe width=&#34;320&#34; height=&#34;30&#34; src=&#34;https://packetpushers.net/?powerpress_embed=72971-podcast&amp;powerpress_player=mediaelement-audio&#34; title=&#34;Blubrry Podcast Player&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;</description>
    </item>
    
    <item>
      <title>IPB187 - IPv6 Adoption for an Entire Country</title>
      <link>https://forwardingplane.net/post/2025-11-06-ipv6buzz-187/</link>
      <pubDate>Thu, 06 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2025-11-06-ipv6buzz-187/</guid>
      <description>&lt;p&gt;Today the IPv6 Buzz crew provides updates on the latest in IPv6 standards, RFCs, and best practices. They break down the recent discussions around RFC 6052, explore the options for RFC 8215, and share Nick’s spin on the now defunct testipv6.com site.&lt;/p&gt;
&lt;iframe width=&#34;320&#34; height=&#34;30&#34; src=&#34;https://packetpushers.net/?powerpress_embed=72715-podcast&amp;powerpress_player=mediaelement-audio&#34; title=&#34;Blubrry Podcast Player&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;</description>
    </item>
    
    <item>
      <title>IPB186 - An Inside Look at RFC 9872 for Discovering v6 Prefixes</title>
      <link>https://forwardingplane.net/post/2025-10-23-ipv6buzz-186/</link>
      <pubDate>Thu, 23 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2025-10-23-ipv6buzz-186/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://datatracker.ietf.org/doc/rfc9872/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;RFC 9872&lt;/a&gt;  makes recommendations for NAT64 prefix discovery for hosts supporting v4-to-v6 translation. Co-host Nick Buralgio is a co-author of this RFC, so we’re taking the opportunity to talk about it in detail. We discuss the problems RFC 9872 is addressing and why a new RFC was needed for operational guidance, not necessarily defining a protocol or standard. We learn the effects of this RFC on previous RFCs, specifically &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc7050&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;7050&lt;/a&gt;  and &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc8781&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;8781&lt;/a&gt; . Lastly, we share the implications of RFC 9872 on listeners and recommend they do a little labbing to see what this really means for the networks they manage.&lt;/p&gt;
&lt;iframe width=&#34;320&#34; height=&#34;30&#34; src=&#34;https://packetpushers.net/?powerpress_embed=72468-podcast&amp;powerpress_player=mediaelement-audio&#34; title=&#34;Blubrry Podcast Player&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;</description>
    </item>
    
    <item>
      <title>An alternative to test-ipv6.com</title>
      <link>https://forwardingplane.net/post/2025-10-13-ipv6-army-web-test/</link>
      <pubDate>Mon, 13 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2025-10-13-ipv6-army-web-test/</guid>
      <description>&lt;p&gt;Many resources exist in order to test and report on IPv6 availability. One such site - &lt;a href=&#34;https://www.test-ipv6.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;test-ipv6.com&lt;/a&gt;  - has been a staple for nearly 15 years. This site has a robust mirror network and has been proudly advertising free since its inception. However, running such resources can be costly in both time and money. Recently, the author and maintainer of the site had announce its retirement. This sent some shockwaves through the IPv6 community that eventually culminated in a realization that we rely on something that isn&amp;rsquo;t necessarily funded or permanent. since that announcement, someone has been able to take it over, however, the lingering feeling of &amp;ldquo;this could go away&amp;rdquo; still remains. To that end, I wrote a mediocre replacement for it and deployed it as the front page of &lt;a href=&#34;https://www.ipv6.army&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ipv6.army&lt;/a&gt; . While not quite the same, it does provide an additional browser based test that may be useful to some, and just like this site, it is deployed on the netlify CDN.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>IPB185 - When IPv6 VPN and DNS Do Not Cooperate</title>
      <link>https://forwardingplane.net/post/2025-10-09-ipv6buzz-185/</link>
      <pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://forwardingplane.net/post/2025-10-09-ipv6buzz-185/</guid>
      <description>&lt;p&gt;Sometimes weirdness occurs within DNS if you’re on an IPv4 network and you connect to a dual-stack or v6-only VPN. Maybe the browser doesn’t connect, but you can still send pings, or vice versa. Is the OS getting confused about which stack and which order of interfaces to request services? Is the weird behavior being caused by Happy Eyeballs? Is it something else? These occurrances can be infuriating and very difficult to troubleshot. On today’s IPv6 Buzz we dive into this weirdness to see if we can figure out the causes, and offer suggestions to get your remote access VPN and DNS to play nicely with mixed stacks.&lt;/p&gt;
&lt;p&gt;Take a listen here&lt;/p&gt;
&lt;iframe width=&#34;320&#34; height=&#34;30&#34; src=&#34;https://packetpushers.net/?powerpress_embed=72266-podcast&amp;powerpress_player=mediaelement-audio&#34; title=&#34;Blubrry Podcast Player&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;</description>
    </item>
    
  </channel>
</rss>
