712 lines
22 KiB
HTML
712 lines
22 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>River Rooks | Blog Lander (Asymmetric 3-Tile Workspace)</title>
|
|
<style>
|
|
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,500;0,700;1,400&family=Inter:wght@400;500;700&family=JetBrains+Mono:ital,wght@0,400;0,500;1,400&display=swap');
|
|
|
|
:root {
|
|
--bg-canvas: #0d0f12; /* Deep slate/charcoal canvas */
|
|
--bg-surface: #121417; /* Tile surface */
|
|
--bg-elevated: #1c1f26; /* Hovered tile surface */
|
|
--border-color: #2b303b; /* Crisp 1px solid border */
|
|
--text-primary: #e0e6f0; /* Light off-white prose */
|
|
--text-muted: #8a95a5; /* Monospace metadata */
|
|
--accent-cyan: #00f0ff; /* Primary active accent */
|
|
--accent-green: #00e676; /* Operational status indicator */
|
|
--accent-amber: #ffb700; /* Pinned highlight accent */
|
|
}
|
|
|
|
* {
|
|
box-sizing: border-box;
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
body {
|
|
background-color: var(--bg-canvas);
|
|
color: var(--text-primary);
|
|
font-family: 'Inter', sans-serif;
|
|
line-height: 1.6;
|
|
min-height: 100vh;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
padding: 24px 16px 48px 16px;
|
|
}
|
|
|
|
.tiling-layout {
|
|
width: 100%;
|
|
max-width: 1120px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16px;
|
|
}
|
|
|
|
/* Top Global Header Bar (Gateway 3 Standard) */
|
|
.global-bar {
|
|
background-color: var(--bg-surface);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 4px;
|
|
padding: 10px 18px;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.8rem;
|
|
flex-wrap: wrap;
|
|
gap: 10px;
|
|
}
|
|
|
|
.brand-group {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
color: var(--text-primary);
|
|
font-weight: 700;
|
|
}
|
|
|
|
.status-indicator {
|
|
width: 8px;
|
|
height: 8px;
|
|
background-color: var(--accent-green);
|
|
display: inline-block;
|
|
}
|
|
|
|
.bar-nav {
|
|
display: flex;
|
|
gap: 14px;
|
|
align-items: center;
|
|
}
|
|
|
|
.bar-link {
|
|
color: var(--text-muted);
|
|
text-decoration: none;
|
|
transition: none; /* Instant snap */
|
|
}
|
|
|
|
.bar-link:hover {
|
|
color: var(--accent-cyan);
|
|
}
|
|
|
|
.bar-link.active {
|
|
color: var(--text-primary);
|
|
border-bottom: 1px solid var(--accent-cyan);
|
|
}
|
|
|
|
/* Hero Manifesto Tile */
|
|
.hero-tile {
|
|
background-color: var(--bg-surface);
|
|
border: 1px solid var(--border-color);
|
|
border-left: 3px solid var(--accent-cyan);
|
|
border-radius: 4px;
|
|
padding: 24px 28px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
}
|
|
|
|
.hero-pretitle {
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.8rem;
|
|
color: var(--accent-cyan);
|
|
letter-spacing: 0.06em;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.hero-title {
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 2.1rem;
|
|
font-weight: 700;
|
|
color: var(--text-primary);
|
|
letter-spacing: -0.02em;
|
|
}
|
|
|
|
.hero-prose {
|
|
font-size: 0.98rem;
|
|
color: var(--text-primary);
|
|
line-height: 1.65;
|
|
max-width: 84ch;
|
|
}
|
|
|
|
/* Interactive Grep Bar */
|
|
.grep-bar {
|
|
background-color: var(--bg-canvas);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 3px;
|
|
padding: 8px 14px;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.82rem;
|
|
}
|
|
|
|
.grep-prompt {
|
|
color: var(--accent-cyan);
|
|
font-weight: 700;
|
|
}
|
|
|
|
.grep-input {
|
|
background: transparent;
|
|
border: none;
|
|
outline: none;
|
|
color: var(--text-primary);
|
|
font-family: inherit;
|
|
font-size: 0.82rem;
|
|
flex: 1;
|
|
}
|
|
|
|
/* Main Asymmetric Split Grid */
|
|
.split-grid {
|
|
display: grid;
|
|
grid-template-columns: 1.25fr 0.75fr;
|
|
gap: 16px;
|
|
}
|
|
|
|
@media (max-width: 880px) {
|
|
.split-grid {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
}
|
|
|
|
/* Standard Tile Container */
|
|
.tile {
|
|
background-color: var(--bg-surface);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 4px;
|
|
padding: 20px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 14px;
|
|
}
|
|
|
|
.tile-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: baseline;
|
|
border-bottom: 1px solid var(--border-color);
|
|
padding-bottom: 10px;
|
|
}
|
|
|
|
.tile-title {
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.92rem;
|
|
font-weight: 700;
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.tile-meta {
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.74rem;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
/* Featured Entry Card inside Primary Column */
|
|
.featured-entry {
|
|
background-color: var(--bg-canvas);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 3px;
|
|
padding: 16px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 10px;
|
|
}
|
|
|
|
.featured-entry:hover {
|
|
border-color: var(--accent-cyan);
|
|
}
|
|
|
|
.entry-badge-row {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.75rem;
|
|
}
|
|
|
|
.entry-title {
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 1.2rem;
|
|
font-weight: 700;
|
|
color: var(--text-primary);
|
|
text-decoration: none;
|
|
line-height: 1.35;
|
|
transition: none;
|
|
}
|
|
|
|
.entry-title:hover {
|
|
color: var(--accent-cyan);
|
|
}
|
|
|
|
.entry-abstract {
|
|
font-size: 0.9rem;
|
|
color: var(--text-primary);
|
|
line-height: 1.6;
|
|
}
|
|
|
|
/* Code Preview Box */
|
|
.snippet-box {
|
|
background-color: var(--bg-surface);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 3px;
|
|
font-family: 'JetBrains Mono', monospace;
|
|
font-size: 0.76rem;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.snippet-head {
|
|
background-color: var(--bg-canvas);
|
|
border-bottom: 1px solid var(--border-color);
|
|
padding: 4px 10px;
|
|
color: var(--text-muted);
|
|
display: flex;
|
|
justify-content: space-between;
|
|
font-size: 0.72rem;
|
|
}
|
|
|
|
.snippet-body {
|
|
padding: 10px;
|
|
overflow-x: auto;
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.entry-footer-row {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding-top: 8px;
|
|
border-top: 1px solid var(--border-color);
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.76rem;
|
|
}
|
|
|
|
.read-pill {
|
|
background-color: var(--accent-cyan);
|
|
color: var(--bg-canvas);
|
|
padding: 4px 10px;
|
|
font-weight: 700;
|
|
border-radius: 2px;
|
|
text-decoration: none;
|
|
transition: none;
|
|
}
|
|
|
|
.read-pill:hover {
|
|
background-color: transparent;
|
|
color: var(--accent-cyan);
|
|
box-shadow: inset 0 0 0 1px var(--accent-cyan);
|
|
}
|
|
|
|
/* Right Column Component: Track Cards */
|
|
.track-tile-item {
|
|
background-color: var(--bg-canvas);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 3px;
|
|
padding: 12px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
text-decoration: none;
|
|
transition: none;
|
|
}
|
|
|
|
.track-tile-item:hover {
|
|
border-color: var(--accent-cyan);
|
|
background-color: var(--bg-elevated);
|
|
}
|
|
|
|
.track-title {
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.85rem;
|
|
font-weight: 700;
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.track-tile-item:hover .track-title {
|
|
color: var(--accent-cyan);
|
|
}
|
|
|
|
.track-meta {
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.72rem;
|
|
color: var(--accent-cyan);
|
|
}
|
|
|
|
.track-desc {
|
|
font-size: 0.8rem;
|
|
color: var(--text-muted);
|
|
line-height: 1.45;
|
|
}
|
|
|
|
/* Right Column: Mini Feed Items */
|
|
.compact-feed-item {
|
|
background-color: var(--bg-canvas);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 3px;
|
|
padding: 12px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
}
|
|
|
|
.compact-feed-item:hover {
|
|
border-color: var(--accent-cyan);
|
|
}
|
|
|
|
.compact-date {
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.74rem;
|
|
color: var(--accent-cyan);
|
|
}
|
|
|
|
.compact-title {
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.92rem;
|
|
font-weight: 700;
|
|
color: var(--text-primary);
|
|
text-decoration: none;
|
|
line-height: 1.35;
|
|
}
|
|
|
|
.compact-title:hover {
|
|
color: var(--accent-cyan);
|
|
}
|
|
|
|
/* Global Footer Tile (Gateway 3 Match) */
|
|
.footer-tile {
|
|
background-color: var(--bg-surface);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 4px;
|
|
padding: 12px 20px;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
font-family: 'IBM Plex Mono', monospace;
|
|
font-size: 0.78rem;
|
|
color: var(--text-muted);
|
|
flex-wrap: wrap;
|
|
gap: 10px;
|
|
}
|
|
|
|
.footer-links-cluster {
|
|
display: flex;
|
|
gap: 12px;
|
|
align-items: center;
|
|
}
|
|
|
|
.footer-btn {
|
|
color: var(--text-primary);
|
|
text-decoration: none;
|
|
padding: 2px 4px;
|
|
transition: none;
|
|
}
|
|
|
|
.footer-btn:hover {
|
|
background-color: var(--accent-cyan);
|
|
color: var(--bg-canvas);
|
|
}
|
|
|
|
.pipe {
|
|
color: var(--border-color);
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<main class="tiling-layout">
|
|
|
|
<!-- Top Global Bar (Matching Gateway 3 Exactly) -->
|
|
<header class="global-bar">
|
|
<div class="brand-group">
|
|
<span class="status-indicator"></span>
|
|
<span>RIVER ROOKS // TECHNICAL NOTES WORKSPACE</span>
|
|
</div>
|
|
<nav class="bar-nav" aria-label="Top Navigation">
|
|
<a href="service-gateway-tiling.html" class="bar-link">Gateway 3 ↗</a>
|
|
<a href="#" class="bar-link active">> Field Notes</a>
|
|
<a href="https://git.rooks.dev" target="_blank" rel="noopener" class="bar-link">Git Forge</a>
|
|
<a href="feed.xml" class="bar-link">RSS Feed</a>
|
|
<a href="index.html" class="bar-link">Catalog ↗</a>
|
|
</nav>
|
|
</header>
|
|
|
|
<!-- Hero Tile: Mission Statement & Live Filter -->
|
|
<section class="hero-tile" aria-label="Notes Mission">
|
|
<div class="hero-pretitle">SYSTEM DISPATCHES • KNOWLEDGE BASE</div>
|
|
<h1 class="hero-title">Technical Notes & Systems Architecture</h1>
|
|
<p class="hero-prose">
|
|
Deep technical documentation on network forensics, self-hosted hypervisor infrastructure, embedded hardware exploitation, and minimal Unix tool design.
|
|
</p>
|
|
|
|
<div class="grep-bar">
|
|
<span class="grep-prompt">dev-blog@system:~$</span>
|
|
<span style="color: var(--text-muted);">grep -i</span>
|
|
<input
|
|
type="text"
|
|
id="liveFilterInput"
|
|
class="grep-input"
|
|
placeholder="filter dispatches by keyword, hardware, or ctf..."
|
|
oninput="filterArticles(this.value)"
|
|
>
|
|
<span id="matchStats" style="color: var(--accent-green); font-size: 0.74rem;">5 dispatches loaded</span>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Asymmetric Split Grid -->
|
|
<div class="split-grid">
|
|
|
|
<!-- Left Column: Featured Articles & Primary Feed -->
|
|
<div style="display: flex; flex-direction: column; gap: 16px;">
|
|
|
|
<!-- Tile: Featured Article 1 (Hardware Lead) -->
|
|
<section class="tile article-container" data-keywords="firmware hardware security spi bus-pirate flash extraction" aria-label="Lead Article 1">
|
|
<div class="tile-header">
|
|
<div class="tile-title">
|
|
<span>// FEATURED WRITE-UP 01</span>
|
|
</div>
|
|
<span class="tile-meta">2026-07-20 • 8 MIN READ</span>
|
|
</div>
|
|
|
|
<div class="featured-entry">
|
|
<div class="entry-badge-row">
|
|
<span style="color: var(--accent-amber); font-weight: 700;">[PINNED RESEARCH]</span>
|
|
<span style="color: var(--text-muted);">~/notes/iot-firmware-spi-extraction.md</span>
|
|
</div>
|
|
|
|
<h2 style="margin: 0;">
|
|
<a href="#" class="entry-title">> Reverse Engineering IoT Firmware: SPI Flash Extraction</a>
|
|
</h2>
|
|
|
|
<p class="entry-abstract">
|
|
In security audits of embedded systems, retrieving the firmware is the critical first step. When over-the-air updates are encrypted and debug ports (UART, JTAG) are disabled in production silicon, dumping physical SPI Flash memory becomes necessary. This writeup covers extracting firmware from an 8-pin SOP SPI flash chip using a Bus Pirate and flashrom.
|
|
</p>
|
|
|
|
<div class="snippet-box">
|
|
<div class="snippet-head">
|
|
<span>extract_firmware.sh</span>
|
|
<span>POSIX sh</span>
|
|
</div>
|
|
<div class="snippet-body">
|
|
<pre><code># Query the SPI flash details using flashrom via Bus Pirate
|
|
flashrom -p buspirate_spi:dev=/dev/ttyUSB0,spispeed=1M -r firmware_dump.bin
|
|
|
|
# Verify the integrity of the binary dump by comparing hashes
|
|
if [ $? -eq 0 ]; then
|
|
echo "Dump successful. Running md5sum..."
|
|
md5sum firmware_dump.bin
|
|
fi</code></pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="entry-footer-row">
|
|
<span style="color: var(--text-muted);">[#firmware] [#hardware] [#security] [#bus-pirate]</span>
|
|
<a href="#" class="read-pill">READ WRITEUP [8 MIN] →</a>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Tile: Featured Article 2 (Infrastructure Lead) -->
|
|
<section class="tile article-container" data-keywords="homelab docker traefik networking compose proxy acme" aria-label="Lead Article 2">
|
|
<div class="tile-header">
|
|
<div class="tile-title">
|
|
<span>// FEATURED WRITE-UP 02</span>
|
|
</div>
|
|
<span class="tile-meta">2026-07-15 • 12 MIN READ</span>
|
|
</div>
|
|
|
|
<div class="featured-entry">
|
|
<div class="entry-badge-row">
|
|
<span style="color: var(--accent-cyan); font-weight: 700;">[INFRASTRUCTURE SPEC]</span>
|
|
<span style="color: var(--text-muted);">~/notes/ha-traefik-docker.md</span>
|
|
</div>
|
|
|
|
<h2 style="margin: 0;">
|
|
<a href="#" class="entry-title">> Building a High-Availability Traefik Router with Docker Compose</a>
|
|
</h2>
|
|
|
|
<p class="entry-abstract">
|
|
Architecting automated TLS wildcard certificate propagation, Docker provider label routing, zero-downtime container updates, and backend health-check failover routes on bare-metal infrastructure.
|
|
</p>
|
|
|
|
<div class="snippet-box">
|
|
<div class="snippet-head">
|
|
<span>traefik-compose.yml</span>
|
|
<span>YAML</span>
|
|
</div>
|
|
<div class="snippet-body">
|
|
<pre><code>services:
|
|
traefik:
|
|
image: traefik:v3.1
|
|
command:
|
|
- "--providers.docker=true"
|
|
- "--entrypoints.websecure.address=:443"
|
|
- "--certificatesresolvers.cf.acme.dnschallenge=true"</code></pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="entry-footer-row">
|
|
<span style="color: var(--text-muted);">[#homelab] [#docker-traefik] [#networking]</span>
|
|
<a href="#" class="read-pill">READ WRITEUP [12 MIN] →</a>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Tile: Featured Article 3 (Unix Systems) -->
|
|
<section class="tile article-container" data-keywords="posix-sh shell unix portability alpine scripts bashisms" aria-label="Lead Article 3">
|
|
<div class="tile-header">
|
|
<div class="tile-title">
|
|
<span>// SYSTEMS & SCRIPTING DISPATCH</span>
|
|
</div>
|
|
<span class="tile-meta">2026-07-10 • 6 MIN READ</span>
|
|
</div>
|
|
|
|
<div class="featured-entry">
|
|
<div class="entry-badge-row">
|
|
<span style="color: var(--accent-green); font-weight: 700;">[STANDARDS & COMPLIANCE]</span>
|
|
<span style="color: var(--text-muted);">~/notes/posix-sh-vs-bash.md</span>
|
|
</div>
|
|
|
|
<h2 style="margin: 0;">
|
|
<a href="#" class="entry-title">> POSIX sh vs. Bash: Portability in Modern Scripts</a>
|
|
</h2>
|
|
|
|
<p class="entry-abstract">
|
|
Analyzing edge-case incompatibilities, syntax overhead, eliminating bashisms, and writing fast, bulletproof bootstrapping scripts for Alpine and embedded targets conforming to IEEE Std 1003.1.
|
|
</p>
|
|
|
|
<div class="entry-footer-row">
|
|
<span style="color: var(--text-muted);">[#posix-sh] [#shell] [#unix]</span>
|
|
<a href="#" class="read-pill">READ WRITEUP [6 MIN] →</a>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
</div>
|
|
|
|
<!-- Right Column: Curated Tracks & Additional Dispatches -->
|
|
<div style="display: flex; flex-direction: column; gap: 16px;">
|
|
|
|
<!-- Curated Topic Tracks Tile -->
|
|
<section class="tile" aria-label="Curated Topic Tracks">
|
|
<div class="tile-header">
|
|
<div class="tile-title">
|
|
<span>// CURATED TRACKS</span>
|
|
</div>
|
|
<span class="tile-meta">SPECIALIZATIONS</span>
|
|
</div>
|
|
|
|
<div style="display: flex; flex-direction: column; gap: 8px;">
|
|
|
|
<a href="#" class="track-tile-item">
|
|
<div class="track-title">Embedded Silicon & Hardware</div>
|
|
<div class="track-meta">[1 ARTICLE • BUS PIRATE]</div>
|
|
<p class="track-desc">Physical chip extraction, UART/JTAG probing, SPI dump validation.</p>
|
|
</a>
|
|
|
|
<a href="#" class="track-tile-item">
|
|
<div class="track-title">Self-Hosted Infrastructure</div>
|
|
<div class="track-meta">[2 ARTICLES • TRAEFIK & WIREGUARD]</div>
|
|
<p class="track-desc">Automated edge routing, zero-trust overlay networks, VLAN firewalls.</p>
|
|
</a>
|
|
|
|
<a href="#" class="track-tile-item">
|
|
<div class="track-title">Low-Level Binary Exploitation</div>
|
|
<div class="track-meta">[1 ARTICLE • GLIBC HEAP]</div>
|
|
<p class="track-desc">Memory allocator internals, tcache safe-linking mangling bypass.</p>
|
|
</a>
|
|
|
|
<a href="#" class="track-tile-item">
|
|
<div class="track-title">Zero-Allocation Tooling</div>
|
|
<div class="track-meta">[1 ARTICLE • POSIX SH]</div>
|
|
<p class="track-desc">High-throughput logging, shell parser ASTs, minimalist runtimes.</p>
|
|
</a>
|
|
|
|
</div>
|
|
</section>
|
|
|
|
<!-- More Articles in Archive Tile -->
|
|
<section class="tile" aria-label="Additional Dispatches">
|
|
<div class="tile-header">
|
|
<div class="tile-title">
|
|
<span>// CTF & SECURITY WIRE</span>
|
|
</div>
|
|
<span class="tile-meta">REPORTS</span>
|
|
</div>
|
|
|
|
<div style="display: flex; flex-direction: column; gap: 10px;">
|
|
|
|
<!-- Post 4: Heap Exploitation -->
|
|
<div class="compact-feed-item article-container" data-keywords="ctf binary exploitation heap glibc 2.35 memory security">
|
|
<span class="compact-date">2026-06-28 • 15 min read</span>
|
|
<a href="#" class="compact-title">> CTF Write-up: Heap Exploitation in glibc 2.35</a>
|
|
<p style="font-size: 0.8rem; color: var(--text-muted); line-height: 1.45;">
|
|
Deconstructing tcache safe-linking pointer mangling, bypass primitives, and House of Apple file structure hijacking.
|
|
</p>
|
|
<div style="font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; color: var(--text-muted); margin-top: 4px;">
|
|
[#ctf] [#binary-exploitation]
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Post 5: Zero-Trust WireGuard -->
|
|
<div class="compact-feed-item article-container" data-keywords="networking wireguard security zerotrust opnsense vlans">
|
|
<span class="compact-date">2026-06-14 • 10 min read</span>
|
|
<a href="#" class="compact-title">> Zero-Trust Network Isolation with WireGuard & OPNsense VLANs</a>
|
|
<p style="font-size: 0.8rem; color: var(--text-muted); line-height: 1.45;">
|
|
Designing strict zone-based firewall rules across isolated VLANs with point-to-point WireGuard cryptographic routing.
|
|
</p>
|
|
<div style="font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; color: var(--text-muted); margin-top: 4px;">
|
|
[#networking] [#wireguard]
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</section>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Global Footer Tile (Matching Gateway 3 Exactly) -->
|
|
<footer class="footer-tile">
|
|
<div>River Rooks • University of Alabama College of Engineering</div>
|
|
<nav class="footer-links-cluster" aria-label="Global Footer Links">
|
|
<a href="service-gateway-tiling.html" class="footer-btn">Gateway Lander</a>
|
|
<span class="pipe">|</span>
|
|
<a href="feed.xml" class="footer-btn">RSS</a>
|
|
<span class="pipe">|</span>
|
|
<a href="https://git.rooks.dev" target="_blank" rel="noopener" class="footer-btn">Forgejo</a>
|
|
<span class="pipe">|</span>
|
|
<a href="mailto:river@rooks.dev" class="footer-btn">river@rooks.dev</a>
|
|
<span class="pipe">|</span>
|
|
<a href="#" title="Fingerprint: 0x4A8E92F1C0B3D4E7" class="footer-btn">PGP</a>
|
|
<span class="pipe">|</span>
|
|
<a href="index.html" class="footer-btn">Catalog ↗</a>
|
|
</nav>
|
|
</footer>
|
|
|
|
</main>
|
|
|
|
<script>
|
|
function filterArticles(query) {
|
|
const q = query.toLowerCase().trim();
|
|
const items = document.querySelectorAll('.article-container');
|
|
let matches = 0;
|
|
|
|
items.forEach(item => {
|
|
const text = (item.innerText + ' ' + (item.getAttribute('data-keywords') || '')).toLowerCase();
|
|
if (!q || text.includes(q)) {
|
|
item.style.display = '';
|
|
matches++;
|
|
} else {
|
|
item.style.display = 'none';
|
|
}
|
|
});
|
|
|
|
document.getElementById('matchStats').innerText = `${matches} dispatches visible`;
|
|
}
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|