ip: adresy, trasy, interfejsy
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.
ip link — drzwi do budynku
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 linklo 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 linkenp1s0@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/24Jest 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 enp1s02: 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 0RX 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 enp1s02: 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 foreverCzytamy 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ówJedna 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 enp1s0enp1s0@if2 UP 192.168.50.10/24 192.168.50.11/24Usuwanie:
sudo ip addr del 192.168.50.11/24 dev enp1s0ip 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 r192.168.50.0/24 dev enp1s0 proto kernel scope link src 192.168.50.10Jedna 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.8ping: connect: Network is unreachableNie ma drogowskazu „wszystko inne”. Dodaję bramę:
sudo ip route add default via 192.168.50.20
ip rdefault via 192.168.50.20 dev enp1s0
192.168.50.0/24 dev enp1s0 proto kernel scope link src 192.168.50.10default 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.208.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
cacheDo 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 n192.168.50.10 dev enp1s0 lladdr 62:43:48:03:80:f6 REACHABLE
192.168.50.99 dev enp1s0 FAILEDREACHABLE 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 enp1s0enp1s0: 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) |
|---|---|
ifconfig | ip a, ip link |
ifconfig eth0 up | ip link set eth0 up |
route -n, netstat -rn | ip r |
arp -n | ip n |
netstat -i | ip -s link |
netstat -tulpn | ss -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
| Komenda | Flaga | Co robi |
|---|---|---|
ip link | set DEV up / down | włącza / wyłącza kartę |
ip link | -s (-s -h) | statystyki: odebrane, wysłane, błędy |
ip addr | add ADRES/MASKA dev DEV | dodaje adres (tymczasowo) |
ip addr | del ADRES/MASKA dev DEV | usuwa adres |
ip a | -br, -4, -6, -c, -j | skrót, tylko IPv4/IPv6, kolory, JSON |
ip route | add default via BRAMA | dodaje bramę |
ip route | replace / del | podmienia / usuwa trasę |
ip route | get ADRES | kędy pojedzie paczka do adresu |
ip neigh | flush all | czyści tablicę sąsiadów |
⚠ Typowy błąd
Pierwszy: dodajesz coś, co już jest.
sudo ip route add default via 192.168.50.1RTNETLINK 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 downI 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:
- Wypisz swoje karty sieciowe i sprawdź, która jest
UP, a która maLOWER_UP. - Dodaj do głównej karty drugi adres z tej samej sieci, którego nikt nie używa. Porównaj
ip -br aiifconfig(jeśli masz net-tools). - Sprawdź
ip r get 1.1.1.1iip r getadresu Twojej bramy. Czym się różnią? - Zrób ping do bramy i do adresu, którego w sieci nie ma, i pokaż tablicę sąsiadów.
- 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 FAILEDRóż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.