Costruire il tuo Router con un Raspberry Pi

Quando si cerca di capire perché internet è lenta, può essere difficile sapere esattamente quale dispositivo sulla rete si sta mangiando tutta la larghezza di banda. Molte soluzioni a questo problema richiedono software da installare su ogni dispositivo da monitorare. Invece, ho provato a costruire un monitor di rete Raspberry Pi personalizzato.

Costruire il proprio Router

Un Raspberry Pi 4 è un router abbastanza capace nelle giuste circostanze.

Ma prima, cerchiamo di essere chiari sui termini.

Un commutatore mescola i dati intorno alla rete. Un router aiuta a dirigere quel traffico.

Costruire un “router”, in questo contesto, significa che implementeremo DHCP, DNS e un firewall.

Se non sai cosa significhi, non preoccuparti. Per ora, diamo solo per scontato che si dispone di un Raspberry Pi 4 (vedi elenco delle parti in basso). Il bit “versione 4″è importante perché ha una scheda di rete significativamente migliore (eth0) rispetto ai modelli precedenti (Gigabit). Ciò indica la più grande limitazione dell’utilizzo dell’RPi come router: la larghezza di banda è limitata a 1000 Mbps.

La larghezza di banda e il throughput sono spesso confusi.

La “larghezza” della banda è la quantità massima di dati che possono fluire attraverso il sistema (in questo caso, dalla casa a Internet). Il throughput misura la quantità di larghezza di banda utilizzata in qualsiasi momento.

Per inciso, questa guida dovrebbe funzionare per qualsiasi sistema linux basato su Debian che si desidera trasformare in un router. È possibile utilizzare un hardware migliore per creare una soluzione ancora più efficace. Ho scelto un Pi4 perché la nostra velocità di Internet è comunque solo 30Mbps (DSL). Come ho descritto nel post di monitoraggio della rete, questo Raspberry Pi 4 ha dimostrato di essere molto più che sufficiente per questo caso. I seguenti sono i prodotti esatti che ho usato.

Se siete nuovi a Raspberry Pi, i CanaKits popolari sono un ottimo punto di partenza. Io preferisco acquistare il Raspberry Pi 4, adattatore di alimentazione, schede micro SD, e dissipatori separatamente. Non solo è più economico, ma riduce i rifiuti elettronici.

I seguenti sono link di affiliazione ad altre parti che ho usato in questo progetto. Non ho mai link a un prodotto che non ho personalmente utilizzato.

Hai una connessione DSL / PPP?

Leggi le peculiarità specifiche dell’utilizzo di un Raspberry Pi come router DSL.

È necessaria una seconda porta ethernet (vedere la sezione successiva). Ho usato il connettore USB 3.0 Gigabit, sopra.

Connessione a Internet

Farò riferimento alle interfacce di rete comewanelan.

Se si desidera che le cose siano copia e incolla, è possibile rinominare le interfacce di rete in modo che corrispondano. Ad esempio, lan è il nome per la più veloce delle due interfacce (l’interfaccia di rete integrata, eth0, nel mio caso). Per creare il nome statico, prima digitare ifconfigottenere l’indirizzo MAC per l’interfaccia (dopoether). Se hai trovatoether aa:bb:cc:dd:ee:ff, quindi creare o modificare/etc/udev/rules.d/10-network.rules per includere:

SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="lan"

… e quindi ripetere il processo per l’interfacciawan.

La rete interna (LAN) deve gestire un throughput maggiore rispetto alla WAN.

Questo è il motivo per cui viene scelta l’interfaccia più veloce per la LAN.

A questo punto, è possibile collegare direttamente l’interfaccia wan al modem fornito dal proprio ISP. Si consiglia di mettere il modem in modalità bridge trasparente, se possibile, dal momento che il Pi sta assumendo la funzionalità di routing (più su questo).

Mentre sei qui, prenditi un momento per assicurarti che la WAN sia configurata correttamente per ottenere un lease DHCP. Se si utilizza un metodo diverso dal DHCP standard (ad esempio, PPOE), sarà necessario modificare questo passaggio in base alle proprie esigenze. Ma nella maggior parte dei casi, è sufficiente creare un file in /etc/network/interfaces.d/wan con i seguenti contenuti:

auto wanallow-hotplug waniface wan inet dhcp

Server DHCP

Con il Pi online, è il momento di consentire ai dispositivi di connettersi al Pi.

In questo esempio, il router Raspberry Pi avrà un indirizzo IP di 192.168.0.1.

Fai attenzione se cambi questo IP!

Questo esempio utilizza la sottorete 192.168.0.0/24. Se si decide di modificare questo, assicurarsi di scegliere tra l’intervallo di subnet private valide.

Questo significa prima creare o modificare /etc/network/interfaces.d/lan:

allow-hotplug laniface lan inet static address 192.168.0.1 netmask 255.255.255.0 gateway 192.168.0.1

Ora l’interfaccia LAN avrà un IP statico e si tratterà come il router. Ora è il momento di renderlo in grado di assegnare indirizzi IP ad altri dispositivi sulla rete. L’esecuzione di un server DHCP renderà quindi così tanti computer in grado di connettersi al Pi.

in Primo luogo, disattivare dhcpcd e installare isc-dhcp-server:

sudo systemctl disable dhcpcdsudo apt install isc-dhcp-server

modifica /etc/default/isc-dhcp-server sostituzione INTERFACESv4:

INTERFACESv4="lan"

Abbiamo detto che il server DHCP che interfaccia contiene la LAN. Ora ha bisogno di conoscere i parametri per la rete domestica. Per continuare con l’esempio, lasceremo che il server assegni gli indirizzi IP nell’intervallo da 192.168.0.100a192.168.0.199 (più sul perché in un momento). Modifica /etc/dhcp/dhcpd.conf per modificare prima il nome di dominio e i server dei nomi di dominio:

option domain-name "router.local";option domain-name-servers 8.8.8.8, 1.1.1.1;

Il suffisso.localè una convenzione per una LAN, ma puoi sostituire il nomerouter. I server dei nomi di dominio saranno cambiati presto, ma sono puntati a Google per ora.

Aggiungi anche aggiungi quanto segue:

authoritative;subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.100 192.168.0.199; option routers 192.168.0.1; option subnet-mask 255.255.255.0;}

Questo indica al server DHCP che può assegnare indirizzi IP ai dispositivi che si connettono ad esso entro l’intervallo specificato. Il motivo per l’intervallo relativamente piccolo è che possiamo assegnare indirizzi IP statici al di fuori di tale intervallo. Ad esempio, potresti prendere lo stesso indirizzo MAC per lan sopra e aggiungere la seguente sezione:

host router { hardware ethernet aa:bb:cc:dd:ee:ff; fixed-address 192.168.0.1;}

Aggiungendo anche l’IP statico per il router, significa che il server DHCP non può mai confondersi e assegnare accidentalmente un indirizzo IP diverso. In generale, la codifica degli indirizzi IP nel server DHCP centralizza anche l’autorità (piuttosto che codificare IP statici su dispositivi specifici, che è molto più fragile IME).

Se si riavvia il Raspberry Pi ora e si collega un computer alla porta lan, è necessario trovare un indirizzo IP nell’intervallo appropriato. Utilizzando Mac OSX, ho aperto il pannello delle preferenze di rete e quindi la scheda Hardware per trovare l’indirizzo MAC dell’adattatore da USB-C a Ethernet del mio laptop. Quindi ho assegnato un IP statico (proprio come sopra) a quell’indirizzo e riavviato il server DHCP:

sudo systemctl restart isc-dhcp-server
connettersi a raspberry pi router
L’indirizzo MAC è venuto dalla scheda hardware. Premendo il pulsante” Renew DHCP Lease ” si chiederà al server DHCP un nuovo indirizzo IP, aggiornando efficacemente la connessione.

Anche se l’indirizzo fisso è al di fuori dell’intervallo sopra, questo tipo di assegnazione IP statica funzionerà con qualsiasi dispositivo. Mi piace dare IP statici a tutti i miei dispositivi noti e affidabili che sono al di fuori dell’intervallo pubblico. Questo fa quanto segue:

  • Aiuta a identificare i dispositivi noti.
  • Consente di applicare regole di sicurezza per IP noti.
  • Abilita i server (cioè la lettura della temperatura tramite un sensore Arduino economico).

Se per qualche motivo un computer non può mai connettersi alla rete domestica, l’esecuzione del proprio server DHCP rende le cose più facili da eseguire il debug. L’esecuzione di journalctl -xe | grep dhcpd mostra qualsiasi tentativo da parte dei dispositivi di connettersi alla rete domestica:

May 03 15:50:44 router dhcpd: DHCPREQUEST for 192.168.0.106 from xx:xx:xx:xx:xx via eth0May 03 15:50:44 router dhcpd: DHCPACK on 192.168.0.106 to xx:xx:xx:xx:xx via eth0

E dando un’occhiata a /var/lib/dhcp/dhcpd.leases rivela quali dispositivi si sono collegati ultimamente.

Collegamento di dispositivi WiFi

Per questo, è necessario un router WiFi o un punto di accesso.

L’approccio tipico è quello di utilizzare il WiFi a bordo. Questo corrisponde principalmente ai passaggi precedenti, ad eccezione dell’utilizzo del dispositivowlan0 sul Raspberry Pi per l’interfaccialan e dell’impostazione di hostapd. Tuttavia, questo non è raccomandato nel contesto di questo post. Lasciare che il Raspberry Pi funga da pass-through tra due interfacce Ethernet è un approccio più semplice e veloce.

Invece, è sufficiente collegare un router WiFi per illan porta sul Raspberry Pi e poi mettere il router in punto di accesso (aka bridge) modalità. Ora, al router non importa se i client si connettono tramite Ethernet o WiFi.

Sono un grande fan dei router Orbi — non solo sono estremamente veloci, ma puoi collegare la porta “Internet” della stazione base al Raspberry Pi e avere una dozzina di connessioni cablate a tua disposizione in casa:

Inoltro del traffico

A questo punto

  • Il Raspberry Pi può parlare con Internet (WAN).
  • I dispositivi sulla LAN possono parlare tra loro.

but ma non c’è comunicazione tra i due.

Inseriscifirewalld:

sudo apt install firewalld

Firewalld è la soluzione più semplice che ho trovato finora.

Tabelle IP e firewall possono essere un dolore.

Come minimo, avrai bisogno di una casa e di una zona pubblica, quindi di mascherare il traffico tra i due. Questo dice solo al firewall che l’interfaccia lan è per la casa e le interfacce wan/ppp0 sono per il pubblico.

sudo firewall-cmd --zone=home --add-interface=lansudo firewall-cmd --zone=public --add-interface=ppp0sudo firewall-cmd --zone=public --add-interface=wansudo firewall-cmd --zone=public --add-masqueradesudo firewall-cmd --zone=home --add-service=dnssudo firewall-cmd --zone=home --add-service=dhcp

A questo punto, i computer connessi alla LAN dovrebbero essere in grado di accedere a Internet. Potresti semplicemente eseguiresudo firewall-cmd --runtime-to-permanent ora per salvare tutto, ma potrebbero esserci alcuni passaggi più utili (sotto). Se in qualsiasi momento il traffico Internet (o altro) non funziona dall’interno della rete, eseguire journalctl -xe e cercare linee come questa:

FINAL_REJECT: IN=ppp0 OUT= MAC= SRC=77.247.109.40 DST=...

In questo caso, la regola funziona come previsto. Qualcuno da un indirizzo IP sconosciuto ha tentato di contattare la mia rete domestica tramite l’interfacciappp0 (ad es., da internet). In altri casi, potrebbe essere necessario aprire il firewall per consentire un determinato traffico.

Firewalld è più semplice quando si utilizzano regole basate sulla zona. Avrai bisogno di almeno due zone, che ho chiamato home e public invece di lan e wan (per abbinare le convenzioni di firewalld). Ho anche una terza zona (opzionale) attendibile nella mia configurazione per la sottorete kubernetes/docker. Quindi, quando digito firewall-cmd --get-active-zones, vedo:

home interfaces: lan lopublic interfaces: wan ppp0trusted interfaces: docker0 cni0 sources: 10.244.0.0/24 10.202.0.0/24 10.96.0.0/24

Le definizioni per le zone sono contenute in file xml situati in /etc/firewalld/zones/:

<?xml version="1.0" encoding="utf-8"?><zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <interface name="wan"/> <interface name="ppp0"/> <service name="ssh"/> <service name="http"/> <service name="https"/> <masquerade/></zone>
<?xml version="1.0" encoding="utf-8"?><zone target="ACCEPT"> <short>Home</short> <description>For use in home areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <interface name="lan"/> <interface name="lo"/> <service name="ssh"/> <service name="mdns"/> <service name="samba-client"/> <service name="dhcpv6-client"/> <service name="dhcp"/> <service name="dns"/> <service name="http"/> <service name="https"/> <port port="5000" protocol="tcp"/> <port port="3000" protocol="tcp"/> <port port="9999" protocol="tcp"/> <port port="10250" protocol="tcp"/> <port port="10250" protocol="udp"/></zone>
<?xml version="1.0" encoding="utf-8"?><zone target="ACCEPT"> <short>Trusted</short> <description>All network connections are accepted.</description> <interface name="docker0"/> <interface name="cni0"/> <source address="10.244.0.0/24"/> <source address="10.202.0.0/24"/> <source address="10.96.0.0/24"/> <service name="dns"/> <service name="dhcp"/> <service name="dhcpv6-client"/> <service name="https"/> <service name="http"/></zone>

il Traffico è suddivisa in zone basate su interfaccia o di origine, come ad esempio:

  • sudo firewall-cmd --zone=public --add-interface=ppp0
  • sudo firewall-cmd --zone=trusted --add-source=10.202.0.0/24

E una zona può ricevere il traffico a un servizio o una porta:

  • sudo firewall-cmd --zone=public --add-service=http
  • sudo firewall-cmd --zone=home --add-port=10250/tcp

si noti che queste modifiche sono temporanee. Ciò consente test sicuri. Per renderli permanenti, eseguire sudo firewall-cmd --runtime-to-permanent. Se non c’è un Se hai bisogno di più aiuto con firewalld, dai un’occhiata a questo articolo.

Server DNS & Riscrive

Un server DNS può rendere questo piccolo router ancora migliore.

Il compito del server DNS è quello di rispondere con un indirizzo IP per un determinato nome di dominio. Ad esempio, sa a quale indirizzo IP dovrebbe connettersi il computer per raggiungere google.com. Molte persone amano eseguire il proprio per motivi di sicurezza e privacy.

Ci sono ad-blockers là fuori, per esempio, che funzionano come server DNS. Installando Pi Hole o AdGuard Home, è possibile impedire ai computer della rete di essere in grado di individuare domini pubblicitari/spam/malware. Entrambi questi due strumenti supportano anche riscritture DNS, in modo da poter modificare la “posizione” di qualsiasi sito.

una Volta installato uno dei due, basta modificare /etc/dhcp/dhcpd.confoption domain-name-servers 192.168.0.1;

Ora, tutti i dispositivi che si connettono alla rete sarà detto di utilizzare i server DNS.

Perché le riscritture sono così utili? Controlla il seguente post sulla costruzione di un server di casa. Le riscritture consentono di utilizzare lo stesso URL internamente ed esternamente, abilitando HTTPS anywhere. Ad esempio, utilizzando AdGuard Home per riscrivere *.snowy-cabin.com a 192.168.0.100, qualsiasi traffico che ha origine all’interno della rete domestica a house.snowy-cabin.com non uscirà mai dalla rete domestica. Ciò significa che lo stesso URLhttps:// può essere utilizzato per raggiungere il reverse-proxy, dove avviene la terminazione SSL, garantendo una comunicazione sicura sia per il traffico pubblico che privato.

id post non trovato: # 8977

Cheat-sheet

Per ricapitolare, ecco alcuni concetti chiave per i server domestici:

  • IP statici: modifica/etc/dhcp/dhcpd.conf per aggiungere un nuovo host, quindi riavviaisc-dhcp-server e rinnova il lease sul client.
  • Port forwarding: eseguisudo firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toaddr=192.168.0.100
  • Nomi di dominio personalizzati: usa il server DNS per far funzionare il tuo nome di dominio univoco internamente ed esternamente.
  • Monitoraggio del traffico di rete: istruzioni.

Dalla sicurezza alla velocità, ci sono molte ragioni per capire la connessione di rete domestica. Imparare le basi di rete, così come costruire il proprio router per accelerare Internet a casa.

Tagged asDIY Projects, Raspberry Pi Projects
Scritto da

(zane) / Tecnicamente Wizardry

Questo sito è iniziato come un luogo per documentare progetti fai da te. È cresciuto in una raccolta di progetti IOT, tutorial tecnici e guide pratiche. Per saperne di più su questo sito…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.