OpenWRT na miarę naszych możliwości i potrzeb

Ile kosztuje router z 5 portowym zarządzlanym przełącznikiem z obsługą VLAN-ów, Wi-Fi (802.11b/g) z WPA-2 PSK, PPPoA (np. Noestrada), PPPoE (np. Multimo), dwoma portami USB (dyskiem twardym lub flash na USB?), możliwością logowania przez SSH, Firewallem (netfilter/iptables), NAT, QoS (z rozpoznawaniem aplikacji na poziomie warstwy 7), (c|r)torrent, wget, DHCP, DNS z pamięcią podręczną, serwerem WWW i FTP, oidentd z wsparciem dla NAT i na deser obsługą IPv6?

Sprzęt: około 300 złotych. Oprogramowanie: wyłącznie darmowe. Czas instalacji: kilka godzin (najdłuższa część to kompilacja całego systemu operacyjnego i wszystkich pakietów, ale jest ona zautomatyzowana i nie wymaga interwencji użytkownika, a sama instalacja zajmuje kilka minut).

Od czego zacząć?

Zaczynamy od kupna wspieranego przez OpenWRT routera. Chodzi nam wyłącznie o najlepszy sprzęt. Oprogramowanie wymienimy zaraz po zakupie. Według moich priorytetów najlepszym wyborem jest ASUS WL-500g Premium. Na drugim miejscu uplasował się Linksys WRTSL54GS.

Gdy mamy już router

Możemy zacząć od instalacji OpenWRT w wersji WhiteRussian. Opisywać instalacji i konfiguracji WhiteRussian nie będę, każdy najdzie na ten temat wiele informacji. Jeśli się uda i router spełnia nasze oczekiwania możemy skończyć w tym miejscu. Ale jeśli chcemy skonfigurować router w zupełnie dowolny sposób najlepszym rozwiązaniem jest zbudowanie OpenWRT ze źródeł.

Oprogramowanie niezbędne do zbudowania OpenWRT

Do zbudowania OpenWRT w Debianie lub Ubuntu niezbędne jest posiadanie następujących pakietów:

# aptitude install build-essential binutils flex bison autoconf gettext texinfo sharutils subversion libncurses5-dev ncurses-term zlib1g-dev

Źródła z repozytorium Subversion

Pobieramy źródła OpenWRT z repozytorium Subversion:

$ svn co https://svn.openwrt.org/openwrt/trunk/ openwrt-svn
$ svn co https://svn.openwrt.org/openwrt/packages/ openwrt-svn/feeds/packages

Następnie tworzymy dowiązania dla pakietów z katalogu feeds:

$ make package/symlinks

Konfiguracja obrazu OpenWRT

Kolejnym krokiem jest konfiguracja obrazu OpenWRT, wybieramy rodzaj obrazu (np. SquashFS), opcje Busybox, Linuksa i pakietów:

$ make menuconfig

Opcje Target System, Profile, Image

Dla Asusa WL-500gP Target System należy ustawić na Broadcom BCM947xx/953xx [2.6] lub Broadcom BCM947xx/953xx [2.4]. Opcja ta wybiera linię jądra, odpowiednio 2.6 lub 2.4. Generalnie należy wybrać 2.6. Jeśli 2.6 nie będzie działało kolejnym krokiem będzie wypróbowanie jądra 2.4.

Jako Target Profile wybieramy Broadcom BCM43xx WiFi (default). Jeśli mamy inny rodzaj kontrolera sieci bezprzewodowej wybieramy właściwą opcję. Przydatne jeśli wymieniliśmy kartę MiniPCI w routerze np. na opartą na kontrolerze Atheros.

Target Images definiuje rodzaj systemu plików używanego jako /. Najlepszym wyborem jest squashfs zapewniający wyższy stopień kompresji niż jffs2. Drugą ważną różnicą jest to, iż jffs2 umożliwia zapis, a squashfs jest tylko do odczytu. Jeśli wybierzemy squashfs na główny system plików, na routerze zostanie stworzony obszar przeznaczony do zapisywania danych w formacie jffs2.

Advanced configuration options (for developers)

W menu Build Options wybrałem opcje Clean all ipkg files before building the rootfs oraz Use ccache. Pierwsza powoduje przebudowanie wszystkich pakietów za każdym razem, a druga włącza użycie pamięci podręcznej dla plików obiektów. program ccache przyspiesza kompilację w przypadku budowania OpenWRT po raz kolejny, z niewielkimi zmianami w stosunku do poprzedniej konfiguracji.

Natomiast w menu Toolchain Options zaznaczyłem Enable Smash Stacking Protection support, która (przynajmniej teoretycznie) powinna utrudniać wykonywanie kodu przez przepełnienie bufora. Podnosi to (nieco) poziom bezpieczeństwa w przypadku próby wykorzystania przez atakującego tego typu błędów.

Wybór pakietów

Wybór pakietów jest najdłuższą czynnością. Na szczęście dla większości pakietów dostępny jest krótki opis. Mój plik konfiguracyjny dla ASUS WL-500g Premium umieściłem tutaj jako referencję. Może on być użyty jako baza do dalszych eksperymentów albo bezpośrednio do zbudowania OpenWRT w wersji r13858.

Zmiana limitu wielkości dla rootfs

Domyślny limit wielkości obszaru rootfs jest zdefiniowany w tools/firmware-utils/src/trx.c i wynosi 0x5A0000 (większość routerów ma mniej pamięci flash niż WL500GP). W moim przypadku było to zbyt mało aby pomieścić wszystkie aplikacje, a ponieważ router bezproblemowo obsługuje większe rozmiary rootfs powiększyłem rootfs o 1MB. Poniżej patch:

Index: tools/firmware-utils/src/trx.c
===================================================================
--- tools/firmware-utils/src/trx.c      (wersja 13876)
+++ tools/firmware-utils/src/trx.c      (kopia robocza)
@@ -60,7 +60,7 @@

 #define TRX_MAGIC      0x30524448      /* "HDR0" */
 #define TRX_VERSION    1
-#define TRX_MAX_LEN    0x5A0000
+#define TRX_MAX_LEN    0x6A0000
 #define TRX_NO_HEADER  1               /* Do not write TRX header */

 struct trx_header {

Sprzętowo wspomagana biblioteka OpenSSL

Jeśli router posiada Sonics Silicon Backplane (ssb) i rdzeń IPSEC (Core 7 found: IPSEC (cc 0x80B, rev 0x00, vendor 0x4243)) warto w pliku .config włączyć:

CONFIG_PACKAGE_kmod-crypto-ocf=y
CONFIG_PACKAGE_kmod-ocf-ubsec-ssb=y
CONFIG_PACKAGE_ocf-crypto-headers=y

Oraz dodać do biblioteki OpenSSL opcję włączającą wsparcie dla OCF:

Index: package/openssl/Makefile
===================================================================
--- package/openssl/Makefile    (wersja 13876)
+++ package/openssl/Makefile    (kopia robocza)
@@ -81,6 +81,8 @@
 define Build/Configure
        (cd $(PKG_BUILD_DIR);
                ./Configure linux-openwrt
+                       --with-cryptodev
+                       --with-cryptodev-digests
                        --prefix=/usr
                        --openssldir=/etc/ssl
                        $(TARGET_CPPFLAGS)

Aplikacje używające libssl powinny teraz korzystać ze sprzętowej akceleracji operacji szyfrowania i haszowania. Aplikacje takie to m.in.: OpenVPN, rTorrent i wget. Dropbear (domyślny serwer SSH w OpenWRT) nie korzysta z OpenSSL i dlatego nie jest wspomagany sprzętowo.

Budowanie OpenWRT

Aby pobrać wszystkie niezbędne do zbudowania OpenWRT pliki wydajemy polecenie (jeśli tego nie zrobimy pliki będą pobierane przed budowaniem każdego pakietu):

$ make download

Gdy wszystko jest już skonfigurowane wydajemy polecenie:

$ make world

W zależności od ilości wybranych pakietów, mocy obliczeniowej procesora i ilości pamięci RAM zbudowanie wszystkiego zajmie od kilku do kilkudziesięciu minut. Włączenie ccache przyspiesza budowanie w momencie gdy wprowadzimy niewielkie zmiany w konfiguracji i budujemy OpenWRT po raz kolejny.

Instalacja OpenWRT na routerze

Ta czynność jest bardzo prosta w przypadku WL-500gP. Po odłączeniu routera od zasilania wciskamy i trzymamy przycisk reset. Trzymając reset podłączamy zasilanie. Gdy dioda informująca o stanie zasilania zacznie migać zwalniamy przycisk reset. Podłączamy kabel Ethernet do portu LAN routera i do komputera.

Ustawiamy adres IP na interfejsie eth0:0 za pomocą komendy:

# ifconfig eth0:0 192.168.1.5 up

A następnie przechodzimy do katalogu bin i wydajemy polecenie:

$ atftp --trace --option "timeout 1" --option "mode octet" --put --local-file openwrt-brcm47xx-squashfs.trx 192.168.1.1

Czekamy do zakończenia kopiowania pliku. Po zakończeniu sesji tftp czekamy około 5 minut na zapisanie obrazu OpenWRT w pamięci flash i odłączamy zasilanie. Po ponownym podłączeniu zasilania router będzie bardzo długo startował ze względu na konieczność utworzenia obszaru jffs2 i wygenerowania kluczy SSH routera.

Konfiguracja OpenWRT

Łączymy się z routerem za pomocą telnetu:

$ telnet 192.168.1.1

Następnie ustawiamy hasło:

# passwd

Ustawienie hasła uniemożliwia dalsze logowanie przez telnet. Od tej chwili należy używać wyłącznie SSH. Wylogowujemy się z routera i logujemy za pomocą SSH:

$ ssh [email protected]

Wyłączanie niepotrzebnych usług

Jeśli nie zamierzamy korzystać z serwera telnet i http możemy je wyłączyć:

# /etc/init.d/telnet disable
# /etc/init.d/httpd disable

Nazwa hosta i strefa czasowa

W /etc/config/system ustawiamy:

config system
        option hostname myrouter
        option timezone "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00"

Dropbear

Aby włączyć logowanie wyłącznie za pomocą kluczy SSH zapisujemy w /etc/dropbear/authorized_keys nasz klucz publiczny, a następnie w /etc/config/dropbear ustawiamy:

        option PasswordAuth 'off'

QoS

Ustawiamy w /etc/config/qos przepływność interfejsu WAN:

option upload 256
option download 1024

Na początek pozostałe opcje warto pozostawić bez zmian.

Thomson SpeedTouch 330, PPPoA i Neostrada

Thomson SpeedTouch 330 otrzymany od TP za 1 zł jest obsługiwany przez Linuksa. Pakiet z firmware również jest obecny w OpenWRT.

W przypadku SAGEM F@st 800 OpenWRT posiada jedynie sterownik. Firmware należy skopiować ręcznie do katalogu /lib/firmware/ueagle-atm po zainstalowaniu OpenWRT.

Aby sprawdzić, czy po podłączeniu do portu USB routera modem został wykryty, oprogramowanie firmware załadowane, a synchronizacja ukończona pomyślnie wydajemy polecenie dmesg | tail. Powinniśmy zobaczyć taki komunikat:

speedtch 2-1:1.0: found stage 1 firmware speedtch-1.bin.4
speedtch 2-1:1.0: found stage 2 firmware speedtch-2.bin.4


ATM dev 0: ADSL line is synchronising
ATM dev 0: ADSL line is up (1312 kb/s down | 320 kb/s up)

Modem jest gotowy i możemy skonfigurować połączenie PPP. W tym celu ustawiamy w pliku /etc/config/network w sekcji WAN configuration:

config interface        wan
        option ifname   "ppp0"
        option proto    pppoa
        option encaps   llc
        option vpi      0
        option vci      35
        option username "[email protected]"
        option password "XXXXXXXX"

Aby nawiązać połączenie używamy:

# ifup wan

IPv6

Opcje połączenia IPv6 przez tunel w SixXS definiujemy w /etc/config/aiccu. Konfiguracja radvd znajduje się w /etc/config/radvd.

OpenDNS

Konfigurację OpenDNS na OpenWRT opisałem już wcześniej.

Gdy 8MB pamięci flash to zbyt mało…

Można do portu USB podłączyć dysk twardy USB lub bezgłośny Pendrive na którym można przechowywać pliki pobierane z Internetu. Można na nim również stworzyć partycję wymiany (co przyda się gdy będziemy chcieli uruchamiać więcej programów).

Konfiguracja dodatkowych nośników danych jest przechowywana w /etc/config/fstab. Przykładowa konfiguracja z pratycją /home na pliki uzytkownika, /opt na dodatkowe, niemieszczące się w pamięci flash routera aplikacje oraz partycją swap:

config mount home
        option target   /home
        option device   /dev/sda1
        option fstype   ext3
        option options  rw

config mount opt
        option target   /opt
        option device   /dev/sda2
        option fstype   ext3
        option options  rw

config swap
        option device   /dev/sda3

opkg-link

Aby móc instalować pakiety na zewnętrznej pamięci dodajemy do /etc/opkg.conf linię:

dest usb /opt

Pakiety instalujemy na dysku USB poleceniem:

# opkg -d usb install nazwa_pakietu

Aby dodać link do pakietu w /opt w / możemy użyć skryptu opkg-link. Możemy go skopiować z UsbStorageHowto i zapisać jako /bin/opkg-link.

Podsumowanie

Nieźle jak na sprzęt za niecałe 400 zł (~300 zł router, 80 zł pendrive, 1zł modem DSL), co?

19 thoughts on “OpenWRT na miarę naszych możliwości i potrzeb”

  1. Wokół wsparcia dla BCM4704 narosło w ostatnim czasie wiele mitów. Jeśli masz na myśli błąd #2035 to został on naprawiony jeszcze w 2007 roku przez zmianę o numerze r9285. W moim odczuciu otwarty sterownik działa nieco wolniej niż binarny sterownik producenta, ale jest równie stabilny. Mój router ma już uptime 4 dni, a z sieci bezprzewodowej korzystają na okrągło dwa komputery.

  2. Heh, coś chyba pomieszałeś ;). BCM4704 to procesor, natomiast WiFi jest na chipsecie BCM4318. Ja miałem 1,5 roku temu problem właśnie z tym drugim – OpenWRT na jądrze 2.6 po prostu nie wykrywał mi wifi. Zainstalowałem więc 2.4 i od tego czasu chodzi dobrze. Myślę teraz o zainstalowaniu świeżego OpenWRT i migracji na 2.6, jednak mam te same wątpliwości – czy aby na pewno pójdzie, bo może lepiej wydać 100zł i wymienić kartę miniPCI.

  3. Skrót myślowy. Były problemy z jądrem 2.6 na procesorze BCM4704. Natomiast Wi-Fi (BCM4318) obsługiwane w 2.6 jest przez otwarty sterownik b43. W 2.4 był jest natomiast binarny sterownik producenta i on właśnie jest nieco szybszy. Trochę niefortunnie połączyłem dwie myśli. Przepraszam.

  4. Problem w tym, że OpenWRT, sprawia wrażenie baaardzo powolnego rozwoju, ile to już czasu minęło od 8.09RC1? A na stronie, brak jakichkolwiek informacji o dalszych postępach prac…

    (Szczerze zaznaczam, że nie monitoruje wersji z svn, wyznaję zasadę, że jeśli projekt, zyje, to developerzy nie zapominają o jakichkolwiek informacjach o postępie, na stronie głównej projektu)

    Mi na jądrze 2.6 w moim 500gP WiFi działało, lecz zdarzało się, że się wieszało i trzeba było restartować router… Co więcej dziwnego… Na jądrze 2.6 nie działała mi dioda “AIR” nie świeciła w ogóle, mimo że WiFi działo…

    Co nie zmienia faktu, że próbowałem tylko builda z oficialnej strony, który jest przestarzały, spróbuję dziś 2.6 z svn, bez eksperymentów nie ma postępu :D

    pzdr

  5. obsy, ale ja już wyrosłem z bycia królikiem doświadczalnym w środowisku dajmy na to “produkcyjnym” (jedyny router w domu) ;). OpenWRT działa mi stabilnie i jest ok, ale skoro sterownik b43 może stwarzać czasem problemy, to wolę poszukać czegoś innego co działa stabilnie i mieć święty spokój.

  6. Witam – w jaki sposób weryfikowałeś, że openssl korzysta z chipa crypto? Mi niestety pomimo skompilowane z –with-cryptodev i –with-cryptodev-digests jedzie z libcrypto. moduł ubsec_ssb działa w porządku, cryptotest korzysta z niego (jest ogromna różnica w prędkości). Cofnąłem się nawet do wersji 13876, jak w przykładzie powyżej – i nic :(

  7. Nie weryfikowałem tego. Pewnie polecenie “openssl” byłoby tu przydatne. Dosyć dziwne, że nie ma różnicy pomiędzy włączonym (“openssl speed −engine cryptodev”) i wyłączonym cryptodev (“openssl speed”)? Może użyłeś algorytmu, który jest niewspierany przez sprzęt. Np. “openssl speed −evp aes128(/des/3des)” powinno działać sprzętowo, pozostałe raczej nie. Możesz też spróbować wyświetlić dostępne możliwości za pomocą “openssl engine -vvv -c -t”.

  8. Co do tego wspomagania sprzętowego rtorrenta mam wątpliwości. Haszowanie danych w torrencie odbywa sie za pomocą SHA1 a ubsec_ssb udostępnia jedynie metodę HMAC_SHA1, openssl raportuje ją jako hmacWithSHA1. Udało Ci się odpalić wspomaganego rtorrenta?

  9. Interesowałaby mnie instalacja speedtouch’a 330 na openwrt lecz z wersją jądra 2.4 gdzyż wykorzystuję tryb WDS, którego do tej pory b43 + hostap nie wspiera. Szukalem już trochę na ten tamat lecz same stare posty i wygaśnięte linki. Jakieś wspazowki, namiary mile widziane…

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.