Przejdź do treści
Lekcja 69 z 117

Kurs › Moduł 8 › Lekcja 69

ip: adresy, trasy, interfejsy

⏱ ok. 9 min czytania· moduł 8: Sieć

Po tej lekcji: kursant używa komendy ip do oglądania i tymczasowej zmiany kart sieciowych, adresów, tras i tablicy sąsiadów, i wie, czemu ifconfig i netstat to przeszłość.

Wstęp

Znajdujesz w internecie poradnik. Pierwsza komenda: ifconfig. Wpisujesz na świeżym serwerze i dostajesz command not found. Doinstalowujesz, działa, ale pokazuje jeden adres, choć serwer ma dwa. Kolega przysięga, że dwa skonfigurował. Który z was kłamie? Żaden. Kłamie ifconfig.

Dziś poznasz narzędzie, które go zastąpiło. Jedna komenda ip, cztery podkomendy: link, addr, route, neigh. Drzwi, adres, drogowskazy, sąsiedzi.

Moje laboratorium

Nie będę wyłączał karty sieciowej komputera, na którym pracuję. Zbudowałem dwie wirtualne maszyny w miniaturze, serwer i klient, połączone wirtualnym kablem. Wszystkie wyniki w tej lekcji są z nich.

U Ciebie na VM karta będzie się nazywać podobnie: enp1s0, enp0s3, ens18 albo eth0. Te dziwne nazwy to tzw. przewidywalne nazwy. en to ethernet, p1s0 to miejsce na płycie głównej. Brzydkie jak numer seryjny lodówki, ale po restarcie się nie zamieniają, a dawniej eth0 i eth1 potrafiły zamienić się miejscami.

Karta sieciowa, po fachowemu interfejs, to drzwi, przez które budynek rozmawia ze światem. ip link pokazuje drzwi i to, czy są otwarte. Bez adresów.

ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
enp1s0@if2       DOWN           62:43:48:03:80:f6 <BROADCAST,MULTICAST>

lo to loopback, drzwi, które prowadzą z powrotem do tego samego budynku. Tamtędy idzie 127.0.0.1. enp1s0 to prawdziwa karta, na razie DOWN. Ten ciąg z dwukropkami to adres MAC, numer seryjny karty.

Otwieram drzwi:

sudo ip link set enp1s0 up
ip -br link
enp1s0@if2       DOWN           62:43:48:03:80:f6 <NO-CARRIER,BROADCAST,MULTICAST,UP>

Zobacz: w nawiasie jest UP, a stan dalej DOWN. I nowe słowo: NO-CARRIER. Drzwi otworzyłem, ale za nimi nie ma schodów. Brak nośnej, czyli kabel niepodłączony albo druga strona wyłączona. To jest pierwsza rzecz, jaką sprawdzasz przy „nie działa internet”. Zanim zaczniesz grzebać w DNS, zobacz, czy kabel jest w gniazdku.

Włączam drugą stronę kabla, po stronie klienta, i patrzę jeszcze raz:

enp1s0@if2       UP             192.168.50.10/24

Jest UP, w pełnym opisie pojawi się LOWER_UP, czyli kabel żyje.

Statystyki karty, czyli ile przeszło i ile się zgubiło:

ip -s link show enp1s0
2: enp1s0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP ...
    link/ether 62:43:48:03:80:f6 brd ff:ff:ff:ff:ff:ff link-netns klient
    RX:  bytes packets errors dropped  missed   mcast
           336       4      0       0       0       0
    TX:  bytes packets errors dropped carrier collsns
           336       4      0       0       0       0

RX to odebrane, TX to wysłane. Jeśli errors rośnie z minuty na minutę, podejrzewaj kabel albo port w przełączniku. mtu 1500 to maksymalny rozmiar paczki, jaki przejdzie przez te drzwi. Dodaj -h, a bajty będą w megabajtach.

ip addr — tabliczka z adresem na drzwiach

ip addr, w skrócie ip a, pokazuje adresy. Dodaję adres serwerowi:

sudo ip addr add 192.168.50.10/24 dev enp1s0
ip a show enp1s0
2: enp1s0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 62:43:48:03:80:f6 brd ff:ff:ff:ff:ff:ff link-netns klient
    inet 192.168.50.10/24 scope global enp1s0
       valid_lft forever preferred_lft forever

Czytamy od góry: numer i nazwa karty, flagi, MTU, stan. Potem link/ether, czyli MAC. Potem inet, adres IPv4 z maską. Adres IPv6 byłby w linijce inet6. scope global znaczy „ten adres jest ważny dalej niż na tym komputerze”. valid_lft forever to czas życia adresu. Przy adresie z DHCP zobaczysz tu sekundy do końca dzierżawy z lekcji 68.

Na co dzień wystarczą skróty:

ip -br a        # jedna linijka na kartę
ip -4 a         # tylko IPv4
ip -c a         # w kolorach
ip -j a         # w formacie JSON, dla skryptów

Jedna karta może mieć kilka adresów. Jak budynek z dwoma numerami, bo stoi na rogu dwóch ulic:

sudo ip addr add 192.168.50.11/24 dev enp1s0
ip -br a show enp1s0
enp1s0@if2       UP             192.168.50.10/24 192.168.50.11/24

Usuwanie:

sudo ip addr del 192.168.50.11/24 dev enp1s0

ip route — drogowskazy

Tablica tras, po angielsku routing table, to zbiór drogowskazów na skrzyżowaniu: „do tej sieci w lewo, do tamtej w prawo, wszystko inne prosto”. ip route, w skrócie ip r:

ip r
192.168.50.0/24 dev enp1s0 proto kernel scope link src 192.168.50.10

Jedna trasa. Powstała sama, kiedy dodałem adres: „wszystko z 192.168.50.0/24 wysyłaj prosto przez enp1s0”. proto kernel znaczy, że dopisało ją jądro. A jeśli chcę do internetu?

ping -c1 8.8.8.8
ping: connect: Network is unreachable

Nie ma drogowskazu „wszystko inne”. Dodaję bramę:

sudo ip route add default via 192.168.50.20
ip r
default via 192.168.50.20 dev enp1s0
192.168.50.0/24 dev enp1s0 proto kernel scope link src 192.168.50.10

default to drogowskaz „wszystko inne”. Najlepsza komenda do rozkminiania tras to ip route get. Pytasz: „kędy pojedzie paczka do tego adresu?”:

ip r get 8.8.8.8
ip r get 192.168.50.20
8.8.8.8 via 192.168.50.20 dev enp1s0 src 192.168.50.10 uid 0
    cache
192.168.50.20 dev enp1s0 src 192.168.50.10 uid 0
    cache

Do 8.8.8.8 przez bramę (via). Do 192.168.50.20 prosto, bez bramy, bo to sąsiad z tej samej ulicy. Jak na serwerze są trzy karty i nie wiesz, którędy wychodzi ruch, ip r get odpowiada w sekundę. Bez rysowania schematów na serwetce.

Zmiana bramy na inną to ip route replace default via NOWY_ADRES. Usunięcie: ip route del default.

ip neigh — sąsiedzi z tej samej klatki

Pamiętasz z lekcji 68, że przed wysłaniem paczki komputer musi poznać adres MAC odbiorcy? Wyniki tych pytań trzyma w tablicy sąsiadów. Taki zeszyt na portierni: kto mieszka pod którym numerem.

ping -c1 192.168.50.10
ping -c1 -W1 192.168.50.99
ip n
192.168.50.10 dev enp1s0 lladdr 62:43:48:03:80:f6 REACHABLE
192.168.50.99 dev enp1s0 FAILED

REACHABLE to sąsiad, który niedawno odpowiedział. STALE to wpis trochę przeterminowany, sprawdzi się przy następnej okazji. FAILED znaczy: pytałem całą ulicę, nikt się nie przyznał do tego adresu. Pod 192.168.50.99 nikt nie mieszka. Jeśli tak wygląda wpis Twojej bramy, problem jest w kablu, przełączniku albo w samej bramie, a nie w DNS.

Wyczyszczenie zeszytu: sudo ip n flush all. Przydaje się, kiedy ktoś wymienił serwer, adres został ten sam, a MAC się zmienił.

Czemu ifconfig i netstat to przeszłość

ifconfig, route, arp i netstat pochodzą z pakietu net-tools. To narzędzia uznane za przestarzałe, zastąpione przez iproute2, czyli ip i ss. Na nowych instalacjach Ubuntu i RHEL często ich w ogóle nie ma. A jeśli są, potrafią nie pokazać wszystkiego. Pamiętasz nasz drugi adres? Dodaję go jeszcze raz i pytam starym narzędziem:

sudo ip addr add 192.168.50.11/24 dev enp1s0
ifconfig enp1s0
enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.50.10  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 62:43:48:03:80:f6  txqueuelen 1000  (Ethernet)

Jeden adres. Drugi, 192.168.50.11, dla ifconfiga nie istnieje. To jest kłamstwo z haka. ifconfig zna świat sprzed epoki, w której karta miała wiele adresów bez dodatkowych etykiet. Jak stary listonosz, który nie przyjmuje do wiadomości, że budynek na rogu ma dwa numery.

Tłumaczenie ze starego na nowe:

Stare (net-tools)Nowe (iproute2)
ifconfigip a, ip link
ifconfig eth0 upip link set eth0 up
route -n, netstat -rnip r
arp -nip n
netstat -iip -s link
netstat -tulpnss -tulpn

Na egzaminie, w dokumentacji Red Hata i w porządnych skryptach używaj ip i ss. ifconfig wolno Ci rozpoznać w starym tutorialu. Jak łacinę na nagrobku.

Jak to działa pod spodem

Komenda ip niczego sama nie przechowuje. Wszystko, co widzisz, żyje w jądrze: karty, adresy, trasy, sąsiedzi. ip rozmawia z jądrem przez specjalny kanał o nazwie netlink. Dlatego błędy wyglądają tak dziwnie, np. RTNETLINK answers: Network is unreachable. To dosłownie „jądro odpowiedziało przez netlink: nie znam drogi”.

Stary ifconfig używał starszego interfejsu, wywołań ioctl, który nie umie opisać wszystkiego, co potrafi współczesne jądro. Stąd zgubiony drugi adres.

I najważniejsze zdanie tej lekcji: wszystko, co zrobiłeś dziś przez ip, jest tymczasowe. Zmieniasz to, co jądro trzyma w pamięci. Restart i po zmianach. Jak napisy kredą na tablicy, którą sprzątaczka myje co noc. Na stałe konfiguruje się to inaczej, w następnej lekcji.

Ściąga flag

KomendaFlagaCo robi
ip linkset DEV up / downwłącza / wyłącza kartę
ip link-s (-s -h)statystyki: odebrane, wysłane, błędy
ip addradd ADRES/MASKA dev DEVdodaje adres (tymczasowo)
ip addrdel ADRES/MASKA dev DEVusuwa adres
ip a-br, -4, -6, -c, -jskrót, tylko IPv4/IPv6, kolory, JSON
ip routeadd default via BRAMAdodaje bramę
ip routereplace / delpodmienia / usuwa trasę
ip routeget ADRESkędy pojedzie paczka do adresu
ip neighflush allczyści tablicę sąsiadów

⚠ Typowy błąd

Pierwszy: dodajesz coś, co już jest.

sudo ip route add default via 192.168.50.1
RTNETLINK answers: File exists

„File exists” przy trasie brzmi absurdalnie, ale to tylko znaczy: brama już jest. Jedna trasa domyślna wystarczy. Chcesz ją zmienić? ip route replace. Podobnie przy adresie: Error: ipv4: Address already assigned.

Drugi błąd jest groźniejszy. Pracujesz na serwerze przez SSH i wpisujesz:

sudo ip link set enp1s0 down

I tyle Cię widzieli. Zamknąłeś drzwi, przez które rozmawiałeś z serwerem. Piłujesz gałąź, na której siedzisz, i to od strony pnia. Terminal zamarza, a serwer stoi w serwerowni w innym mieście. Ratunek to konsola awaryjna od dostawcy albo spacer z kluczami.

Zasada: kartę, przez którą jesteś podłączony, ruszasz tylko na maszynie wirtualnej albo mając dostęp do konsoli. Pocieszenie: zmiany przez ip są tymczasowe, więc restart z konsoli zwykle wszystko przywraca.

✎ Zadanie

Na maszynie wirtualnej, w konsoli, nie przez SSH:

  1. Wypisz swoje karty sieciowe i sprawdź, która jest UP, a która ma LOWER_UP.
  2. Dodaj do głównej karty drugi adres z tej samej sieci, którego nikt nie używa. Porównaj ip -br a i ifconfig (jeśli masz net-tools).
  3. Sprawdź ip r get 1.1.1.1 i ip r get adresu Twojej bramy. Czym się różnią?
  4. Zrób ping do bramy i do adresu, którego w sieci nie ma, i pokaż tablicę sąsiadów.
  5. Zrestartuj maszynę i sprawdź, czy drugi adres przetrwał.
Pokaż rozwiązanie
ip -br link                                    # 1. kto UP, kto LOWER_UP
sudo ip addr add 192.168.50.11/24 dev enp1s0    # 2. drugi adres
ip -br a show enp1s0
ip r get 1.1.1.1                                # 3.
ip r get 192.168.50.20                          # adres mojej bramy
ping -c1 192.168.50.20; ping -c1 -W1 192.168.50.99
ip n                                            # 4.

U mnie w laboratorium wyglądało to tak:

enp1s0@if2       UP             192.168.50.10/24 192.168.50.11/24
1.1.1.1 via 192.168.50.20 dev enp1s0 src 192.168.50.10 uid 1000
192.168.50.20 dev enp1s0 src 192.168.50.10 uid 1000
192.168.50.20 dev enp1s0 lladdr 02:2a:d2:98:da:0a REACHABLE
192.168.50.99 dev enp1s0 FAILED

Różnica w punkcie 3: do dalekiego adresu jest słowo via, czyli „przez bramę”. Do samej bramy go nie ma, bo brama stoi na Twojej ulicy. Gdyby było via przy adresie bramy, miałbyś ciekawy problem filozoficzny.

Punkt 5: po restarcie drugiego adresu nie ma. Kreda zmyta. Dziś zapisujemy to długopisem.

Co dalej

Punkt piąty już znasz: nie przetrwa. W następnej lekcji robimy to na stałe. Netplan na Ubuntu, NetworkManager i nmcli na RHEL, stały adres serwera, nazwa komputera i plik /etc/hosts. I komenda, która sama cofa zmianę, jeśli odcięłeś sobie dostęp.