Metryki tras interfejsów eth0 i wlan0 w laptopie (metric)

Spis treści

W obecnych czasach posiadanie komputera, który dysponuje kilkoma interfejsami sieciowymi nie jest niczym niezwykłym. Praktycznie każdy laptop posiada już na pokładzie co najmniej jedną kartę WiFi i minimum jeden port ethernet. W efekcie czego jesteśmy w stanie podłączyć się do sieci zarówno przewodowo jak i bezprzewodowo. Problem jednak pojawia się w momencie, gdy chcemy wykorzystywać oba te interfejsy, z tym, że dysponujemy jedynie niezbyt zaawansowanym menadżerem okien Openbox. Takie środowiska zwykle nie mają na pokładzie automatów pokroju Network Manager, przez co bardziej zaawansowana konfiguracja sieci może być dość skomplikowana. Do tej pory wykorzystywałem interfejs bond0, by mieć możliwość łatwego przełączania się miedzy sieciami. Istnieje inny sposób konfiguracji interfejsów eth0 i wlan0 w pliku /etc/network/interfaces tak, by działały one nam równolegle i nie powodowały problemów z połączeniem, a wszystko za sprawą opcji metric .

Standardowa konfiguracja interfejsów eth0 i wlan0

Konfiguracja sieci w Debianie opartym o menadżer okiem Openbox odbywa się zwykle przez plik /etc/network/interfaces . W przypadku posiadania interfejsu przewodowego, dodajemy tam coś na wzór poniższego bloku:

auto eth0
iface eth0 inet dhcp

Gdy w grę wchodzi interfejs bezprzewodowy, to dodajemy nieco więcej parametrów:

auto wlan0
iface wlan0 inet dhcp
    wpa-driver nl80211
    wpa-debug-level -1
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Oczywiście w przypadku tego interfejsu WiFi, wszystkie parametry potrzebne do podłączenia się do sieci bezprzewodowej są określane w pliku /etc/wpa_supplicant/wpa_supplicant.conf i to wpasupplicant zajmuje się tą częścią połączenia. Więcej informacji na ten temat znajduje się w artykule o konfiguracji sieci WiFi pod Debianem.

Problem trasy domyślnej (default gateway)

Mając tak skonfigurowane interfejsy sieciowe będziemy mieć problem z połączeniem. Chodzi o to, że trasa domyślna (default gateway) zostanie przyporządkowana tylko jednemu z interfejsów eth0 lub wlan0 , poniżej przykład:

# ip route show
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.150
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.113

W tym przypadku interfejs eth0 został skonfigurowany jako pierwszy i to przez niego biegnie trasa domyślna. W przypadku odłączenia przewodu od tej karty sieciowej, stracimy połączenie i to pomimo faktu, że karta WiFi jest w dalszym czasie aktywna:

# ip route show
default via 192.168.1.1 dev eth0 linkdown
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.150 linkdown
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.113

Połączenie możemy przepiąć na interfejs wlan0 ale musimy usunąć tę powyżej określoną trasę domyślną i na jej miejsce dodać nową trasę, która będzie wskazywać na interfejs wlan0 . No tak, tylko nie chce nam się tego robić ręcznie, a poza tym, możemy posłużyć się metryką (parametr metric ), która skonfiguruje nam trasy domyślne mniej więcej na takiej samej zasadzie co w przypadku konfiguracji łącz różnych ISP.

Określanie metryki dla interfejsów (metric)

W pliku /etc/network/interfaces w każdej zwrotce z konfiguracją interfejsu sieciowego możemy określić parametr metric . Przyjmuje on argument w postaci liczby. Domyślnie jest ona równa 0 dla każdego interfejsu i to powoduje problemy. W tym przypadku mamy dwa interfejsy i musimy im określić dwie różne metryki. Im niższy numer podamy w parametrze metric , tym wyższy priorytet nadamy trasie. Przepiszmy zatem nasze dwa interfejsy tak, by zawierały metrykę:

auto eth0
iface eth0 inet dhcp
    metric 5

auto wlan0
iface wlan0 inet dhcp
    metric 10
    wpa-driver nl80211
    wpa-debug-level -1
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Restartujemy interfejsy za pomocą ifdown oraz ifup i patrzymy w listing tras:

# ip route show
default via 192.168.1.1 dev eth0  metric 5
default via 192.168.1.1 dev wlan0  metric 10
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.150
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.113

Jak widzimy wyżej, mamy dwie trasy domyślne. Pakiety będą lecieć przez interfejs eth0 do momentu odłączenia przewodu od karty sieciowej. Gdy takie zdarzenie nastąpi, połączenie będzie realizowane bezprzewodowo do momentu podłączenia przewodu.

Jest to podobny mechanizm co w przypadku interfejsu bond0 , z tym, że mamy kilka różnić. Przede wszystkim, tutaj mamy dwa różne adresy IP, a w przypadku bond0 jest tylko jeden adres. Kolejna sprawa to problemy przy przełączaniu się między połączeniem przewodowym i bezprzewodowym. Chodzi o to, że z racji dwóch różnych adresów IP na dwóch interfejsach sieciowych, pakiety będą inaczej adresowane, tj. będą miały inne źródło. W efekcie czego stracimy nawiązane sesje i będziemy musieli połączyć się jeszcze raz, np. z serwerem SSH.

Powyżej mieliśmy dwa różne adresy z tej samej sieci 192.168.1.0/24 ale to przez zalogowanie się do sieci domowej zarówno po kablu jak i bezprzewodowo. Niemniej jednak, oba połączenia są niezależne i mogą pochodzić nawet od dwóch różnych ISP, z tym, że interfejs eth0 jest preferowany. Jeśli nam to nie opowiada, to zawsze możemy pobawić się parametrem metric .

Problemy z połączeniem

Jeśli powyższe ustawienia powodują problemy przy przełączaniu się między łączem przewodowym i bezprzewodowym, to musimy także dostosować sobie odpowiednio kilka parametrów kernela. W tym celu edytujemy plik /etc/sysctl.conf i dopisujemy w nim te poniższe linijki:

net.ipv4.conf.all.ignore_routes_with_linkdown = 1
net.ipv4.conf.default.ignore_routes_with_linkdown = 1
net.ipv6.conf.all.ignore_routes_with_linkdown = 1
net.ipv6.conf.default.ignore_routes_with_linkdown = 1

Za ich sprawą, kernel będzie ignorował trasy interfejsów, przez które nie można nawiązać połączenia. Zapisujemy plik i restartujemy komputer.

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.