<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Sysadmin on Marcello Barnaba</title>
    <link>https://sindro.me/it/tags/sysadmin/</link>
    <description>Recent content in Sysadmin on Marcello Barnaba</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Fri, 03 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://sindro.me/it/tags/sysadmin/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>wifi-dethrash: trovare e risolvere il thrashing WiFi mesh su OpenWrt</title>
      <link>https://sindro.me/it/posts/2026-04-03-wifi-dethrash-openwrt-mesh-analyzer/</link>
      <pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-04-03-wifi-dethrash-openwrt-mesh-analyzer/</guid>
      <description>&lt;p&gt;Tutto è cominciato con il &lt;a href=&#34;https://sindro.me/posts/2026-02-15-wifi-presence-detection-home-assistant/&#34;&gt;rilevamento presenza WiFi&lt;/a&gt;. Avevo costruito un sistema che traccia in quale stanza si trova ognuno scrapando l&amp;rsquo;RSSI dai miei AP OpenWrt. Funzionava &amp;ndash; ma le assegnazioni delle stanze continuavano a sfarfallare. Cucina. Ufficio. Cucina. Ufficio. Tre volte in dieci secondi. La macchina a stati era a posto. Il WiFi no.&lt;/p&gt;&#xA;&lt;p&gt;La mia rete domestica ha sei AP OpenWrt su tre piani, due SSID &amp;ndash; Mercury su 5 GHz, Saturn su 2,4 GHz &amp;ndash; tutti con 802.11r per il roaming veloce. Vista da fuori, sembra una mesh fatta bene. Vista da dentro, un telefono rimbalzava tra access point &lt;strong&gt;129 volte in 24 ore&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Non lo sapevo finché non ho costruito lo strumento per vederlo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2026-04-03-wifi-dethrash-openwrt-mesh-analyzer/roaming-timeline-24h.png&#34; alt=&#34;Timeline di roaming — 24 ore&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ogni riga è un client WiFi, il colore mostra a quale AP è connesso. I client sani mostrano barre lunghe e piene. Quelli malati sembrano pali da barbiere. Vedi &lt;code&gt;sara-iphone&lt;/code&gt;? Quella striscia arcobaleno sono 129 connessioni in 24 ore &amp;ndash; il telefono cammina in una zona di overlap tra due AP dove entrambi hanno un segnale circa uguale (e orrendo).&lt;/p&gt;&#xA;&lt;h2 id=&#34;il-problema-che-non-puoi-vedere&#34;&gt;Il problema che non puoi vedere&lt;/h2&gt;&#xA;&lt;p&gt;Il roaming WiFi è invisibile. Il tuo telefono mostra tutte le tacche, Netflix bufferizza un attimo, e tu dai la colpa alla connessione internet. Ma quello che è successo davvero è che il tuo telefono si è disconnesso da un AP, ha scansionato le alternative, ne ha scelto un altro con un segnale marginalmente diverso, si è associato, autenticato, e ha ricominciato lo streaming &amp;ndash; tutto in meno di un secondo se 802.11r funziona, diversi secondi se non funziona.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rilevamento presenza WiFi per Home Assistant con OpenWrt</title>
      <link>https://sindro.me/it/posts/2026-02-15-wifi-presence-detection-home-assistant/</link>
      <pubDate>Sun, 15 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-02-15-wifi-presence-detection-home-assistant/</guid>
      <description>&lt;p&gt;Avevo due problemi con il rilevamento presenza di Home Assistant.&lt;/p&gt;&#xA;&lt;p&gt;Il primo: il GPS ti dice &lt;em&gt;se&lt;/em&gt; qualcuno è a casa, ma non &lt;em&gt;dove&lt;/em&gt; in casa si trova. La mia casa ha sei access point OpenWrt distribuiti su tre piani. Sanno già esattamente quale telefono è connesso a quale AP in ogni momento &amp;ndash; sono dati di presenza a livello di stanza, lì nello stack WiFi, che urlano per essere usati. Sapere chi è in quale stanza apre un&amp;rsquo;intera classe di automazioni che il GPS non può toccare: luci che ti seguono, climatizzazione per stanza occupata, una dashboard che mostra la situazione della casa a colpo d&amp;rsquo;occhio.&lt;/p&gt;&#xA;&lt;p&gt;Il secondo: la nostra donna delle pulizie sta a casa nostra un paio di giorni a settimana. Non voglio configurarle un account HA completo, installarle l&amp;rsquo;app companion sul telefono, o avere a che fare con i permessi GPS. Ma &lt;em&gt;devo&lt;/em&gt; sapere se è a casa &amp;ndash; perché la mia automazione dell&amp;rsquo;allarme ha bisogno di sapere se la casa è davvero vuota prima di attivarsi. Il suo telefono si connette al WiFi. Mi basta questo.&lt;/p&gt;&#xA;&lt;p&gt;Così ho scritto &lt;a href=&#34;https://github.com/vjt/openwrt-ha-presence&#34; target=&#34;_blank&#34;&gt;openwrt-ha-presence&lt;/a&gt;: una macchina a stati che scrapa le metriche RSSI direttamente dai tuoi AP OpenWrt, capisce in quale stanza si trova ogni persona in base alla potenza del segnale, e pubblica lo stato casa/fuori per ogni persona su Home Assistant via MQTT Discovery. Niente cloud, niente beacon, niente parsing di log, niente database time-series. Python, async, ~600 righe di logica effettiva.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2026-02-15-wifi-presence-detection-home-assistant/home-assistant.png&#34; alt=&#34;Storico tracking stanze di Home Assistant&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>5G come backup della fibra: non perdere mai più una riunione</title>
      <link>https://sindro.me/it/posts/2026-01-31-quectel-5g-modem-tools-for-openwrt/</link>
      <pubDate>Sat, 31 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-01-31-quectel-5g-modem-tools-for-openwrt/</guid>
      <description>&lt;p&gt;Un paio di mesi fa, la fibra è andata giù. Come da primo corollario di Murphy, è successo nel momento peggiore in assoluto: subito prima di una riunione cruciale con un&amp;rsquo;azienda partner. Mi sono ritrovato a saltare freneticamente tra l&amp;rsquo;AP di un vicino lontano e l&amp;rsquo;hotspot del telefono, ma entrambi facevano schifo. Parliamo di 200ms di RTT e 15% di packet loss. Mi stavo scusando a profusione mentre il mio feed video si trasformava in uno slideshow del 1998; nessuno capiva una parola di quello che dicevo. Ho finito per spegnere il video e stare zitto. Opportunità persa. &lt;strong&gt;Mai. Più.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Così sono andato in modalità paranoica totale e ho costruito un setup di backup 5G serio.&lt;/p&gt;&#xA;&lt;h2 id=&#34;lhardware&#34;&gt;L&amp;rsquo;hardware&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.gl-inet.com/products/gl-x3000/&#34; target=&#34;_blank&#34;&gt;GL.iNet X-3000&lt;/a&gt; con modem Quectel RM520N-GL&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://poynting.tech/antennas/xpol-24/&#34; target=&#34;_blank&#34;&gt;Poynting XPOL-24&lt;/a&gt; antenna direzionale montata sul muro fuori dal mio ufficio&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Il segnale 5G qui è inesistente, quindi ho dovuto usare l&amp;rsquo;artiglieria pesante. La Poynting è una bestia. 11 dBi di guadagno, vero MIMO 4x4, cross-polarizzata, stagna. Puntala verso la torre più vicina e all&amp;rsquo;improvviso il SINR salta da &amp;ldquo;meh&amp;rdquo; a &amp;ldquo;porco dio!&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Ma puntare un&amp;rsquo;antenna direzionale senza feedback visivo è doloroso. In pratica giri in tondo, aggiorni una web UI, bestemmi guardando il cielo.&lt;/p&gt;&#xA;&lt;h2 id=&#34;il-software&#34;&gt;Il software&lt;/h2&gt;&#xA;&lt;p&gt;Ho scritto un set di strumenti per risolvere il problema: &lt;a href=&#34;https://github.com/vjt/quectel-5g-tools&#34; target=&#34;_blank&#34;&gt;quectel-5g-tools&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;5g-info&lt;/code&gt; scarica tutto quello che il tuo modem sa in un formato leggibile:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2026-01-31-quectel-5g-modem-tools-for-openwrt/5g-info.png&#34; alt=&#34;output di 5g-info&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;5g-monitor&lt;/code&gt; è una TUI ncurses che si aggiorna in tempo reale e &amp;ndash; qui viene il bello &amp;ndash; &lt;strong&gt;emette beep in base al SINR&lt;/strong&gt;. Qualità del segnale più alta = più beep. Punta l&amp;rsquo;antenna, ascolta i beep, stringi i bulloni. Fatto.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker vs. iptables: una storia di rabbia e la chain DOCKER-USER</title>
      <link>https://sindro.me/it/posts/2026-01-30-docker-vs-iptables-rage-and-docker-user-chain/</link>
      <pubDate>Fri, 30 Jan 2026 00:00:00 +0100</pubDate>
      <guid>https://sindro.me/it/posts/2026-01-30-docker-vs-iptables-rage-and-docker-user-chain/</guid>
      <description>&lt;p&gt;Siamo nel 2026, e stiamo ancora lottando con l&amp;rsquo;arroganza assoluta di Docker riguardo al networking Linux.&lt;/p&gt;&#xA;&lt;p&gt;Ecco lo scenario: faccio girare un host ibrido. Da un lato, ho una macchina virtuale KVM che fa girare &lt;strong&gt;Home Assistant&lt;/strong&gt; (perché ho bisogno del controllo completo del SO e della &lt;a href=&#34;https://sindro.me/posts/2026-01-20-raspberry-pi-luks-encrypted-root/&#34; target=&#34;_blank&#34;&gt;cifratura del disco&lt;/a&gt;).&#xA;Dall&amp;rsquo;altro, ho la solita lista di container Docker &amp;ndash; &lt;strong&gt;NUT&lt;/strong&gt; per monitorare il mio UPS Lakeview (Vultech) di merda e &lt;strong&gt;Technitium&lt;/strong&gt; per DNS e DHCP &amp;ndash; in esecuzione direttamente sull&amp;rsquo;host.&lt;/p&gt;&#xA;&lt;p&gt;Sembra semplice. Dovrebbe essere semplice.&lt;/p&gt;&#xA;&lt;p&gt;Ma nel momento in cui ho installato Docker, la comunicazione con la mia VM Home Assistant è morta. Semplicemente cessata di esistere.&lt;/p&gt;&#xA;&lt;h2 id=&#34;il-problema-docker-è-un-dittatore&#34;&gt;Il problema: Docker è un dittatore&lt;/h2&gt;&#xA;&lt;p&gt;Docker, per default, tratta le tue regole &lt;code&gt;iptables&lt;/code&gt; come se fossero semplici suggerimenti. Quando il demone si avvia, sostanzialmente sovrascrive la chain &lt;code&gt;FORWARD&lt;/code&gt;, inserisce la sua logica, e imposta policy che isolano efficacemente qualsiasi cosa non sia un container gestito da Docker stesso.&lt;/p&gt;&#xA;&lt;p&gt;Se hai un&amp;rsquo;interfaccia bridge per una VM (come &lt;code&gt;br0&lt;/code&gt; o &lt;code&gt;virbr0&lt;/code&gt;), le regole di Docker spesso finiscono per droppare i pacchetti destinati a quella VM perché non corrispondono alla sua logica interna per il traffico dei container.&lt;/p&gt;&#xA;&lt;h3 id=&#34;la-soluzione-ingenua-e-perché-fallisce&#34;&gt;La soluzione ingenua (e perché fallisce)&lt;/h3&gt;&#xA;&lt;p&gt;La mia prima reazione &amp;ndash; come qualsiasi sysadmin che fa questo lavoro dai primi anni 2000 &amp;ndash; è stata sistemare le regole a mano e poi eseguire:&lt;/p&gt;&#xA;&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;iptables-save &amp;gt; /etc/iptables/rules.v4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Questa è una trappola!&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExOHI5MzZoYzVwdGluYmNnMXBpYmJ2M2Y4cHB1OGVhaGlxdXRpZHpqOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3ornka9rAaKRA2Rkac/giphy.gif&#34; alt=&#34;Trap GIF&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Se usi &lt;code&gt;iptables-persistent&lt;/code&gt; (o &lt;code&gt;netfilter-persistent&lt;/code&gt;) con Docker, stai entrando in un mondo di dolore per due motivi:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sblocco remoto via SSH di ZFS cifrato su FreeBSD</title>
      <link>https://sindro.me/it/posts/2026-01-28-freebsd-encrypted-zfs-remote-unlock/</link>
      <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-01-28-freebsd-encrypted-zfs-remote-unlock/</guid>
      <description>&lt;h2 id=&#34;luks-remoto-pfft-ecco-come-sbloccare-via-ssh-una-root-zfs-cifrata-su-freebsd-nel-modo-difficile&#34;&gt;LUKS remoto? Pfft. Ecco come sbloccare via SSH una root ZFS cifrata su FreeBSD (nel modo difficile)&lt;/h2&gt;&#xA;&lt;p&gt;Se usi FreeBSD &lt;a href=&#34;https://sindro.me/posts/2023-08-13-freebsd-encrypted-root-on-zfs/&#34; target=&#34;_blank&#34;&gt;come me&lt;/a&gt;, su un server remoto con cifratura completa del disco (ZFS su GELI), conosci il panico del riavvio. Sei sempre alla mercé di un KVM-over-IP o di una connessione VNC dal browser, per inserire la password del filesystem root al prompt del kernel.&lt;/p&gt;&#xA;&lt;p&gt;Inoltre, se (come me) fai girare un sistema con &lt;code&gt;kern.securelevel&lt;/code&gt; &amp;gt; 0, allora installare una nuova libc significa riavviare in single user e installare gli aggiornamenti tramite la suddetta connessione KVM o VNC, che &lt;em&gt;non è ergonomica&lt;/em&gt; per usare un eufemismo.&lt;/p&gt;&#xA;&lt;p&gt;La soluzione standard è di solito un ambiente SSH pre-boot. Su Linux, dropbear-initramfs rende la cosa banale. Su FreeBSD? Devi costruirti un mfsroot (memory file system) custom da zero.&lt;/p&gt;&#xA;&lt;p&gt;La maggior parte delle guide suggerisce di usare un semplice shell script come init. Funziona, ma è misero. Perdi il job control (niente Ctrl+C), non hai un TTY decente, e in bocca al lupo se devi fare debug dei problemi di rete in modo interattivo.&lt;/p&gt;&#xA;&lt;p&gt;Non volevo un hack raffazzonato. Volevo un ambiente vero. Volevo &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;getty&lt;/code&gt;, &lt;code&gt;login&lt;/code&gt;, autenticazione PAM, e un chroot ZFS per la manutenzione &amp;ndash; per installare aggiornamenti.&lt;/p&gt;&#xA;&lt;p&gt;Ecco come ho costruito un unlocker remoto robusto per FreeBSD.&lt;/p&gt;&#xA;&lt;h2 id=&#34;il-problema-con-binsh-come-init&#34;&gt;Il problema con /bin/sh come Init&lt;/h2&gt;&#xA;&lt;p&gt;L&amp;rsquo;approccio ingenuo è compilare un ramdisk minuscolo, ficcarci dentro un binario sh statico, e dire al loader di eseguirlo come PID 1.&lt;/p&gt;&#xA;&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:#75715e&#34;&gt;# Questo crea incubi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat &amp;gt; /sbin/init &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;&amp;lt;EOF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;#!/bin/sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/sbin/dropbear&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;exec /bin/sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;EOF&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Perché fallisce?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Root cifrata con LUKS su Raspberry PI 5</title>
      <link>https://sindro.me/it/posts/2026-01-20-raspberry-pi-luks-encrypted-root/</link>
      <pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-01-20-raspberry-pi-luks-encrypted-root/</guid>
      <description>&lt;h2 id=&#34;premessa&#34;&gt;Premessa&lt;/h2&gt;&#xA;&lt;p&gt;Quindi ho cominciato a far girare &lt;a href=&#34;https://www.home-assistant.io/&#34; target=&#34;_blank&#34;&gt;Home Assistant&lt;/a&gt;&#xA;a casa su un Raspberry PI 5 e ho semplicemente installato HAOS su una SD. Poi ho&#xA;iniziato a sentirmi sempre più a disagio nel salvare credenziali nel filesystem&#xA;di HA in chiaro (qualsiasi offuscamento non è sufficiente).&lt;/p&gt;&#xA;&lt;p&gt;Considerando che configurare una root cifrata con HAOS è semplicemente&#xA;impossibile senza forkarlo, e considerando anche che dedicare un intero RPI5&#xA;a HAOS è uno spreco di risorse, ho deciso di aggiungere un SSD al Pi, avviarlo&#xA;con Raspbian e poi far girare HAOS dentro una VM.&lt;/p&gt;&#xA;&lt;p&gt;In questo modo, posso avere una root cifrata sull&amp;rsquo;host principale, cifrando&#xA;così l&amp;rsquo;intera VM HAOS.&lt;/p&gt;&#xA;&lt;p&gt;Inoltre posso ora fare snapshot dell&amp;rsquo;intera VM HAOS e ho molta più&#xA;flessibilità nella gestione. Ultimo ma non meno importante, posso anche usare&#xA;la CPU e la RAM rimanenti del RPI per qualcos&amp;rsquo;altro.&lt;/p&gt;&#xA;&lt;h2 id=&#34;ringraziamenti&#34;&gt;Ringraziamenti&lt;/h2&gt;&#xA;&lt;p&gt;Prima di tutto, un grande grazie a &lt;a href=&#34;https://rr-developer.github.io/LUKS-on-Raspberry-Pi/&#34; target=&#34;_blank&#34;&gt;questo&#xA;post&lt;/a&gt; che mi ha dato&#xA;le indicazioni iniziali su come fare il setup. Ma quel post del 2021 è ora&#xA;leggermente datato, e molti passaggi non sono più necessari.&lt;/p&gt;&#xA;&lt;p&gt;Secondo, un grande grazie a &lt;a href=&#34;https://github.com/ericfjosne&#34; target=&#34;_blank&#34;&gt;Eric Fjøsne&lt;/a&gt; per&#xA;&lt;a href=&#34;https://github.com/vjt/sindro.me/pull/1&#34; target=&#34;_blank&#34;&gt;aver usato questa guida e averla corretta&lt;/a&gt;&#xA;dato che l&amp;rsquo;avevo scritta perlopiù a posteriori :-).&lt;/p&gt;&#xA;&lt;h2 id=&#34;requisiti&#34;&gt;Requisiti&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Un RPI5 con Debian 13 (trixie) o successivo&lt;/li&gt;&#xA;&lt;li&gt;Una chiavetta USB decente e affidabile che può essere completamente cancellata&lt;/li&gt;&#xA;&lt;li&gt;Una tastiera e un monitor collegati direttamente al RPI&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;panoramica&#34;&gt;Panoramica&lt;/h2&gt;&#xA;&lt;p&gt;L&amp;rsquo;idea di fondo è:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Prepariamo un initrd che contiene i seguenti strumenti:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;resize2fs&lt;/code&gt; per ridurre e ingrandire filesystem &lt;code&gt;ext4&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;cryptsetup&lt;/code&gt; per gestire la cifratura delle partizioni&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Configuriamo il sistema per avviarsi da una root cifrata che non esiste ancora,&#xA;forzando così il sistema a cadere nell&amp;rsquo;initrd.&lt;/li&gt;&#xA;&lt;li&gt;Nell&amp;rsquo;initrd, riduciamo il filesystem root alla dimensione minima possibile&lt;/li&gt;&#xA;&lt;li&gt;Copiamo il filesystem root dalla partizione in chiaro sulla chiavetta USB&lt;/li&gt;&#xA;&lt;li&gt;Creiamo la partizione cifrata usando LUKS&lt;/li&gt;&#xA;&lt;li&gt;Copiamo il filesystem root dalla chiavetta USB sulla partizione cifrata&lt;/li&gt;&#xA;&lt;li&gt;Estendiamo il filesystem root alla dimensione massima&lt;/li&gt;&#xA;&lt;li&gt;Configuriamo SSH nell&amp;rsquo;initrd così da poterlo sbloccare anche dopo aver&#xA;piazzato il Raspberry Pi in un posto senza tastiera o schermo.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Pronti? Via!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Talk su MetalOS ad All Systems Go! 2025</title>
      <link>https://sindro.me/it/posts/2025-10-09-all-systems-go/</link>
      <pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2025-10-09-all-systems-go/</guid>
      <description>&lt;p&gt;Ho presentato un talk ad &lt;a href=&#34;https://all-systems-go.io/&#34; target=&#34;_blank&#34;&gt;All Systems Go 2025&lt;/a&gt;, la conferenza fondamentale sullo userspace Linux. La conferenza è organizzata principalmente dal team di systemd, ed è un punto d&amp;rsquo;incontro annuale per tutti quelli che lavorano su software di sistema Linux.&lt;/p&gt;&#xA;&lt;p&gt;Il tema di quest&amp;rsquo;anno è stato prevalentemente &amp;ldquo;container, container, container&amp;rdquo;, con molte nuove funzionalità in systemd per supportare la containerizzazione e anche esperienze pratiche da persone che lavorano sul campo su come usano systemd e software collaterali per costruire infrastrutture a container.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2025-10-09-all-systems-go/vjt-dubros-on-stage.jpg&#34; alt=&#34;Io e Serge sul palco&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ho presentato insieme al mio collega &lt;a href=&#34;https://www.linkedin.com/in/serge-dubrouski-2902638/&#34; target=&#34;_blank&#34;&gt;Serge Dubrouski&lt;/a&gt; il nostro lavoro nella costruzione di un sistema operativo alla scala di Meta. Gestiamo un sistema operativo basato su immagini, ma l&amp;rsquo;azienda viene da due decenni di aggiornamenti del SO online, quindi abbiamo dovuto progettare una strategia di migrazione adeguata e gettare le fondamenta per il futuro.&lt;/p&gt;&#xA;&lt;p&gt;Descriviamo come prepariamo le release CentOS dall&amp;rsquo;upstream, gli &lt;a href=&#34;https://github.com/facebookincubator/antlir&#34; target=&#34;_blank&#34;&gt;strumenti OSS&lt;/a&gt; che abbiamo costruito per creare le immagini del SO, e la tecnologia interna (MetalOS) che abbiamo ideato per costruire un SO che gira su milioni di server Linux.&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/PpDDdLMiPCs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;p&gt;Puoi anche &lt;a href=&#34;https://sindro.me/posts/2025-10-09-all-systems-go/asg2025-332-eng-OS_as_a_Service_at_Meta_Platforms_hd.mp4&#34;&gt;scaricare il video per la visione offline&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Domande? Commenti? Sfogate qui sotto! 🤣&lt;/p&gt;</description>
    </item>
    <item>
      <title>pfasciilogd: collegare pf e fail2ban</title>
      <link>https://sindro.me/it/posts/2023-08-17-pfasciilogd-link-pf-and-fail2ban/</link>
      <pubDate>Thu, 17 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2023-08-17-pfasciilogd-link-pf-and-fail2ban/</guid>
      <description>&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;&#xA;&lt;p&gt;FreeBSD: come bloccare i port scanner dall&amp;rsquo;enumerare le porte aperte sul&#xA;tuo server, usando fail2ban e una rappresentazione ASCII dei log di &lt;code&gt;pf&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;premessa&#34;&gt;Premessa&lt;/h2&gt;&#xA;&lt;p&gt;Uso &lt;a href=&#34;https://fail2ban.org/&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;fail2ban&lt;/code&gt;&lt;/a&gt; per tenere alla larga attaccanti e bot&#xA;che tentano di scansionare i miei siti web o di forzare le mie caselle di posta.&#xA;Fail2ban funziona scansionando i file di log alla ricerca di pattern specifici e&#xA;mantenendo un conteggio delle corrispondenze per IP, e permette&#xA;all&amp;rsquo;amministratore di sistema di definire cosa fare quando quel conteggio supera&#xA;una soglia definita.&lt;/p&gt;&#xA;&lt;p&gt;I pattern sono indicativi di attività malevola, come il tentativo di indovinare&#xA;la password di una casella di posta, o il tentativo di scansionare lo spazio di&#xA;un sito web alla ricerca di vulnerabilità.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;azione da eseguire nella maggior parte dei casi è bloccare l&amp;rsquo;indirizzo IP&#xA;incriminato tramite il firewall della macchina, ma fail2ban supporta qualsiasi&#xA;meccanismo che tu possa concepire, purché possa essere attuato da un comando&#xA;UNIX.&lt;/p&gt;&#xA;&lt;h2 id=&#34;pf-e-i-suoi-log&#34;&gt;PF e i suoi log&lt;/h2&gt;&#xA;&lt;p&gt;Sul mio server FreeBSD uso l&amp;rsquo;eccellente &lt;a href=&#34;https://docs.freebsd.org/en/books/handbook/firewalls/#firewalls-pf&#34; target=&#34;_blank&#34;&gt;pf&lt;/a&gt;,&#xA;il packet filter, per gestire il traffico in entrata e per eseguire la&#xA;normalizzazione del traffico.&lt;/p&gt;&#xA;&lt;p&gt;Il meccanismo di logging di PF è molto UNIX-iano: fornisce un&amp;rsquo;interfaccia di&#xA;rete virtuale (&lt;code&gt;pflog0&lt;/code&gt;) sulla quale vengono inoltrati i primi byte dei&#xA;pacchetti bloccati da una regola con lo specificatore &lt;code&gt;log&lt;/code&gt;, così che i log&#xA;dei blocchi in tempo reale possano essere ispezionati con un semplice:&lt;/p&gt;&#xA;&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:#75715e&#34;&gt;# tcpdump -eni pflog0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcpdump: verbose output suppressed, use -v or -vv &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; full protocol decode&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;listening on pflog0, link-type PFLOG &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;OpenBSD pflog file&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, capture size &lt;span style=&#34;color:#ae81ff&#34;&gt;262144&lt;/span&gt; bytes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:48:13.748353 rule 1/0&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;match&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: block in on vtnet0: 121.224.77.46.41854 &amp;gt; 46.38.233.77.6379: Flags &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;S&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, seq 1929621329, win 29200, options &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;mss 1460,sackOK,TS val &lt;span style=&#34;color:#ae81ff&#34;&gt;840989709&lt;/span&gt; ecr 0,nop,wscale 7&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, length &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:48:15.726215 rule 1/0&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;match&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: block in on vtnet0: 192.241.235.20.37422 &amp;gt; 46.38.233.77.5632: UDP, length &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:48:17.993439 rule 1/0&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;match&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: block in on vtnet0: 145.239.244.34.54154 &amp;gt; 46.38.233.77.1024: Flags &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;S&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, seq 3365362952, win 1024, length &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;^C&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; packets captured&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; packets received by filter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; packets dropped by kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Questi log possono essere salvati da &lt;code&gt;pflogd&lt;/code&gt; in un file formato &lt;code&gt;pcap&lt;/code&gt; in&#xA;&lt;code&gt;/var/log/pflog&lt;/code&gt;, che può essere usato per troubleshooting e ispezione&#xA;asincrona, sempre con &lt;code&gt;tcpdump&lt;/code&gt; o qualsiasi cosa che sappia leggere file&#xA;&lt;code&gt;pcap&lt;/code&gt; (come Wireshark).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Root cifrata su ZFS con FreeBSD</title>
      <link>https://sindro.me/it/posts/2023-08-13-freebsd-encrypted-root-on-zfs/</link>
      <pubDate>Sun, 13 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2023-08-13-freebsd-encrypted-root-on-zfs/</guid>
      <description>&lt;h2 id=&#34;premessa&#34;&gt;Premessa&lt;/h2&gt;&#xA;&lt;p&gt;Nel 2023, gestisco ancora il mio mailserver. Sì, perché mi piace avere il&#xA;controllo (almeno in parte) della mia vita digitale, e mi piace avere&#xA;diversi nomi di dominio su cui tenere le mie cose. Tuttavia, stavo pagando&#xA;30€/mese ad AWS per avere in cambio 2 core, 2GiB di RAM e 40G di disco,&#xA;appena sufficienti per far girare IMAP+SMTP+MySQL+Clamd, figurarsi qualsiasi&#xA;forma di protezione antispam o ricerca full-text nel corpo delle email.&lt;/p&gt;&#xA;&lt;p&gt;Insomma, stavo pagando un botto di soldi per far girare un servizio merdoso,&#xA;e avevo persino pensato di chiudere tutto e spostare la posta e i siti web&#xA;su qualche servizio completamente managed.&lt;/p&gt;&#xA;&lt;h2 id=&#34;però-voglio-ancora-farlo&#34;&gt;Però voglio ancora farlo&lt;/h2&gt;&#xA;&lt;p&gt;Beh, per ospitare quattro domini con solo qualche redirect email più i siti&#xA;web che gestisco, avrei speso di più di quanto stavo già pagando,&#xA;incatenandomi per di più a qualche fornitore di servizi e alle sue politiche.&lt;/p&gt;&#xA;&lt;p&gt;Quindi, volevo usare FreeBSD e ho cominciato a cercare nella &lt;a href=&#34;https://www.freebsd.org/commercial/isp/&#34; target=&#34;_blank&#34;&gt;pagina degli&#xA;ISP&lt;/a&gt; fino a decidere di valutare&#xA;&lt;a href=&#34;https://www.hetzner.com/cloud&#34; target=&#34;_blank&#34;&gt;Hetzner&lt;/a&gt; e&#xA;&lt;a href=&#34;https://www.netcup.eu/vserver/vps.php&#34; target=&#34;_blank&#34;&gt;netcup&lt;/a&gt;, che offrono entrambi&#xA;prezzi aggressivi e un buon vecchio VPS senza fronzoli.&lt;/p&gt;&#xA;&lt;h2 id=&#34;scelta-del-provider&#34;&gt;Scelta del provider&lt;/h2&gt;&#xA;&lt;p&gt;Alla fine, ho scelto un netcup VPS 1000 che mi dà, a 1/3 del prezzo&#xA;che pagavo ad AWS, 4 volte le risorse: 6 core, 8GiB di RAM, 160GiB di&#xA;SSD RAID10 e un&amp;rsquo;installazione FreeBSD completamente libera e senza&#xA;limitazioni.&lt;/p&gt;&#xA;&lt;p&gt;Tuttavia, l&amp;rsquo;immagine base fornita da Netcup ha alcune limitazioni:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Gira su UFS&lt;/li&gt;&#xA;&lt;li&gt;Non ha una partizione di swap&lt;/li&gt;&#xA;&lt;li&gt;Non ha cifratura&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;fare-un-piano&#34;&gt;Fare un piano&lt;/h2&gt;&#xA;&lt;p&gt;Dato che ero già in fase di configurazione e non volevo ricominciare da zero&#xA;(questo è un server vecchio stile, gestito a mano, zero automazione) ho&#xA;deciso di:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
