👻 Void in taverna
Ho una taverna e ho un problema: in questa taverna non arriva il segnale Wi-Fi. Ho anche un pezzo di spazzatura elettronica che si rifiuta di morire: un netbook Samsung N130 del 2009. Ha un processore Atom single-core e 1 GB di RAM. Per gli standard moderni, riesce a malapena ad aprire un browser web. Ma per un terminale Linux, è un supercomputer. Invece di acquistare un generico ripetitore Wi-Fi da una decina di euro, ho deciso di trasformare questo piccolo guerriero in un router Wi-Fi completamente programmabile, sicuro e trasparente utilizzando Void Linux. Ecco esattamente come ho fatto.

💻 La configurazione hardware
- Samsung N130 (scheda Wi-Fi interna: Atheros/Realtek a seconda del modello).
- Una chiavetta Wi-Fi USB economica (Realtek RTL8188EUS) che accumulava polvere in un cassetto.
- Void Linux (versione base, glibc).
Il piano è semplice:
- La chiavetta USB si connette alla rete Wi-Fi principale di casa al piano superiore.
- La scheda interna trasmette una nuova rete al piano inferiore.
- Il netbook instrada il traffico tra le due reti.
🐧 0: Installazione di Void Linux
Nulla di troppo complicato: basta creare una chiavetta USB dall’immagine ISO, avviarla e seguire l’eccellente documentazione. Preferisco installare anche alcuni strumenti standard di uso quotidiano come zsh, fzf, ripgrep, starship, zoxide, fdfind e alcuni pacchetti extra di cui avremo bisogno in seguito: wpa_supplicant, dnsmasq, hostapd, cronie, nftables, ttyqr.
Perché proprio Void Linux? Beh, è disponibile per architetture a 32 bit, è costantemente aggiornata ed è estremamente parca nei consumi di risorse. Offre un’esperienza d’uso Linux vecchio stile, lineare e semplice.
🛜 1: Scelta della scheda (Modalità AP)
Non tutte le schede Wi-Fi sono uguali. Per funzionare come hotspot, una scheda deve supportare la modalità AP (Access Point).
Ho installato iw e controllato entrambe le schede:
iw list
Ho cercato l’elenco Supported interface modes nell’output.
Se contiene la voce AP, siamo a posto.
Se riporta solo managed, quella scheda può funzionare solo come client (da usare per il Gateway).
Nel mio caso, la scheda interna supportava perfettamente la modalità AP, quindi è diventata l’Access Point, mentre la chiavetta USB è diventata il Gateway.
😵 2: Rinominare le interfacce (Udev Rules)
I nomi delle interfacce Linux come wlp2s0 o wlp0s29f7u1… sono impossibili da ricordare. Rinominiamoli in wlan_ap (interna) e wlan_gw (esterna/USB) così da non fare mai confusione.
Ho creato il file /etc/udev/rules.d/10-network.rules:
# Internal Card -> wlan_ap
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:11:22:33:44:55", NAME="wlan_ap"
# USB Dongle -> wlan_gw
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="wlan_gw"
(Suggerimento: ottieni i tuoi indirizzi MAC usando il comando ip link).
Dopo il riavvio, il comando ip link ha mostrato i miei nuovi e ordinati nomi.
Se preferisci evitare il riavvio, puoi attivare le regole udev con:
udevadm trigger --verbose --subsystem-match=net --action=add
🔌 3: Connessione a monte (Il Client)
Ho usato wpa_supplicant per connettere la chiavetta USB alla rete Wi-Fi principale di casa.
File: /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/run/wpa_supplicant
update_config=1
network={
ssid="MyUpstairsWiFi"
psk="SuperSecretHomePassword"
}
Il parametro psk è una lunga stringa esadecimale, che puoi ottenere con:
wpa_passphrase "IL_TUO_SSID" "LA_TUA_PASSWORD" | sudo tee /etc/wpa_supplicant/wpa_supplicant.conf
Successivamente, ho configurato il servizio. Poiché su Void utilizzo runit, ho configurato il file di esecuzione del servizio per forzarlo a utilizzare wlan_gw:
cat /var/service/wpa_supplicant/conf
WPA_INTERFACE=wlan_gw
Su Void, per abilitare un servizio e farlo eseguire all’avvio da runit, è sufficiente creare un collegamento simbolico (symlink):
ln -s /etc/sv/wpa_supplicant /var/service/
🔥 4: L’Hotspot (hostapd)
Ora passiamo alla trasmissione della rete per gli ospiti. Ho installato hostapd e l’ho configurato per trasformare la scheda interna in un hotspot.
File: /etc/hostapd/hostapd.conf
interface=wlan_ap
driver=nl80211
ssid=Basement_Bunker
hw_mode=g
channel=6
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=3
wpa_passphrase=BasementPassword123
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
ieee80211n=1
Ho abilitato anche questo servizio (ln -s /etc/sv/hostapd /var/service/). E subito la rete è apparsa sul mio telefono! Ma connettersi ad essa non portava ancora a nulla.
📟 5: Il cervello (IP e DHCP)
Dobbiamo assegnare un IP statico sia all’Access Point che al Gateway.
File: /etc/dhcpcd.conf
# Gateway act as a plain wifi client device
interface wlan_gw
static ip_address=192.168.1.99/24
static routers=192.168.1.1 # main home router with internet connection
# Access Point: Static IP (I am the Captain now)
interface wlan_ap
static ip_address=192.168.50.1/24
In seguito, dnsmasq gestisce sia l’assegnazione degli IP ai dispositivi che si connettono alla rete in taverna, sia la risoluzione dei nomi con relativa cache.
File: /etc/dnsmasq.conf
# Listen only on the local interface (AP)
interface=wlan_ap
interface=lo
bind-interfaces
cache-size=1000
domain-needed
bogus-priv
dhcp-range=192.168.50.100,192.168.50.200,255.255.255.0,12h
server=192.168.1.1
server=8.8.8.8
# Set the default gateway and DNS for clients
dhcp-option=3,192.168.50.1
dhcp-option=6,192.168.50.1
🪠 6: I collegamenti (Routing e NAT)
Il kernel deve essere autorizzato a far transitare i pacchetti da un’interfaccia all’altra.
File: /etc/sysctl.d/99-forwarding.conf
net.ipv4.ip_forward=1
Infine, nftables si occupa del lavoro più pesante: NAT (masquerading), regole di firewall e l’importante correzione MSS Clamping (senza la quale i telefoni Android si connettono ma non riescono a caricare i siti web). Ho preferito questo strumento rispetto al classico iptables per mettermi alla prova con qualcosa di più moderno.
File: /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table ip nat {
chain postrouting {
type nat hook postrouting priority 100; policy accept;
# Masquerade traffic leaving the USB dongle
oifname "wlan_gw" masquerade
}
}
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
iifname "lo" accept
ct state established,related accept
ip protocol icmp accept
# Allow DHCP & DNS from the basement
iifname "wlan_ap" udp dport { 67, 53 } accept
iifname "wlan_ap" tcp dport 53 accept
# SECURITY: Block SSH from the basement!
# Only allow SSH from the main house network (Gateway)
# Assuming main house is 192.168.1.x
iifname "wlan_gw" ip saddr 192.168.1.0/24 tcp dport 22 accept
}
chain forward {
type filter hook forward priority 0; policy drop;
# TCP MSS Clamping: The magic fix for WiFi-to-WiFi bridging
tcp flags syn tcp option maxseg size set rt mtu
# Allow traffic flow
iifname "wlan_ap" oifname "wlan_gw" accept
iifname "wlan_gw" oifname "wlan_ap" ct state established,related accept
}
chain output { type filter hook output priority 0; policy accept; }
}
🤳 7: Un tocco “User Friendly” (Accesso tramite QR Code)
Dato che questo netbook sta appoggiato su uno scaffale, volevo che lo schermo mostrasse qualcosa di utile. Al posto del solito e noioso prompt di login, gli faccio visualizzare un QR code in modo che gli ospiti possano scansionarlo per connettersi (scan-to-connect).
Ho installato ttyqr e ho aggiunto questo frammento al file /etc/rc.local:
# Clear screen
echo -e "\033c" > /etc/issue
# Generate QR Code for WiFi
# Format: WIFI:T:WPA;S:MySSID;P:MyPassword;;
ttyqr -t ANSIUTF8 "WIFI:T:WPA;S:Basement_Bunker;P:BasementPassword123;;" >> /etc/issue
# Add text
echo -e "\nScan to join the Bunker!" >> /etc/issue
echo -e "IP: 192.168.50.1" >> /etc/issue
Ora la schermata di login TTY ha l’aspetto di un chiosco interattivo!

(non scansionare questo: la rete e la password mostrate qui non sono reali)
👾 Cos’altro si può fare con 1 GB di RAM? 🔊
Poiché la parte router consuma pochissime risorse (meno di 100 MB di RAM), ho deciso di affidare all’N130 qualche altro compito.
- Jukebox (mpd + ncmpcpp)
Ho installato mpd (Music Player Daemon) e ho collegato il netbook a un vecchio altoparlante tramite il jack delle cuffie. In questo modo può riprodurre file musicali locali (disponendo di oltre 100 GB di spazio di archiviazione) e flussi radio internet senza problemi.
Posso controllare il volume e le stazioni radio via SSH o tramite un’applicazione sul telefono, oppure usare l’analizzatore di spettro in ncmpcpp direttamente sullo schermo del netbook.
- Stazione per Retro Gaming
Quando internet va via, posso comunque passare il tempo. Solo qualche esempio:
Bastet: un clone spietato di Tetris.
Ninvaders: Space Invaders nel terminale.
Moon-buggy: un gioco di guida a scorrimento orizzontale.
Pacman4Console: Waka Waka
Tutti questi giochi girano alla perfezione in modalità testo (TTY), richiedendo zero interfaccia grafica (niente Wayland né X11), risparmiando così preziosa memoria RAM per il routing.
📜 Verdetto finale
Il mio vecchio N130 è tornato in vita. Si avvia in pochi secondi, gestisce il traffico per l’intera taverna, blocca i tentativi SSH non autorizzati, si aggiorna automaticamente e aiuta persino gli ospiti a connettersi con un QR code. Non male per un portatile che già 10 anni fa era considerato “too slow”.
In conclusione… Sì, avrei potuto semplicemente acquistare un ripetitore Wi-Fi invece di passare due ore a configurare un vecchio PC, ma nel frattempo ho imparato molto e salvato dell’hardware dalla discarica. Buon hacking!