<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Homelab on wgz.sh</title>
    <link>https://blog.wgz.sh/tags/homelab/</link>
    <description>Recent content in Homelab on wgz.sh</description>
    <generator>Hugo -- 0.153.1</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 26 Apr 2026 20:54:55 -0400</lastBuildDate>
    <atom:link href="https://blog.wgz.sh/tags/homelab/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Using SSH Tunneling to Regain Proxmox Access</title>
      <link>https://blog.wgz.sh/posts/ssh-tunneling/</link>
      <pubDate>Sun, 26 Apr 2026 20:54:55 -0400</pubDate>
      <guid>https://blog.wgz.sh/posts/ssh-tunneling/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;Recently I made a mistake in my firewall rules and locked myself out from having management access to my Proxmox cluster. What&amp;rsquo;s worse is that I could not get into the nodes via &lt;code&gt;SSH&lt;/code&gt; because that was blocked as well.&lt;/p&gt;
&lt;p&gt;This meant I had no easy way to disable these rules, and unfortunately Proxmox lives in a data center very far away from me.&lt;/p&gt;
&lt;p&gt;This is where SSH tunneling came in handy for me!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enabling Proxmox Firewall Rules for VMs</title>
      <link>https://blog.wgz.sh/posts/proxmox-firewall/</link>
      <pubDate>Sun, 26 Apr 2026 20:14:30 -0400</pubDate>
      <guid>https://blog.wgz.sh/posts/proxmox-firewall/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;In my homelab I&amp;rsquo;ve been tediously managing firewall rules using &lt;code&gt;ufw&lt;/code&gt;, &lt;code&gt;iptables&lt;/code&gt;, and &lt;code&gt;fail2ban&lt;/code&gt;. While this works well, I believe it&amp;rsquo;s overly complicated for my setup. This led me down the rabbit hole of how to implement firewall rules in Proxmox.&lt;/p&gt;
&lt;p&gt;Proxmox&amp;rsquo;s firewall is extremely competent, but it can be tricky as well.&lt;/p&gt;
&lt;p&gt;One thing I learned about Proxmox is that you need to make sure the firewall is enabled in multiple places. You have several layers of firewalling, one for the hosts, one for the VMs, and one for services running in VNETs. These firewall rules are backed by either &lt;code&gt;iptables&lt;/code&gt; or the more modern &lt;code&gt;nftables&lt;/code&gt; in the case of VNETs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ZFS Commands</title>
      <link>https://blog.wgz.sh/posts/zfs-commands/</link>
      <pubDate>Fri, 20 Feb 2026 07:53:01 -0500</pubDate>
      <guid>https://blog.wgz.sh/posts/zfs-commands/</guid>
      <description>&lt;h2 id=&#34;abstract&#34;&gt;Abstract&lt;/h2&gt;
&lt;p&gt;Dedicated to &lt;a href=&#34;https://en.wikipedia.org/wiki/ZFS&#34;&gt;ZFS&lt;/a&gt; administration.&lt;/p&gt;
&lt;h2 id=&#34;zpool-administration&#34;&gt;Zpool Administration&lt;/h2&gt;
&lt;h3 id=&#34;basic-commands&#34;&gt;Basic Commands&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zpool list
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zpool list &amp;lt;name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zpool list -v zroot
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zpool status -x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;creating-pools-and-vdevs&#34;&gt;Creating Pools and VDEVs&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Make sure ashift is 4k, &lt;code&gt;vfs.zfs.min_auto_ashift=12&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;alt text&#34; loading=&#34;lazy&#34; src=&#34;https://blog.wgz.sh/images/zfs-ashift.png&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select disks (da1, da2, da3)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -al /dev/ | grep da
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crw-r-----   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; root operator 0x5a Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt; 02:51 da0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crw-r-----   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; root operator 0x5b Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt; 02:51 da0p1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crw-r-----   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; root operator 0x5c Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt; 02:51 da0p2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crw-r-----   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; root operator 0x5d Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt; 02:51 da0p3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crw-r-----   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; root operator 0x6a Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt; 18:46 da1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crw-r-----   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; root operator 0x6d Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt; 18:46 da2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crw-r-----   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; root operator 0x70 Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt; 18:46 da3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;We can create a disk, provide it 1gb of swap, and label it.&lt;/li&gt;
&lt;li&gt;The labels should correspond to device serial numbers and location in production so it&amp;rsquo;s easy to swap out.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GB swap partition and a large ZFS partition, created with gpart&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;8&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;. 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart create -s gpt da1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart add -a 1m -s1g -l sw1 -t freebsd-swap da1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart add -a 1m -l zfs1 -t freebsd-zfs da1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart create -s gpt da2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart add -a 1m -s1g -l sw2 -t freebsd-swap da2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart add -a 1m -l zfs2 -t freebsd-zfs da2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart create -s gpt da3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart add -a 1m -s1g -l sw3 -t freebsd-swap da3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart add -a 1m -l zfs3 -t freebsd-zfs da3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart create -s gpt da4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart add -a 1m -s1g -l sw4 -t freebsd-swap da4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart add -a 1m -l zfs4 -t freebsd-zfs da4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart create -s gpt da5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart add -a 1m -s1g -l sw5 -t freebsd-swap da5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart add -a 1m -l zfs5 -t freebsd-zfs da5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gpart show -l &amp;lt;device&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; glabel status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zpool create &amp;lt;pool-name&amp;gt; /dev/label/zfs1 /dev/label/zfs2 /dev/label/zfs3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;fix-degraded-pool&#34;&gt;Fix Degraded Pool&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Here we see the state is &lt;code&gt;DEGRADED&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;alt text&#34; loading=&#34;lazy&#34; src=&#34;https://blog.wgz.sh/images/zfs-tank.jpeg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simulate BGP at Home</title>
      <link>https://blog.wgz.sh/posts/bgp-at-home/</link>
      <pubDate>Tue, 09 Dec 2025 19:01:48 -0400</pubDate>
      <guid>https://blog.wgz.sh/posts/bgp-at-home/</guid>
      <description>&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re like me, there are tons of technologies that you work with on a day-to-day basis, but never have the opportunity to touch. In my day-to-day role, for example, I work heavily with networking and even with BGP. But rarely do I have the chance to do anything BGP-related as it pertains to the internet.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s quite the dilemma! How is one supposed to get the experience of operating large-scale networks, if only very few people have the opportunity to work on them? Let alone set them up from scratch!&lt;/p&gt;</description>
    </item>
    <item>
      <title>IPv6 at Home</title>
      <link>https://blog.wgz.sh/posts/ipv6-at-home/</link>
      <pubDate>Fri, 11 Jul 2025 22:11:47 -0400</pubDate>
      <guid>https://blog.wgz.sh/posts/ipv6-at-home/</guid>
      <description>&lt;p&gt;Hi Folks,&lt;/p&gt;
&lt;p&gt;I’ve finally made the transition to using IPv6 at home! It’s been a long time coming, and while it took a few weeks to get everything working, I’m excited for this new chapter.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;alt text&#34; loading=&#34;lazy&#34; src=&#34;https://blog.wgz.sh/images/ipv6-imessage.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;I requested a &lt;code&gt;/56&lt;/code&gt; from Verizon, and at first, it didn’t seem to work. But after not checking for a while, I noticed some of my VLANs had started handing out IPv6 addresses!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Relocating My Homelab</title>
      <link>https://blog.wgz.sh/posts/colocating-my-homelab/</link>
      <pubDate>Sat, 05 Apr 2025 17:15:21 -0400</pubDate>
      <guid>https://blog.wgz.sh/posts/colocating-my-homelab/</guid>
      <description>&lt;p&gt;Hey all,&lt;/p&gt;
&lt;p&gt;I recently decided to purchase a dedicated server from &lt;a href=&#34;https://my.racknerd.com/&#34;&gt;RackNerd&lt;/a&gt; with the goal of hosting my homelab services remotely.&lt;/p&gt;
&lt;p&gt;Previously, I ran a high-availability Proxmox cluster out of my one-bedroom apartment in NYC, powered by a few Dell Optiplex 4090s. A few months ago, I moved into a new place and had to decommission that setup.&lt;/p&gt;
&lt;p&gt;Since my new setup is remote, it presented a few challenges:&lt;br&gt;
&lt;em&gt;How am I going to administer my lab? How can I secure it? What services will I host?&lt;/em&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
