Navigate back to the homepage

Raspberry Pi ako domáci router

Najnovšia generácia Raspberry Pi je už dostatočne výkonná, aby nám poslúžila ako slušný domáci router. Čo ma viedlo k rozhodnutiu použiť ho a aké sú moje skúsenosti?
Vladimír Záhradník
April 17th, 2020 · 9 min read

Nedávno som nahradil môj domáci router za Raspberry Pi 4. Mojím hlavným cieľom bolo zvýšiť priepustnosť na mojej VPN. A keď už som to robil, tiež som zmigroval z OpenVPN na WireGuard a prečítal si celý technický dokument. Tento príspevok zhŕňa dokopy moje poznatky z toho, ako som zmenil účel môjho Raspberry Pi na sieťové zariadenie.


Prečo je dobré mať domáci router v prvom rade?

Keď podpíšete zmluvu s vašim poskytovateľom Internetu, okrem internetovej služby si zvyčajne prenajímate aj router. Je certifikovaný pre sieť vášho poskytovateľa a poskytuje drôtové a bezdrôtové pripojenie pre všetky zariadenia u vás doma. Vo väčšine prípadov sa tohto routra nemôžete zbaviť a väčšina ľudí to ani nerieši. Ja rozmýšľam inak a verím, že je dôležité rozprávať o jeho bezpečnostných rizikách.

Routre poskytnuté vašim poskytovateľom Internetu majú niekoľko nevýhod:

  • Ich hardvér je často podradný, s nedostatočnou pamäťou RAM a flashovým úložiskom
  • Ako dôsledok je ich softvér obmedzený vo funkčnosti
  • Občas majú takéto routre hardvérové úpravy od variantov určených pre spotrebiteľský trh a často obsahujú upravený firmvér vyrobený výlučne pre vášho poskytovateľa
  • Vy ako zákazník máte obmedzený prístup do takýchto zariadení. Na druhej strane, váš poskytovateľ má často vzdialený prístup a plnú kontrolu nad týmto zariadením
  • V minulosti našli bezpečnostní experti niekoľko zadných vrátok, ktoré umožnili vzdialený prístup komukoľvek, kto bol dostatočne motivovaný
  • Takéto routre zvyčajne nedostávajú aktualizácie firmvéru alebo ich dostávajú len veľmi zriedkavo a len na obmedzený čas
  • Ako dôsledok, ak nájdu bezpečnostní experti chyby v softvérových knižniciach použitých v takýchto routroch, tieto chyby v nich nie sú nikdy opravené
  • Takéto routre používate denne mnoho rokov. Zvyčajne, dokiaľ vám váš poskytovateľ nedá novší model, čo sa stáva zriedkavo

Pre mňa je to, že mám vlastný router pripojený za routrom môjho poskytovateľa samozrejmosť. Rád mám veci pod kontrolou a tiež používam neštandardné služby ako VPN, ktorá prepája dom u mojich rodičov a byt tak, aby som mohol k mojim veciam pristupovať odkiaľkoľvek.


Od Mikrotiku k Raspberry

Za tie roky som vyskúšal viacero značiek routrov, ale u jednej som zostal veľmi dlho — u Mikrotiku. Odporučil mi ho priateľ a odvtedy som túto radu predal ďalej s tým, že už mám vlastné skúsenosti.

Mikrotik RB450G
Mikrotik RB450G, môj hlavný router pred výmenou za RPi4

U mňa doma som používal model RB450G, ktorý má jednojadrový MIPS procesor taktovaný na 680 MHz, 256 MB RAM a 512 MB flashového úložiska. Oproti routru môjho poskytovateľa bolo už aj toto značné zlepšenie. V tom čase mal typický router od poskytovateľa Internetu, resp. lacný domáci router, zhruba 32 MB RAM a 4 MB úložiska. Nebolo takmer možné dostať tam nejaký slušný softvér, pretože jednoducho nebolo miesto.

Pripájali sme sa prostredníctvom ADSL. Aby som tento nový router zapojil do mojej siete, pripojil som ho na LAN port ADSL modemu ako jediného klienta. Taktiež som vypol DHCP, nastavil statickú IP adresu a vypol všetky “inteligentné” funkcie, čím som spravil z modemu len hlúpy bridge, ktorý preposielal dáta z môjho routra k môjmu poskytovateľovi Internetu, tam a späť.

Domáci router za ISP routrom
Domáci router pripojený za routrom poskytovateľa

Každý router poskytovateľa je iný, ale mali by ste ho vedieť nastaviť obdobne. Tiež skúste nájsť možnosť DMZ a nastaviť ju na IP adresu vášho domáceho routra. Takto budú všetky dáta preposielané na váš domáci router a nebudú sa aplikovať žiadne špeciálne pravidlá. A ešte jedna vec. Ak má router od vášho poskytovateľa WiFi, vypnite ju. WiFi potrebujete nastaviť na vašom domácom routri alebo na zariadení, ktoré je za ním. Inak budú všetky dáta z bezdrôtovej siete obchádzať váš domáci router a to zrejme nechcete.

OpenWrt

Zariadenia od Mikrotiku používajú ako ich systém RouterOS. Dáva používateľom funkcie, ktoré sa nachádzajú v oveľa drahších sieťových produktoch. Obzvlášť zbožňujem ich WinBox aplikáciu, ktorá mi pomáha spravovať moje zariadenia cez jednoduché UI. Avšak, ako som to používal, našiel som niekoľko chýb a tiež mi chýbali niektoré funkcionality. Napríklad, RouterOS podporuje OpenVPN iba cez TCP, čím stúpa prevádzková réžia. Taktiež, keď môj poskytovateľ zaviedol IPv6 v konfigurácii DS-Lite, podpora v RouterOS bola obmedzená a mal som problém pristupovať k natívnej IPv6 sieti. Preto som sa rozhodol zmigrovať na OpenWrt, čo je open-source linuxová distribúcia zameraná na routre. Vďaka tomu bolo mnoho funkcií priamo tam, vrátane OpenVPN na UDP a dobrá podpora DSLite.

OpenWrt mal k dispozícii mnoho softvérových balíčkov. Ak mi niečo chýbalo, mohol som pripraviť balíček sám (a aj som to spravil). A ak som našiel chybu, mohol som ju nahlásiť a poskytnúť patch (aj to som spravil). No jedného dňa v linuxovom jadre zahodili podporu pre moje flashové úložisko. Zrazu najnovšie verzie OpenWrt nefungovali s mojim routrom správne a ja som musel zostať u starej verzie systému. Išlo o problém z pohľadu bezpečnosti, ako aj použiteľnosti. Už som viac nemohol používať najnovší softvér. Keďže šlo o môj hlavný router, nemohol som s ním experimentovať a pripravovať patche. Testovanie mojich zmien nebolo možné. Túto starú OpenWrt distribúciu som nechal na mojom routri bežať vyše roka. Počas tejto doby som hľadal alternatívne riešenie, ktoré je dostatočne výkonné, aby zvýšilo výkon mojej VPN a ktoré by mi umožnilo rozbehať upraviteľný firmvér.

Hľadanie alternatívneho hardvéru

V mojej druhej lokalite používam Turris Omniu, ktorá používa forknutý kód OpenWrt. Napadlo mi, že by som Omniu nahradil sieťovou vývojovou doskou ako MACCHIATObin Double Shot a že by som nahradil môj Mikrotik za Omniu. Nakoniec som od tejto myšlienky upustil kvôli vyššej cenne a horšej dostupnosti dosky MACCHIATObin. Z praktického uhla pohľadu nepotrebujem hardvér schopný uroutovať 10 Gbit/sekundu, ak môj poskytovateľ Internetu mi dáva iba jeden gigabit, ale musím priznať, že by sa mi to páčilo. Neskôr som presunul svoju pozornosť na hardvér, na ktorom beží pfSense alebo OPNSense. Tieto distribúcie majú slabú podporu dosiek postavených na ARM architektúre a nájsť x86 hardvér s nízkou spotrebou, rozumnou cenou a slušným výkonom nie je také jednoduché.

Potom som si spomenul na môj Odroid C2. Je to vývojová doska s jedným ethernetovým portom a niekoľkými USB2 portami. Čo je však dôležité, že dokáže utiahnuť Ethernet cez jej RJ45 port v plnej rýchlosti jedného gigabitu. Pokiaľ by ste chceli použiť ako router takéto zariadenie, potrebujete aspoň dve rozhrania — jedno smerujúce k routru od vášho poskytovateľa (WAN) a jedno, ktoré smeruje k vašim zariadeniam (LAN). Rozmýšľal som, že použijem tento interný ethernetový port pre LAN, pretože najvyššia rýchlosť je na lokálnej sieti zásadná. Avšak u WAN mi stačila oveľa menšia priepustnosť, pretože rýchlosť môjho Internetu bola len okolo 100 Mbit/sekundu. Na tento účel som našiel veľmi slušné adaptéry z USB3 na Ethernet. Odroid C2 podporuje niekoľko linuxových distribúcií, vrátane Ubuntu a ArchLinux ARM. Preto je iste možné vyrobiť z neho router a rozhodne by som to spravil, keby nevyšla nová revízia Raspberry Pi. Hlavným problémom Odroidu C2 je, že nemá priamu podporu v linuxovom jadre a to jadro, ktoré je upravené, aby jeho podporu malo, je už dosť staré. Taktiež distribúcia ArchLinux ARM, ktorú som sa chystal použiť, nie je vyslovene navrhnutá pre routre. Toto riešenie by mohlo fungovať, ale s vysokou pravdepodobnosťou by zabralo oveľa viac času nastaviť ho.

V posledný víkend som už bol rozhodnutý ísť cestou s Odroidom C2. Ale v tom som sa pozrel na moje krásne nové Raspberry Pi 4 a rozmyslel som si to. Vlastním takmer všetky revízie Raspberry Pi a používam ich v mojich IoT projektoch. Aj to bol dôvod, prečo som si kúpil Raspberry Pi 4. Predchádzajúce generácie RPi neboli pre použitie ako routra až tak vhodné, pretože ich ethernetové rozhranie bolo interne smerované cez USB2 rozbočovač, čím sa účinne obmedzuje priepustnosť na zhruba 200 Mbit/sekundu. Avšak RPi4 konečne dokáže naplno zahltiť celú gigabitovú linku, pretože má novú I/O architektúru. A tiež konečne poskytuje USB3 porty, ktoré s mojim externým adaptérom z USB3 na Ethernet fungujú skvele. Hlavnou výhodou RPi4 nad Odroidom C2 je, že má priamu podporu v jadre. Preto je jednoduché použiť takmer najaktuálnejšie linuxové jadro. Kvôli jeho popularite je aj podpora komunity lepšia. A ako bonus pridalo preňho OpenWrt podporu v jej vývojových zostavách. Preto by mala byť migrácia z môjho existujúceho routra na Raspberry Pi relatívne bezbolestná. Poďme sa teraz pozrieť na tento proces.


Meníme Raspberry Pi na router

Ako som už spomenul, potreboval som mať dve ethernetové rozhrania, pričom mi Raspberry poskytuje iba jedno. Rozhodol som sa použiť interný ethernetový port pre moju lokálnu LAN a adaptér z USB na Ethernet pre WAN. Samozrejme, toto priradenie nie je podmienkou. Ak použijete USB adaptér pre LAN, aj takto by vám to malo fungovať. V mojom prípade je LAN port na RPi pripojený k 24-portovému gigabitovému ethernetovému switchu, aby som mohol poskytovať konektivitu pre viac ako jedno zariadenie. Môžete si kúpiť akýkoľvek lacný switch s gigabitovými portami.

RPi4 s adaptérom z USB na Ethernet
Raspberry Pi 4 s adaptérom z USB na Ethernet

Bez toho, aby som zašiel do prílišných detailov ako funguje Ethernet, router slúži k dvom účelom — prekladá IP adresu na MAC adresu prostredníctvom ARP protokolu a smeruje dátovú prevádzku do vonkajších sietí ako je Internet. Keď chcú dve vaše zariadenia komunikovať v rámci tej istej LAN siete, ich prevádzka cez router vôbec neprechádza, iba cez switch. A preto, keď si kúpite lacný switch s gigabitovými portami, budete mať slušne výkonnú sieť a vôbec nezáleží na tom, aký router používate.

Preto ak máte nejaké zvyšné Raspberry Pi 3, stále vám môže dobre slúžiť ako router, len zaňho pripojte nejaký switch a uistite sa, že vaša internetová linka je pomalšia ako 200 Mbit/sekundu. Inak bude vaša rýchlosť obmedzená. Raspberry Pi 3 nezvládne väčšiu dátovú prevádzku kvôli internému USB2 rozbočovaču, ktorý som už spomínal. RPi4 je v tomto prípade lepšia voľba. Nemám presné štatistiky, ale priepustnosť USB 3.0 je 5 Gbit/s, takže si myslím, že najnovšie RPi by nemalo mať problém zahltiť odchádzajúcu linku.

Inštalácia OpenWrt

Inštalácia systému bola dosť priamočiara. Riadil som sa oficiálnymi inštrukciami. Vedzte však, že ak máte Raspberry Pi 4, jeho podpora ešte nie je v stabilných zostavách OpenWrt a musíte si stiahnuť najnovšiu vývojovú zostavu. Tento image je skomprimovaný gzipom, najprv ho teda musíte rozbaliť. Potrebné kroky vysvetlím pomocou linuxového príkazového riadku:

1gunzip rpi-4-ext4-factory.img.gz

Vo výsledku dostanete súbor bez prípony *.gz. Tento súbor môžete naflashovať na MicroSDXC kartu. Ja používam nástroj dd:

1dd if=rpi-4-ext4-factory.img of=/dev/mmcblk0 bs=4096
2sync

Zdrojový súbor určíte v parametre if a cieľovú pamäťovú kartu v parametre of. Veľkosť bloku, bs, je voliteľná, aby sme veci urýchlili a príkaz sync nás uistí, že všetko bolo na kartu zapísané.

Na rozdiel od distribúcií ako Raspbian, OpenWrt nezväčší váš systémový diskový oddiel, aby zabral všetko dostupné miesto. Typicky tak dostanete iba asi 100 MB miesta pre vaše aplikácie, aj keď má vaša karta 64 GB miesta. Ja som si zmenil veľkosť diskového oddielu ručne na mojom počítači. Najprv som upravil tabuľku diskových oddielov nástrojom fdisk a potom som použil príkaz resize2fs. Animácia nižšie ilustruje všetky tieto kroky:

Zmena veľkosti rootfs
Zmena veľkosti systémového diskového oddielu

Najprv potrebujete zmeniť tabuľku diskových oddielov, aby zaberal druhý oddiel, rootfs, všetko dostupné miesto. Diskový oddiel musí najskôr zmazať a potom vytvoriť nový. Kľúčové je uistiť sa, že nový, väčší oddiel začína na rovnakom ofsete. Možno vám táto operácia príde nebezpečná, ale v skutočnosti nie je. Samozrejme, musíte sa uistiť, že ste si vybrali správne zariadenie. Keď zmeníte tabuľku diskových oddielov, vyberte a znovu zasuňte pamätovú kartu, aby Linux použil aktualizovanú tabuľku. V ďalšom kroku skontrolujte chyby v súborovom systéme a nakoniec spustite príkaz resize2fs.

Prvé spustenie

Raspberry Pi má pridelenú IP adresu 192.168.1.1. Aby ste sa naňho pripojili, pripojte váš počítač na ethernetový port RPi a nastavte jeho adresu na 192.168.1.2. Potom by ste mali byť schopní pristupovať k OpenWrt cez SSH:

1[vzahradnik@EliteBook ~]$ ssh root@192.168.1.1
2
3
4BusyBox v1.31.1 () built-in shell (ash)
5
6 _______ ________ __
7 | |.-----.-----.-----.| | | |.----.| |_
8 | - || _ | -__| || | | || _|| _|
9 |_______|| __|_____|__|__||________||__| |____|
10 |__| W I R E L E S S F R E E D O M
11 -----------------------------------------------------
12 OpenWrt SNAPSHOT, r12945-0aa2ecf5b2
13 -----------------------------------------------------
14root@OpenWrt:~#

V ďalšom kroku je dobrým zvykom nastaviť si heslo:

1passwd <vaše-nové-heslo>

Aby sme mohli pokračovať, potrebujeme v OpenWrt mať internetovú konektivitu. V mojom prípade som zmenil IP adresu Raspberry Pi v súbore /etc/config/network. Ak staticky priradíte IP adresu z rozsahu zodpovedajúcemu vašej LAN, môžete pripojiť vaše Raspberry ako obyčajného klienta za váš existujúci router. Ďalšie kroky si tým zjednodušíte. Neexistuje univerzálny postup, ten váš musíte nájsť vy sami.

Rozbehanie adaptéra z USB na Ethernet

Keď si pozriete vaše dostupné rozhrania, s najväčšou pravdepodobnosťou uvidíte iba interné rozhranie eth0, aj keď je váš USB adaptér pripojený. V mojom prípade som si musel zistiť, akú čipovú sadu môj adaptér používa, a nainštalovať príslušný modul jadra.

1root@OpenWrt:~# opkg list kmod-usb-net*
2
3# Inštalácia modulu Realtek
4root@OpenWrt:~# opkg install kmod-usb-net-rtl8152
5root@OpenWrt:~# reboot

Po najbližšom reštarte by ste už mali vidieť vaše rozhranie USB Ethernetu inicializované:

1...
2[ 7.159985] usbcore: registered new interface driver r8152
3[ 7.370114] r8152 2-2:1.0 eth1: v1.10.11
4[ 10.665622] IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready
5[ 10.673312] r8152 2-2:1.0 eth1: carrier on
6...

Aktualizácia sieťovej konfigurácie

Ako som už spomenul, rozhodol som sa použiť USB adaptér pre dátovú prevádzku, ktorá ide von do Internetu. Raspberry Pi používa na tento účel štandardne interný port eth0. Potrebujeme v súbore /etc/config/network urobiť zmeny. No tentokrát už môžeme aplikovať cieľovú konfiguráciu, vrátane cieľovej IP adresy zariadenia. Len sa uistite, že túto konfiguráciu neaplikujete napríklad tým, že reštartujete zariadenie.

Môj súbor vyzerá nejako takto:

1...
2# Moja LAN sieť, kde Raspberry Pi slúži ako router.
3# Používa interný ethernetový port na Raspberry Pi.
4config interface 'lan'
5 option type 'bridge'
6 option ifname 'eth0'
7 option proto 'static'
8 # Statická IP adresa vášho routra.
9 # Musí byť vo vašej LAN sieti jedinečná.
10 option ipaddr '10.0.0.1'
11 option netmask '255.255.255.0'
12 option ip6assign '60'
13
14# Konfigurácia WAN siete, napr. na pripojenie
15# k routru poskytovateľa a Internetu.
16# Používa adaptér z USB na Ethernet.
17config interface 'wan'
18 option ifname 'eth1'
19 option proto 'static'
20 # Predpokladáme, že IP adresa routra od
21 # vášho poskytovateľa je 192.168.1.1
22 option ipaddr '192.168.1.2'
23 option netmask '255.255.255.0'
24 option gateway '192.168.1.1'
25 option ipv6 'auto'
26 option peerdns '0'
27 # Môžete sem zadať vlastné servery DNS
28 option dns '217.31.204.130 193.29.206.206'
29...

Inštalácia webového servera a grafického prostredia

OpenWrt poskytuje pre webové UI balíček LuCI. Umožňuje vám spravovať všetky tieto nastavenia cez jednoduchú webstránku. Na lacných a nevýkonných OpenWrt routroch zvyčajne používa ako webserver uhttpd. Avšak Raspberry Pi je dostatočne výkonné, aby zvládlo plnohodnotný Nginx server.

UI si môžete nainštalovať týmito príkazmi:

1opkg update
2opkg install luci-ssl-nginx

Voliteľne si môžete nainštalovať jazykové balíčky, aby sa UI preplo do vami požadovaného jazyka. Inštrukcie nájdete v oficiálnej dokumentácii.

Aby ste zapli UI, musíte spraviť následovné:

1root@OpenWrt:~# /etc/init.d/nginx enable

Záverečné kroky

A to je v podstate všetko. Teraz je Raspberry Pi pripravené slúžiť ako router. Pokiaľ máte ďalší domáci router s OpenWrt (ako v mojom prípade Mikrotik), môžete z neho preniesť zostávajúcu konfiguráciu ako pravidlá firewallu, DHCP a DNS záznamy, a potom môžete Raspberry Pi vypnúť. Je pripravené a môžete ho teraz umiestniť ako váš router.

Po reštarte môžete pristupovať k webovému rozhraniu vo vašom prehliadači pomocou statickej IP adresy nastavenej v konfigurácii siete.

LuCI webové rozhranie
LuCI webové rozhranie

Záver

V mojom prípade bol experiment s použitím Raspberry Pi ako môjho nového routra úspešný a rozhodol som sa spraviť z toho moje trvalé riešenie. Po dlhom čase mám OpenWrt s najnovšími opravami. Výkon mojej VPN je značne vyšší a to ešte nespomínam, že mi toto riešenie dáva 4 GB RAM a takmer 60 GB úložisko, čím získavam nové možnosti, ako prevádzkovanie vlastného proxy servera alebo nastavenie pravidiel vo firewalle, ktoré sú náročnejšie na výkon. Teší ma, že máme konečne vývojové dosky, ktoré sú schopné nahradiť sieťový hardvér. Takéto dosky možno výrazne ovplyvnia segment sieťových produktov pre domácnosti v nasledujúcich rokoch. Ak máte zvyšné Raspberry Pi, povzbudzujem vás k tomu, aby ste ho tiež skúsili použiť ako router. Je to zaujímavý zážitok.

More articles from Vladimír Záhradník

Raspberry Pi as a home router

The latest generation of Raspberry Pi is powerful enough to serve as a decent home router. What leads to my decision to use it, and what's my experience?

April 17th, 2020 · 9 min read

Merkur — A construction set you've never heard of!

After ten years, I found my old Merkur construction set. It brings memories and thoughts about how I can make it useful again.

February 29th, 2020 · 4 min read
© 2018–2020 Vladimír Záhradník
Link to $https://github.com/vzahradnikLink to $https://medium.com/@vladimir.zahradnikLink to $https://www.youtube.com/channel/UCogZ6qxqKa_WIsw7NnU2IaALink to $https://twitter.com/VladoZahradnikLink to $https://www.linkedin.com/in/vladimirzahradnikLink to $https://www.facebook.com/vzahradnikLink to $https://www.instagram.com/vladimir.zahradnik