Konfiguracja interfejsów sieciowych w OpenWRT

Spis treści

Routery, które posiadamy w naszych domach, znane są z tego, że mają szereg interfejsów sieciowych. Taki przeciętny router jest wyposażony w switch z 5 portami RJ-45. Zwykle jest on też wirtualnie podzielony (VLAN) na kilka interfejsów, standardowo LAN i WAN. Do tego z reguły dochodzą jeszcze interfejsy bezprzewodowe WLAN na pasmo 2.5GHz i 5GHz. Jakby tego było mało, to mamy jeszcze wirtualny interfejs mostka, który spina ze sobą lokalne interfejsy switch'a z interfejsami bezprzewodowymi tworząc w ten sposób jeden interfejs, przez który pakiety wydostają się z naszej sieci i lecą dalej w świat przez interfejs WAN. Jest to trochę skomplikowane, dlatego też w tym wpisie przyjrzymy się całej tej konfiguracji interfejsów sieciowych w OpenWRT.

Jakie interfejsy sieciowe ma router

Na sam początek ustalmy to jakimi interfejsami dysponuje nasze urządzenie. Logujemy się zatem na router i w terminalu wpisujemy polecenie ifconfig . Jak sama nazwa wskazuje, powinno ono zwrócić listę aktywnych interfejsów sieciowych:

konfiguracja-interfejsow-sieciowych-archer-c7-openwrt

Powyżej mamy szereg interfejsów fizycznych, czyli tych, które zostały poprawnie rozpoznane przez system operacyjny routera. Do nich zaliczają się eth0 , eth1 , wlan0 oraz wlan1 . Mamy tam także dwa interfejsy wirtualne lo oraz br-lan . Te dwa ostatnie są dynamicznie tworzone przez OpenWRT. Do poprawnej pracy, każdy z tych interfejsów wymaga odpowiedniej konfiguracji. Do tego celu oddelegowane są różne skrypty, które w oparciu o plik /etc/config/network ustawiają wszystkie z powyższych interfejsów.

W pliku /etc/config/network mamy sprecyzowanych kilka bloków, które zostaną poniżej opisane. W domyślnej konfiguracji OpenWRT może brakować pewnych linijek. Dlatego też jeśli czegoś nie posiadamy, to wystarczy zwyczajnie dany parametr dopisać. Oczywiście w przypadku, gdy jest on nam potrzeby. Zwykle domyślna konfiguracja jest adresowana do większości użytkowników i raczej nie będziemy musieli nic zmieniać czy dopisywać. Trzeba też wziąć ewentualną poprawkę na nazwy interfejsów sieciowych, bo te mogą nie być jednakowe we wszystkich modelach routerów. Ten artykuł jest pisany w oparciu o konfigurację routera TP-LINK Archer C7 v2, który od wydania Chaos Calmer działa pod OpenWRT bardzo przyzwoicie.

Interfejs pętli zwrotnej (lo)

Pierwszy blok w pliku /etc/config/network odpowiada za konfigurację pętli zwrotnej. Jest to interfejs, na którym działają zwykle wewnętrzne usługi routera, z którymi nikt spoza tego urządzenia nie jest w stanie się połączyć. Jest to taka jego wirtualna sieć. Ten interfejs zawsze jest oznaczany jako lo , a jego konfiguracja pod OpenWRT wygląda mniej więcej tak jak poniżej przedstawiono:

config interface 'loopback'
    option ifname 'lo'
    option proto 'static'
    option ipaddr '127.0.0.1'
    option netmask '255.0.0.0'

Nazwa interfejsu jest określana przez opcję ifname . Lepiej jest nie używać nazw dłuższych niż 15 znaków. Może to prowadzić do różnego rodzaju błędów w konfiguracji. Dalej mamy opcję proto odpowiadającą za protokół konfiguracji tego interfejsu. Pełną listę obsługiwanych protokołów można znaleźć na wiki OpenWRT. W przypadku interfejsu lo , zawsze konfiguruje się go statycznie. W zależności od wybranego protokołu, możemy definiować szereg opcji specyficznych dla danego protokołu. Jako, że tutaj mamy protokół statyczny, to określić musimy dwie opcje: ipaddr (adres IP) oraz netmask (maskę podsieci). W ten sposób interfejs pętli zwrotnej działa w sieci 127.0.0.0/8 i ma adres 127.0.0.1 . Ten interfejs musi być skonfigurowany, w przeciwnym razie lokalne usługi przestaną działać lub też zaczną działać nieprawidłowo.

Globalne parametry interfejsów

Nieco pod blokiem dotyczącym interfejsu lo mamy sekcję config globals 'globals' . W niej są umieszczane parametry niezależne od interfejsu. Standardowo po instalacji OpenWRT, w tej sekcji jest umieszczony tylko jeden parametr. Jest on odpowiedzialny za konfigurację prefiksu lokalnego adresu protokołu IPv6. Poniżej ta sekcja:

config globals 'globals'
    option ula_prefix 'fd42:156b:900b::/48'

Interfejs mostka (br-lan)

Dalej w pliku /etc/config/network mamy blok odpowiadający za konfigurację wirtualnego interfejsu sieciowego. Jest to mostek (bridge), który spina ze sobą szereg fizycznych interfejsów routera. W ten sposób mamy do skonfigurowania tylko jeden interfejs, podczas gdy router może operować na szeregu fizycznych interfejsów. W tym przypadku są to wlan0, wlan1 oraz eth1 (lokalne porty switch'a) . Usługi, które będziemy chcieli udostępnić w sieci lokalnej, np. serwer FTP czy www, będą na tym interfejsie operować. Poniżej znajduje się konfiguracja mostka w routerze:

config interface 'lan'
    option ifname 'eth1'
    option force_link '1'
    option type 'bridge'
    option proto 'static'
    option ipaddr '192.168.1.1'
    option netmask '255.255.255.0'
#   option broadcast '192.168.1.255'
    option ip6assign '60'

Widzimy tutaj, że opcja type tego interfejsu została ustawiona na bridge . W opcji ifname definiujemy wszystkie interfejsy fizyczne, które mają być podpięte pod mostek. Z racji pewnych problemów z interfejsami bezprzewodowymi, nie określa się ich statycznie w pliku /etc/config/network . Niemniej jednak, one również będą dodawane do tego mostka, z tym, że już za sprawą skryptu /lib/netifd/hostapd.sh . Po odrzuceniu interfejsów wlan0 i wlan1 zostaje nam tylko interfejs eth1 . Ten interfejs, podobnie jak w przypadku lo , będzie miał ustawioną statyczną adresację. Adres IP to 192.168.1.1 z maską 255.255.255.0, co tworzy sieć 192.168.1.0/24 . Opcjonalnie można także zdefiniować broadcast , który standardowo jest ustawiany na ostatni adres sieci, czyli 192.168.1.255 . Dzięki temu adresowi dany host w sieci może wysłać pakiety do wszystkich znajdujących się w niej maszyn, np. w przypadku poszukiwania serwera DHCP. Jako, że ustawiliśmy statyczny protokół konfiguracji tego interfejsu, musimy także ustawić opcję force_link . Odpowiada ona za przypisanie do tego interfejsu adresu IP, maski oraz opcjonalnie bramy sieciowej nawet w przypadku, gdy połączenie nie jest aktywne. Dalej mamy opcję ip6assign określającą długość prefiksu dla sieci protokołu IPv6.

Interfejs WAN (eth0)

Może i router posiada szereg interfejsów przewodowych i bezprzewodowych, za pomocą których możemy się do niego podłączyć od strony LAN, to w przypadku WAN mamy do dyspozycji standardowo tylko jeden interfejs. Jest on wydzielony ze switch'a i w tym przypadku jest to eth0 . Konfiguruje się go podobnie co w dwóch powyższych przypadkach, tj. przez odpowiednią sekcję w pliku /etc/config/network , przykładowo:

config interface 'wan'
    option ifname 'eth0'
    option proto 'dhcp'
#   option macaddr 'E8:94:F6:68:79:F1'
#   option hostname 'the-mountain'
    option peerdns '0'
    option dns '208.67.220.220 208.67.222.222'

Jako, że za pomocą tego interfejsu będzie się odbywać łączność ze światem, to jego konfiguracja jest zwykle ustawiona na dynamiczną przez protokół DHCP. Można oczywiście ustawić sobie statyczny adres, tak jak to miało w przypadku interfejsu br-lan . Niemniej jednak, trzeba będzie ręcznie dostosowywać sobie konfigurację połączenia z ISP jeśli ulegnie ona zmianie wliczając w to ipaddr , netmask gateway i opcjonalnie broadcast . W ifname określamy fizyczny interfejs switch'a, tym razem po stronie WAN. Jeśli potrzebujemy sklonować adres MAC, to w opcji macaddr wpisujemy adres poprzedniej maszyny, która widnieje w bazie ISP. Opcja hostname sprawi, że klient udhcpc wyśle do serwera DHCP nazwę hosta określoną w tym parametrze. Zwykle nie jest wysyłana żadna nazwa. Za pomocą opcji peerdns oraz dns jesteśmy w stanie nadpisać serwery DNS otrzymane w lease od serwera DHCP naszego ISP. Po zresetowaniu routera, adresy określone tutaj pojawią się w pliku /tmp/resolv.conf.auto :

# cat /tmp/resolv.conf.auto
# Interface wan
nameserver 208.67.220.220
nameserver 208.67.222.222

Jeśli chodzi o serwery DNS dla hostów znajdujących się w sieci lokalnej, to takim serwerem jest sam router. Wszystkie zapytania DNS z sieci wędrują pod adres określony w pliku /tmp/resolv.conf . Po ich otrzymaniu przez router, te zapytania są przesyłane do upstream'owych serwerów DNS, tych określonych w pliku /tmp/resolv.conf.auto . Możemy oczywiście ustawić, by zapytania z sieci szły bezpośrednio do serwerów google czy OpenDNS. Z tym, że wtedy stracimy możliwość buforowania zapytań, co trochę spowalnia rozwiązywanie domen na adresy IP.

IPv6 na interfejsie WAN (eth0)

OpenWRT wspiera protokół IPv6. Jeśli tylko nasz router wspiera tę nową adresację, to jesteśmy w stanie na porcie WAN skonfigurować klienta DHCP, który pobierze stosowną konfigurację. Niestety niewielu providerów internetowych zapewnia wsparcie dla IPv6, w efekcie poniższy blok na nic nie wpływa:

config interface 'wan6'
    option ifname    'eth0'
    option proto     'dhcpv6'

Niemniej jednak, jeśli jesteśmy w posiadaniu zewnętrznego adresu IPv4, to możemy pokusić się o stworzenie tunelu 6in4.

Konfiguracja switch'a (VLAN)

Ostatnie trzy bloki w pliku /etc/config/network dotyczą podziału switch'a na VLAN'y. Te sekcje są różne w zależności od posiadanego routera. Trzeba też zaznaczyć, że nie każdy switch jest programowalny i nie zawsze będziemy mieć opcję jego podziału wedle upodobania, np. jeśli chcielibyśmy wydzielić drugi port WAN. Poniżej przykład konfiguracji:

config switch
    option name 'switch0'
    option reset '1'
    option enable_vlan '1'

config switch_vlan
    option device 'switch0'
    option vlan '1'
    option ports '0t 2 3 4 5'

config switch_vlan
    option device 'switch0'
    option vlan '2'
    option ports '0t 1'

Konfiguracja switch'a wykracza poza ramy tego artykuły i nie będę poruszał tutaj tego tematu. Niemniej jednak, jest on bardzo ciekawy i na tyle obszerny, że został opisany w artykule dotyczącym podziału switch'a na VLAN'y.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.