<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Alex Fetzner</title><link>https://fetzner.me/en/</link><description>Recent content on Alex Fetzner</description><generator>Hugo -- 0.152.0</generator><language>en-us</language><copyright>MIT</copyright><lastBuildDate>Thu, 01 Jan 2026 20:43:30 -0600</lastBuildDate><atom:link href="https://fetzner.me/en/index.xml" rel="self" type="application/rss+xml"/><item><title>This website!</title><link>https://fetzner.me/en/projects/fetznerdotme/</link><pubDate>Thu, 01 Jan 2026 20:43:30 -0600</pubDate><author>Alex Fetzner</author><guid>https://fetzner.me/en/projects/fetznerdotme/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<h2 id="youre-looking-at-it">You&rsquo;re looking at it!<a href="#youre-looking-at-it" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="right-now">Right now!<a href="#right-now" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<h4 id="innit-neat">Innit neat?!<a href="#innit-neat" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>As you can see at the footer, it&rsquo;s made with <a href="https://gohugo.io/">Hugo</a> and uses a theme <a href="https://github.com/1bl4z3r/hermit-V2">Hermit-V2</a>.
I&rsquo;m not much of a front-end web developer, so I gravitate toward tools that let me focus on writing content in Markdown and generate static HTML/CSS as output.
Because of that, this page isn’t really about front-end design&mdash;it’s about how the site is hosted and the principles behind it.</p>
<p>Since the website is self-hosted, my primary objectives are:</p>
<ol>
<li>Minimizing attack area</li>
<li>Isolating the web-server should it get compromised</li>
</ol>
<p>I&rsquo;m trepid about giving away too many details about my security posture, but I feel confident enough in my stack that I can disclose the following:</p>
<h3 id="minimizing-attack-area">Minimizing attack area<a href="#minimizing-attack-area" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>The website is intentionally simple.
It&rsquo;s a statically served HTML/CSS/JavaScript site with no server-side application logic or database.
This significantly reduces the complexity and attack surface compared to a dynamic website.</p>
<p>Public traffic is managed by a reverse proxy that</p>
<ul>
<li>Hides my IP address</li>
<li>provides some protection against denial-of-service and other network attacks</li>
<li>minimizes the traffic I have to allow from the internet into my network</li>
</ul>
<p>As such, the public facing part of my server does as little as possible and only as much as necessary.</p>
<h3 id="isolating-and-containing-the-server">Isolating and containing the server<a href="#isolating-and-containing-the-server" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>The entire stack uses the principal of least privilege:</p>
<ul>
<li>The web server runs in a rootless container of an unprivileged user.</li>
<li>It has only read-only access to only the files it needs.</li>
<li>It also runs with OS-level mandatory access controls.</li>
</ul>
<p>Further, the server itself is isolated from the rest of my network using VLAN-segregation and
a firewall enforces minimal access to the WAN using egress filtering, and zero access to the LAN.</p>
<blockquote>
<p>My design philosophy is to assume a breach will happen and minimize its impact when it does.</p>
</blockquote>
]]></content></item><item><title>Network Engineer - Resumé</title><link>https://fetzner.me/en/resumes/network_engineer/</link><pubDate>Thu, 01 Jan 2026 17:58:31 -0600</pubDate><author>Alex Fetzner</author><guid>https://fetzner.me/en/resumes/network_engineer/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<blockquote>
<p>I tailor my resumé to the jobs I apply to, but this is broadly what I would write for a network-engineering job</p>
</blockquote>
<h2 id="education">Education<a href="#education" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><strong>University of Nebraska - Lincoln, BS in Computer Science, Mathematics</strong> <br>
<em>Sept 2019 – May 2023</em> · <em>Lincoln, NE, USA</em></p>
<h2 id="experience">Experience<a href="#experience" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><strong>Mutual Of Omaha</strong> <br>
<em><strong>Information Services Service Desk Analyst</strong></em> <br>
<em>Oct 2025-present</em> · <em>Remote</em></p>
<ul>
<li>Provided first-line technical support in a large enterprise IT environment</li>
<li>Troubleshooting Windows, Mac, and Linux desktops and server issues</li>
<li>Created, resolved, and escalated incidents and service requests using ServiceNow</li>
<li>Followed established workflows, documentation, and escalation procedures</li>
<li>Collaborated with network, systems, and application teams to resolve user issues</li>
</ul>
<p><strong>NCR Voyix</strong> <br>
<em><strong>Field Service Technician (AKA Customer Engineer)</strong></em> <br>
<em>Aug 2024–Aug 2025</em> · <em>Remote in Indianapolis, IN &amp; Minneapolis, MN</em></p>
<ul>
<li>Troubleshot and installed Windows and Linux based retail software</li>
<li>Tested and terminated network twisted-pair cabling</li>
<li>Maintained and repaired server, networking, and electromechanical equipment</li>
<li>Communicated with stakeholders and developed relationships</li>
</ul>
<p><strong>Teachers&rsquo; Treasures</strong> <br>
<em><strong>Warehouse associate &amp; group leader</strong></em> <br>
<em>Sept 2023–Aug 2024</em> · <em>Indianapolis, IN</em></p>
<ul>
<li>Lead groups of up to 15 volunteers in logistical tasks</li>
<li>Working with diverse groups, and identifying how to tailor my communication style</li>
</ul>
<p><strong>University of Nebraska - Lincoln</strong> <br>
<em><strong>Teaching assistant &amp; undergraduate researcher</strong></em> <br>
<em>Jan 2021–May 2023</em> · <em>Lincoln, NE</em></p>
<ul>
<li>Taught a systems engineering class and an introductory C programming class</li>
<li>Communicated technical concepts to an audience ranging in technical ability</li>
<li>Read, comprehended, and relayed technical documentation</li>
</ul>
<h2 id="projects">Projects<a href="#projects" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><strong>OPNSense firewall</strong> <br>
Deployed and administered an OPNSense firewall for a segmented network environment</p>
<ul>
<li>Configured VLAN-based network segmentation using a VLAN-aware switch</li>
<li>Implemented least-privilege firewall rules to host a web service in a DMZ</li>
<li>Deployed a WireGuard hub/relay server to securely tunnel between trusted devices</li>
<li>Administered DNS/DHCP services for hostname-based device addressing</li>
</ul>
<p><strong>Network service hosting</strong> <br>
Designed, deployed, and maintained self-hosted network services</p>
<ul>
<li>Configured encrypted network services, including mTLS authentication and secure NFS</li>
<li>Deployed and managed web services, a website and containerized applications</li>
<li>Implemented DNS configuration and service exposure for publicly accessible services</li>
<li>Applied encryption, authentication, and access control to ensure secure network</li>
</ul>
<p><strong>C# application for USDA</strong></p>
<ul>
<li>Emphasized code maintainability as development manager on a team of six</li>
<li>Collaborated with a cross-functional team of stakeholders to design the application</li>
<li>Developed documentation for end users and maintainers</li>
<li>Database administration, automated development tasks, generating code files, and testing and deployment</li>
</ul>
<p><strong>Skills</strong></p>
<ul>
<li>Operating Systems: Windows 10, Windows 11, Ubuntu &amp; Fedora Linux</li>
<li>Network infrastructure: Routing, switching, VLANs, DHCP, DNS resolution, firewalls, VPNs</li>
<li>Cybersecurity: Data classification, authentication, secure communications</li>
<li>Troubleshooting: Following procedures for routine issues, or methodically troubleshooting complex issues</li>
<li>Communication: Actively listening to stakeholders, asking questions and illiciting requirements</li>
</ul>
]]></content></item><item><title>Summary</title><link>https://fetzner.me/en/about-me/about-me/</link><pubDate>Thu, 01 Jan 2026 17:58:31 -0600</pubDate><author>Alex Fetzner</author><guid>https://fetzner.me/en/about-me/about-me/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"></content></item><item><title>Professional Biography</title><link>https://fetzner.me/en/about-me/biography/</link><pubDate>Mon, 01 Dec 2025 17:58:31 -0600</pubDate><author>Alex Fetzner</author><guid>https://fetzner.me/en/about-me/biography/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<h2 id="early-life">Early life<a href="#early-life" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I grew up in a town outside of Chicago, IL.
In high-school, I was in cross-country, and track-and-field as a runner.
I was a mathlete, going to the Illinois state math competition one year.
I also played the French horn.</p>
<p>I knew early that I was good at and enjoyed mathematics and science.
Some of my favorite classes were my biology, chemistry, physics, and calculus classes because of the content.
I also greatly enjoyed my European and American history classes as the teachers were excellently engaging.</p>
<p>I graduated second in my class of about 350 having received and accepted a Chancellor&rsquo;s Scholarship at the University of Nebraska - Lincoln.</p>
<h2 id="undergraduate-studies-at-the-university-of-nebraska---lincoln">Undergraduate studies at the University of Nebraska - Lincoln<a href="#undergraduate-studies-at-the-university-of-nebraska---lincoln" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I choose the University of Nebraska - Lincoln (UNL) for their highly accredited actuarial science program.
I did one year of business school, got a 97% in accounting, but thought that it was dreadfully boring.
That, combined with anxiety about taking the actuarial exams motivated me to consider jobs outside of finance.</p>
<p>I attended a presentation by a group of actuaries who made actuarial software instead and thought that that would be a sensible pivot for me.
I took an intro to C programming class and was quickly hooked on computing.
I switched to the School of Computing track with a second major in mathematics.</p>
<p>I was a teaching assistant for the same intro to C programming class and later a systems engineering class TA for <a href="https://computing.unl.edu/person/chris-bohn/">Dr. Bohn</a>.
I was also a math resource center counselor and private tutor for a data structures and algorithms class.
I greatly enjoyed all of those roles; it was fun working with the other students and sharing my passion for computers.
I enjoyed low-level programming most, with the nitty-gritty of C being my favorite followed by C# for its simplicity in designing program architectures and Python as a good scratch-pad language for drafting ideas.</p>
<p>My second major at UNL was mathematics. The two favorite classes I took were elementary analysis and group theory.
I really enjoyed my analysis class, but broadly I like discrete math better than analytical, perhaps because of the closer overlap with computer science.
I also took a great deal of statistics classes in combination of my actuarial studies.</p>
<p>Outside of classes, I enjoyed climbing at the gym, where I was in the university climbing club before the pandemic paused the club.
I also was and still am an avid board gamer. I was a regular attendee at the board game club&rsquo;s weekly meetings where I enjoyed overly complex strategy games.</p>
<h2 id="senior-design-capstone-with-the-usda">Senior design capstone with the USDA<a href="#senior-design-capstone-with-the-usda" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>My capstone project in the UNL school of computing was implementing an ArcGIS Online add-in for the United States Department of Agriculture, Natural Resource Conservation Service (USDA NRCS).
One of the functions of the Nebraska NRCS is protecting wetlands.
My five colleagues and I made an ArcGIS add-in for the USDA to assist in collating water, soil, and plant samples to generate wetland surveying, determination, and delineation documentation.</p>
<p>On the team I was the project&rsquo;s development manager and was tasked with assuring the team&rsquo;s product was technically sound.
I architected the program with an emphasis on code extensibility and maintainability.
We had to change the database backing the tool and a future database change was anticipated, so the allowing future developers to easily adapt the application to organization needs was critical.</p>
<p>(See <a href="https://computing.unl.edu/sites/unl.edu.engineering.school-of-computing/files/media/file/SeniorDesignAnnualReport2022-23.pdf">the project&rsquo;s year-end review document</a> on page 29)</p>
<h2 id="research-with-dr-variyam">Research with Dr. Variyam<a href="#research-with-dr-variyam" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>My last year of university I received a <a href="https://www.nsf.gov/awardsearch/show-award/?AWD_ID=1849048">National Science Foundation grant</a> to do undergraduate with <a href="https://cse.unl.edu/~vinod/">Dr. Variyam</a> and his research on Weak Derandomizations in Time and Space Complexity. Our research was expanding on the work of Jakub Pawlewicz and Mihai Pătraᶊcu&rsquo;s &ldquo;Order Statistics in the Farey Sequences in Sublinear Time and Counting Primitive Lattice Points in Polygons&rdquo; <em>Algorithmica 55 (2009): 271-282.</em></p>
<p>Pawlewicz and Pătraᶊcu&rsquo;s work developed an algorithm to compute order statistics in the Farey sequence using the Merten&rsquo;s function.
This connection reveals the Farey order-statistic function&rsquo;s close connection with a host of other fundamental number-theory functions including the Möbius, Merten&rsquo;s, Euler&rsquo;s totient, prime-count, square-free, and Riemann&rsquo;s Zeta functions.
Dr. Variyam and I worked on developing a reduction complexity hierarchy between these functions.</p>
<p>I was also exploring a novel algorithm for approximating and computing the Farey sequence&rsquo;s rank and order using it&rsquo;s discrepancy&mdash;that is, the measure of the deviation of the Farey-sequence from being uniformly distributed.
To this day, I am convinced the discrepancy function can be modeled as a fractal, eluding to a recursive algorithm to compute or approximate it.
Much of my work was exploratory, using a Python to generate and plot Farey sequence and transformations of them.
However, I was blocked from developing any concrete proofs about the Farey sequence by not knowing complex analysis, which is needed to understand and expand on much of the existing work on the subject.</p>
<h2 id="after-undergraduate">After undergraduate<a href="#after-undergraduate" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I graduated in 2023 with a bachelors in science from the University of Nebraska - Lincoln, with majors in mathematics and computer science.
For a time, I considered pursuing a PhD at UNL under the guidance of Dr. Variyam.
I applied to the PhD program, was accepted and received a research assistantship for funding.
Ultimately, however, I decided that it was neither the right time or opportunity for me.
My work with Dr. Variyam was about as theoretical as one can get on the continuum of applied to theoretical computer science research.
From my experience as systems engineering class teaching assistant and as development manager on my team with the USDA, I felt myself drawn more to applied computer science.
While I still feel drawn to pursue a graduate degree in the future, I would prefer to do so after some time working in industry.
I instead moved to Indianapolis seeking working as a software developer.</p>
<h2 id="working-at-non-profit-teachers-treasures">Working at non-profit Teachers&rsquo; Treasures<a href="#working-at-non-profit-teachers-treasures" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>After a few months of unemployment in 2023 after graduation while seeking work, one day I decided &ldquo;I&rsquo;d rather work for free than not at all!&rdquo; and looked around for volunteering opportunities in Indianapolis.
I felt drawn to one in particular <a href="https://www.teacherstreasures.org/">Teachers&rsquo; Treasures</a>, an organization that collects and distributes school supplies to teachers of low-income schools in Marion county. After volunteering for a short time, I was offered paid, full-time work at Teachers&rsquo; Treasures as a warehouse associate.
In addition to warehouse work, I also lead out volunteer groups in logistical tasks, ranging from stocking the store, and sorting donations, and operation during our shopping hours.
During my time at Teachers&rsquo; Treasures from 2023-2024, we helped distribute approximately $13 million in school supplies free of charge to teachers in the Indianapolis metropolitan area.</p>
<h2 id="working-at-ncr-voyix">Working at NCR Voyix<a href="#working-at-ncr-voyix" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Seeking a career more closely aligned with my goal of working in IT, I started work at NCR Voyix in 2024 as a customer engineer&mdash;essentially a retail technology field service technician.
There, I installed and repaired a variety of hardware, including networking equipment (switches, routers, access points, and cabling), self-checkout kiosks (coin and bill recyclers, computer head units, and peripherals), and general use computers.
I also worked closely with our customers to deliver exceptional service, prioritizing timely response times, one-call resolution, and availability during business critical emergencies.
At NCR, my passion for computer networking started to emerge. In Minnesota, I was one of a subset of technicians able to work on networking equipment.
As such, a significant portion of my work was on diagnosing, fixing, or replacing cabling, routers, switches, and access points in our customers&rsquo; retail locations.</p>
]]></content></item><item><title>OPNSense Firewall</title><link>https://fetzner.me/en/projects/opnsense_firewall/</link><pubDate>Wed, 01 Oct 2025 20:16:51 -0600</pubDate><author>Alex Fetzner</author><guid>https://fetzner.me/en/projects/opnsense_firewall/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<h2 id="status-ongoing">Status: Ongoing<a href="#status-ongoing" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="whats-opnsense">What&rsquo;s OPNSense?<a href="#whats-opnsense" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p><a href="https://opnsense.org/#">OPNSense</a> is an open-source, Free BSD-based, firewall OS.</p>
<p>You might&rsquo;ve picked up that this is similar to <a href="https://fetzner.me/en/projects/watchguard_openwrt/">my OpenWRT/T35 project</a>.
In fact, the original intention was to use the T35 as a firewall as is it originally was using OPNSense.
I was discouraged by the fact that OPNSense uses FreeBSD, and although it is Unix-like, I am less familiar with BSD compared to Linux.
On hitting a roadblock getting the internal network-switch to work on my T35 using OpenWRT, I decided to bite the bullet and buy a OPNSense-suitable appliance.
I bought a Dell Wyse with two NICs and installed OPNSense onto it.</p>
<p>OPNSense has richer firewall rules than OpenWRT, and a larger computational footprint.
In summary, OpenWRT is for embedded routers whereas OPNSense is a full-fledged firewall.</p>
<p>Before I had my OPNSense firewall, I had a Raspberry Pi 4 running IPFire.
I was underwhelmed by the features and limitations of IPFire, but principally, the RPi 4 has only one network port and an SD card for storage.
I was bottlenecking my network by using a USB-Ethernet adapter for one of the interfaces.
Also, IPFire has a limitation that it can only have one VLAN assigned per interface, which disrupted my plans to segregate my LAN, WLAN, DMZ, and work VLANS on the same interface.</p>
<h3 id="what-i-am-doing-with-opnsense">What I am doing with OPNSense<a href="#what-i-am-doing-with-opnsense" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>I host a server (including <a href="https://fetzner.me/en/projects/fetznerdotme/">this website</a>) and I wanted to segregate traffic to and from my server from the rest of my network.
This is accomplishable with VLAN segregation and the NetGear VLAN-aware switch I have. It also lets me segregate and monitor my work VLAN and WLAN&rsquo;s traffic.</p>
<p>OPNSense has intrusion detection and prevention baked into it, which I&rsquo;ve yet to fully explore, but I utilize it.</p>
<p>I also wanted to host a <a href="https://www.wireguard.com/">wireguard</a> peer to serve as a relay and ingress for my private LAN.
The WireGuard tunnel lets me stream video, VNC, file-sharing, and ssh from and between my trusted devices and my LAN.</p>
<p>Lastly, OPNSense can host a DNS server, which was the original catalyst for using IPFire. That way I can address my servers, PC, laptop, and phone by domain name instead of IP; very handy!</p>
]]></content></item><item><title>Porting OpenWRT to a WatchGuard Firebox T35</title><link>https://fetzner.me/en/projects/watchguard_openwrt/</link><pubDate>Mon, 01 Sep 2025 18:11:11 -0600</pubDate><author>Alex Fetzner</author><guid>https://fetzner.me/en/projects/watchguard_openwrt/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<h2 id="status-ongoing">Status: Ongoing<a href="#status-ongoing" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="whats-openwrt">What&rsquo;s OpenWRT?<a href="#whats-openwrt" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p><a href="https://openwrt.org/#welcome_to_the_openwrt_project">OpenWRT</a> is an open-source, Linux-based, community-developed, router OS for embedded devices.</p>
<h3 id="whats-a-firebox-t35">What&rsquo;s a Firebox T35?<a href="#whats-a-firebox-t35" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>A Firebox T35 is a hardware firewall developed by WatchGuard. Its a 5-port, gigabyte firebox designed for small business and offices.
It was declared end-of-life by WatchGuard in 2025, with support no longer being provided, nor security firmware/software updates.
Because of it&rsquo;s end-of-life, it&rsquo;s no longer useful as a security appliance for production use.</p>
<h3 id="why-then-install-a-router-os-on-a-firewall">Why then, install a router OS on a firewall?<a href="#why-then-install-a-router-os-on-a-firewall" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>One can find a glut of used, T35s on E-Bay for as little as $20 that are physically in perfect working order.
A friend of mine gave me her used T35 to tinker with.
I was initially interested in installing OPNSense, an open-source firewall OS based on Open-BSD, on the hardware.
The T35, uses the NXP/Freescale T1024 SoC which uses a PowerPC64 architecture.
While the OpenBSD kernel and OPNSense supports PPC64 architecture, and even the QoriQ family of chips the T35 uses,
at the beginning of the project I was mistaken that it was not compatible with PPC64.
Neither OpenWRT nor OPNSense support the T35 with readily installed image.</p>
<p>I decided that it was a worthwhile endeavor to contribute support for the T35 to the OpenWRT project.
Further, the T35 is part of the T-series, a series of similar tabletop firewalls, and development work on the T35 would likely
lead to easier development for support on the other devices in the series.
As of the time of writing, the only WatchGuard product with OpenWRT support is the m300.</p>
<h3 id="first-steps">First steps<a href="#first-steps" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>Gratefully, the T35 has a number of features that make it easier to reverse-engineer and develop on.
Namely, the storage is a removable, writable mSATA SSD.
None of the drive is encrypted (that I encountered, at least).
The first thing I did was remove the drive and capture an image of the entire SSD and each of the partitions.
On booting the WatchGuard, the user is greeted by a U-Boot boot-loader selection menu to boot into standard or recovery mode from the first three partitions.
The partitions each contain a kernel u-image and a device tree.
As expected, the boot-loader boots the kernel in the selected partition.</p>
<p>There is a u-boot command line available where one could change the boot parameters and command-line, but it is password protected.
Ideally, I would reflash the boot-loader so that I could edit it, but a mistake would likely brick the board without a way for me to boot again.
Instead, my plan was to write the OpenWRT kernel and file-system to the SSD partitioned and named the same way such that the existing boot-loader would boot it none the wiser that it was actually booting OpenWRT instead.</p>
<h3 id="getting-a-linux-command-line-on-the-stock-image">Getting a Linux command-line on the stock image<a href="#getting-a-linux-command-line-on-the-stock-image" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>There was much information that would be useful the collect at runtime on the stock image of the T35, namely the information in the <code>/proc</code> file-system. The difficulty is, the shell that one gets in a T35, even when logged in as the admin user, is not a standard Linux shell where one could read and edit files; it&rsquo;s a secure network-appliance shell that deliberately makes it difficult to escape and execute standard Linux commands.
My first attempt was the swap out the <code>/sbin/init</code> process so my script would collect the information I needed and dump it to a file on the disk.
The two problems were:</p>
<ol>
<li>Without the original <code>init</code> process running, much of the info I needed was uninitialized&hellip; whoda guessed that?</li>
<li>The file-system was a <code>tempfs</code> so all writes, even to an external USB drive, were ephemeral</li>
</ol>
<p>Back to the drawing board&hellip;</p>
<p>Fortunately, the WatchGuard engineers sensibly named the user the CLI process runs as user <code>cli</code> and the shell it runs is <code>/usr/bin/cli</code>.
I swapped the file <code>/usr/bin/cli</code> with a BusyBox shell executable, and after logging in through the normal WatchGuard log-in, it launched me a BusyBox shell where I could read and list the files I needed from the <code>/proc</code> tree.
The WatchGuard stock kernel left <code>CONFIG_IKCONFIG_PROC=y</code> in their <code>.config</code>, so I was able to get the original kernel configuration from the running, original stock image.</p>
]]></content></item></channel></rss>