Salta al contenuto principale

ip: vedere e configurare la rete

Inviato da tuxsa il

Qual è il mio indirizzo? Da quale scheda esce il traffico? Qual è il router che uso per uscire su Internet? A tutte queste domande risponde ip, il comando con cui si osserva e si modifica la configurazione di rete di un sistema Linux.

Cos'è

ip fa parte del pacchetto iproute2 (già installato nelle distribuzioni più diffuse) e ha sostituito i vecchi ifconfig, route e arp, del pacchetto net-tools, che non sono più mantenuti e spesso non sono nemmeno installati. Funziona con una struttura a oggetti e azioni:

$ ip [opzioni] OGGETTO [azione]

Gli oggetti più usati sono link (le interfacce di rete, a livello fisico), address (gli indirizzi IP), route (le rotte, cioè dove inviare i pacchetti) e neigh (i vicini sulla rete locale, la tabella ARP). Ogni oggetto ha un'abbreviazione: ip a è ip address, ip r è ip route, ip l è ip link, ip n è ip neigh. L'azione predefinita è show, quindi ip a equivale a ip address show.

Cosa fa

Mostra lo stato delle interfacce, degli indirizzi, delle rotte e dei vicini, e permette di modificarli: assegnare o togliere un indirizzo, accendere o spegnere una scheda, aggiungere una rotta. Attenzione: le modifiche fatte con ip sono temporanee, valgono fino al riavvio. Per renderle permanenti si usa lo strumento di configurazione della distribuzione (netplan su Ubuntu, NetworkManager sui desktop, systemd-networkd, /etc/network/interfaces su Debian), ma per capire cosa succede si parte sempre da ip.

Come si usa

Gli indirizzi negli esempi appartengono agli intervalli riservati alla documentazione e alle reti private (192.168.1.x, 10.0.0.x, 203.0.113.x); i nomi delle interfacce (enp3s0, wlp2s0) dipendono dal computer.

Esempio 1: gli indirizzi del computer

$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 3c:52:82:aa:bb:cc brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.25/24 brd 192.168.1.255 scope global dynamic noprefixroute enp3s0
       valid_lft 85234sec preferred_lft 85234sec
    inet6 fe80::3e52:82ff:feaa:bbcc/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

Ogni blocco numerato è un'interfaccia. Qui ce ne sono due: lo (loopback, la rete interna del computer, sempre 127.0.0.1) e enp3s0 (la scheda Ethernet). Le informazioni da leggere:

  • state UP: l'interfaccia è accesa e (con LOWER_UP) il cavo è collegato;
  • link/ether: l'indirizzo MAC, l'identificativo fisico della scheda;
  • inet 192.168.1.25/24: l'indirizzo IPv4 con la lunghezza della rete (/24 equivale alla maschera 255.255.255.0);
  • scope global: l'indirizzo è usabile verso l'esterno; dynamic indica che è stato assegnato dal DHCP (con scadenza in valid_lft);
  • inet6 fe80::…: l'indirizzo IPv6 locale al collegamento, presente su ogni interfaccia.

Esempio 2: l'output breve e leggibile con -br e -c

$ ip -br address
lo               UNKNOWN        127.0.0.1/8 ::1/128
enp3s0           UP             192.168.1.25/24 fe80::3e52:82ff:feaa:bbcc/64
wlp2s0           DOWN
$ ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
enp3s0           UP             3c:52:82:aa:bb:cc <BROADCAST,MULTICAST,UP,LOWER_UP>
wlp2s0           DOWN           8c:a9:82:11:22:33 <BROADCAST,MULTICAST>
$ ip -c a

Con -br (brief) l'output diventa una tabella di una riga per interfaccia: il modo migliore per un primo sguardo. Con -c (color) si colora l'output, e le due opzioni si combinano (ip -br -c a). Una scheda DOWN senza indirizzo, come wlp2s0 qui, è spenta o non collegata.

Esempio 3: guardare una sola interfaccia, o solo IPv4

$ ip address show dev enp3s0
$ ip -4 address
$ ip -6 address
$ ip -4 -br a show enp3s0
enp3s0           UP             192.168.1.25/24

Con show dev nome (o semplicemente il nome) si limita l'elenco a un'interfaccia; con -4 e -6 si scelgono solo gli indirizzi IPv4 o IPv6. Per estrarre l'indirizzo in uno script si può combinare con altri comandi (vedi l'esempio 11).

Esempio 4: la tabella delle rotte e il gateway

$ ip route
default via 192.168.1.1 dev enp3s0 proto dhcp src 192.168.1.25 metric 100
192.168.1.0/24 dev enp3s0 proto kernel scope link src 192.168.1.25 metric 100
$ ip route show default
default via 192.168.1.1 dev enp3s0 proto dhcp src 192.168.1.25 metric 100

La riga default via 192.168.1.1 dice che tutto il traffico che non appartiene alla rete locale va inviato al router 192.168.1.1 (il gateway predefinito), attraverso enp3s0. La seconda riga è la rete locale stessa (192.168.1.0/24), raggiungibile direttamente. Se manca la riga default, il computer non sa come uscire dalla rete locale: è una delle prime cose da controllare quando "non va Internet" ma la rete locale sì (si può verificare con ping al gateway).

Esempio 5: da dove uscirebbe un pacchetto?

$ ip route get 8.8.8.8
8.8.8.8 via 192.168.1.1 dev enp3s0 src 192.168.1.25 uid 1000
    cache
$ ip route get 192.168.1.40
192.168.1.40 dev enp3s0 src 192.168.1.25 uid 1000
    cache

ip route get indirizzo chiede al sistema quale rotta userebbe per raggiungere una destinazione, e con quale indirizzo sorgente. È molto utile con più interfacce o con una VPN: mostra a colpo d'occhio se il traffico passa dal gateway (via) o direttamente dalla rete locale. L'indirizzo 8.8.8.8 è quello di un DNS pubblico, usato come esempio.

Esempio 6: i vicini sulla rete locale (tabella ARP)

$ ip neigh
192.168.1.1 dev enp3s0 lladdr 94:83:c4:00:11:22 REACHABLE
192.168.1.40 dev enp3s0 lladdr b8:27:eb:33:44:55 STALE
192.168.1.77 dev enp3s0  FAILED
$ ip neigh show dev enp3s0

ip neigh mostra gli indirizzi MAC dei computer con cui il tuo ha comunicato di recente sulla rete locale (ARP per IPv4, NDP per IPv6). Gli stati più comuni: REACHABLE (raggiunto da poco), STALE (vecchio, da riverificare), FAILED (nessuna risposta: il dispositivo è spento, assente o non ti risponde). È utile per scoprire chi c'è sulla rete e per individuare conflitti di indirizzo; si vedono solo i computer con cui hai già parlato, non l'intera rete.

Esempio 7: accendere e spegnere un'interfaccia

$ sudo ip link set wlp2s0 up
$ sudo ip link set wlp2s0 down
$ ip link show wlp2s0
3: wlp2s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 8c:a9:82:11:22:33 brd ff:ff:ff:ff:ff:ff

Con ip link set nome up o down si accende o si spegne una scheda. La modifica richiede sudo. Spegnere la scheda con cui sei collegato in remoto significa perdere la connessione (vedi più avanti). Sui computer con NetworkManager conviene usare i suoi strumenti (nmcli, o l'applet di rete), che altrimenti possono annullare le tue modifiche.

Esempio 8: assegnare e togliere un indirizzo

$ sudo ip address add 192.168.1.50/24 dev enp3s0
$ ip -br a show enp3s0
enp3s0           UP             192.168.1.25/24 192.168.1.50/24 fe80::3e52:82ff:feaa:bbcc/64
$ sudo ip address del 192.168.1.50/24 dev enp3s0

Con ip address add si aggiunge un indirizzo a un'interfaccia (che può averne più di uno) e con del lo si toglie, indicando indirizzo e lunghezza della rete esattamente come sono. Serve per prove e interventi di emergenza, per esempio per assegnare un secondo indirizzo a una scheda. La modifica si perde al riavvio.

Esempio 9: aggiungere e togliere una rotta

$ sudo ip route add 10.10.0.0/16 via 192.168.1.254
$ ip route
default via 192.168.1.1 dev enp3s0 proto dhcp src 192.168.1.25 metric 100
10.10.0.0/16 via 192.168.1.254 dev enp3s0
192.168.1.0/24 dev enp3s0 proto kernel scope link src 192.168.1.25 metric 100
$ sudo ip route del 10.10.0.0/16
$ sudo ip route replace default via 192.168.1.1 dev enp3s0

Con ip route add rete via gateway si dice che il traffico verso una certa rete (10.10.0.0/16) passa da un router specifico. del la toglie e replace aggiunge una rotta o sostituisce quella esistente, utile con la rotta predefinita. Si usa, per esempio, per raggiungere una rete aziendale o di laboratorio passando da un router diverso da quello di casa.

Esempio 10: le statistiche dell'interfaccia

$ ip -s link show enp3s0
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 3c:52:82:aa:bb:cc brd ff:ff:ff:ff:ff:ff
    RX:  bytes packets errors dropped  missed   mcast
    2845031923 3124551      0       0       0   12803
    TX:  bytes packets errors dropped carrier collsns
     412884733 1873244      0       0       0       0

Con -s (statistics) si vedono i contatori di dati ricevuti (RX) e trasmessi (TX): byte, pacchetti ed errori. Contatori di errori (errors, dropped) che crescono nel tempo sono il segnale di un problema fisico, come un cavo difettoso, o di un'interfaccia sovraccarica.

Esempio 11: negli script, e con altri comandi

$ ip -4 -o addr show scope global | awk '{print $2, $4}'
enp3s0 192.168.1.25/24
$ ip -4 -br a show enp3s0 | tr -s ' ' | cut -d' ' -f3 | cut -d/ -f1
192.168.1.25
$ ip route show default | cut -d' ' -f3
192.168.1.1
$ ip -j address show enp3s0 | jq -r '.[0].addr_info[] | select(.family=="inet") | .local'
192.168.1.25

Con -o (oneline) ogni voce occupa una sola riga, comoda per grep, awk, cut e tr. Con -j (json) l'output è in formato JSON, adatto a jq e molto più robusto dell'analisi del testo. Un'alternativa breve per ottenere gli indirizzi locali è hostname -I.

Un piccolo controllo di rete a più livelli, come primo passo di diagnosi:

#!/bin/bash
GW=$(ip route show default | awk '{print $3; exit}')

if [ -z "$GW" ]; then
    echo "Nessun gateway predefinito: la rete non è configurata" >&2
    exit 1
fi

ping -c 1 -W 2 "$GW" > /dev/null && echo "Gateway $GW raggiungibile" || echo "Gateway $GW NON raggiungibile"
ping -c 1 -W 2 8.8.8.8 > /dev/null && echo "Internet raggiungibile (per indirizzo)" || echo "Internet NON raggiungibile"
ping -c 1 -W 2 example.org > /dev/null && echo "DNS funzionante" || echo "Il DNS non risolve i nomi"

Il controllo procede dal vicino al lontano: prima il gateway, poi Internet per indirizzo (che esclude il DNS), poi un nome (che lo verifica). Quando uno di questi passaggi fallisce, si sa già a che livello cercare il guasto.

Esempio 12: altri oggetti utili

$ ip -br addr show type bridge
$ ip -d link show docker0
$ ip monitor address
$ ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
$ ip netns list

Qualche altro oggetto, per chi gestisce server e container: ip monitor mostra in tempo reale le modifiche a indirizzi, rotte e interfacce (si esce con Ctrl+C); ip rule mostra le regole di instradamento avanzato (policy routing); ip netns gestisce gli spazi di rete isolati; con -d (details) si vedono i dettagli di bridge, VLAN, tunnel e interfacce virtuali, come quelle di Docker.

Opzioni utili

  • -br (-brief): tabella compatta; -c (-color): output colorato; -o (-oneline): una riga per voce.
  • -4 / -6: solo IPv4 / solo IPv6.
  • -s: statistiche (con -s -s più dettagli sugli errori); -d: dettagli.
  • -j (-json), con -p per la formattazione leggibile: output JSON.
  • address / a: indirizzi; link / l: interfacce; route / r: rotte; neigh / n: vicini (ARP/NDP).
  • show, add, del (o delete), replace, set, flush, get: le azioni principali.
  • ip route get destinazione: la rotta che verrebbe usata.
  • ip monitor: segue le modifiche di rete in tempo reale.

Attenzione a

  • Le modifiche sono temporanee: indirizzi e rotte aggiunti con ip spariscono al riavvio (e talvolta già al riavvio del servizio di rete). Per renderli permanenti si configura netplan, NetworkManager o il file di rete della distribuzione.
  • Non tagliare il ramo su cui sei seduto: se sei collegato via SSH, spegnere l'interfaccia (ip link set ... down), togliere l'indirizzo con cui sei collegato o cambiare la rotta predefinita interrompe la sessione, senza possibilità di rimediare da remoto. Sui server remoti prova le modifiche solo con l'accesso a una console alternativa, o sul posto.
  • flush è radicale: ip address flush dev enp3s0 toglie tutti gli indirizzi dell'interfaccia e ip route flush svuota le rotte, senza chiedere conferma.
  • Con NetworkManager o systemd-networkd attivi, le modifiche manuali possono essere annullate dal servizio quando rinnova la configurazione (per esempio, alla scadenza del DHCP). Per le prove va bene, per l'uso stabile no.
  • Indicare sempre l'interfaccia: nei comandi add e del specifica dev nome; e nella cancellazione indirizzo e lunghezza devono coincidere (192.168.1.50/24, non solo 192.168.1.50).
  • Doppi indirizzi e conflitti: assegnare un indirizzo già usato da un altro dispositivo della rete causa interruzioni intermittenti, difficili da diagnosticare. Prima di assegnare un indirizzo a mano, controlla che sia libero e fuori dall'intervallo del DHCP del router.
  • "Indirizzo IP" privato e pubblico non sono la stessa cosa: 192.168.x.x, 10.x.x.x e 172.16-31.x.x sono indirizzi privati, validi solo nella rete locale. L'indirizzo con cui sei visto su Internet è quello del router, e si può scoprire con un servizio esterno (per esempio con curl).
  • Non riconoscere i nomi delle interfacce: sui sistemi moderni si chiamano enp3s0, wlp2s0, eno1 e simili (nomi "prevedibili" basati sull'hardware), non più eth0 e wlan0. Il nome si legge con ip -br link.
  • I vecchi comandi: ifconfig, route e arp sono considerati obsoleti e può darsi che non siano installati. Le corrispondenze: ifconfig → ip address / ip link, route -n → ip route, arp -a → ip neigh. Le guide vecchie e i tutorial li usano ancora.
  • Indirizzi IPv6 fe80::: sono validi solo sul collegamento locale, quindi per usarli con altri comandi bisogna indicare anche l'interfaccia, per esempio ping fe80::1%enp3s0.
  • Molte interfacce nei sistemi con container: con Docker, KVM o VPN, ip a mostra anche docker0, br-..., veth... e tun0. Sono interfacce virtuali: non vanno toccate per errore.
  • Un indirizzo non dice se la rete funziona: avere un indirizzo e un gateway non garantisce che il router risponda. La verifica si fa con ping (prima il gateway, poi un indirizzo esterno, poi un nome) e con ip neigh.

Riepilogo

ComandoCosa fa
ip -br aInterfacce e indirizzi in forma compatta
ip address show dev nomeDettagli di una sola interfaccia
ip -4 a / ip -6 aSolo IPv4 / solo IPv6
ip -br linkStato e indirizzo MAC delle interfacce
ip routeTabella delle rotte
ip route show defaultGateway predefinito
ip route get indirizzoRotta e interfaccia usate per una destinazione
ip neighVicini sulla rete locale (ARP/NDP)
ip -s link show nomeStatistiche di traffico ed errori
sudo ip link set nome up / downAccende / spegne un'interfaccia
sudo ip address add IP/24 dev nomeAggiunge un indirizzo (temporaneo)
sudo ip address del IP/24 dev nomeToglie un indirizzo
sudo ip route add rete via gatewayAggiunge una rotta (temporanea)
ip -j aOutput JSON per gli script
ip monitorSegue le modifiche di rete in tempo reale