<?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>Proxmox on wgz.sh</title>
    <link>https://blog.wgz.sh/tags/proxmox/</link>
    <description>Recent content in Proxmox 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/proxmox/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>Fail2ban Observability</title>
      <link>https://blog.wgz.sh/posts/fail2ban-logging/</link>
      <pubDate>Wed, 31 Dec 2025 15:49:37 -0500</pubDate>
      <guid>https://blog.wgz.sh/posts/fail2ban-logging/</guid>
      <description>&lt;p&gt;Hello everyone!&lt;/p&gt;
&lt;p&gt;Today I wanted to discuss how I&amp;rsquo;m keeping track of Fail2ban logs on my Proxmox cluster.&lt;/p&gt;
&lt;p&gt;For those of you who don&amp;rsquo;t know what &lt;a href=&#34;https://github.com/fail2ban/fail2ban&#34;&gt;Fail2ban&lt;/a&gt; is, it is a simple program that can automatically
ban threats via iptables by parsing log files and scanning for regex patterns.&lt;/p&gt;
&lt;p&gt;Here is a sample file that can be parsed:&lt;/p&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;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Definition&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;failregex &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pvedaemon&lt;span style=&#34;color:#ae81ff&#34;&gt;\[&lt;/span&gt;.*authentication failure; rhost&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;HOST&amp;gt; user&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;.* msg&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;ignoreregex &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And here is the the jail configuration:&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>
