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 foreverOgni 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 (conLOWER_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 (/24equivale alla maschera255.255.255.0);scope global: l'indirizzo è usabile verso l'esterno;dynamicindica che è stato assegnato dal DHCP (con scadenza invalid_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 aCon -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/24Con 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 100La 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
cacheip 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 enp3s0ip 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:ffCon 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 enp3s0Con 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 enp3s0Con 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 0Con -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.25Con -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 listQualche 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 -spiù dettagli sugli errori);-d: dettagli.-j(-json), con-pper la formattazione leggibile: output JSON.address/a: indirizzi;link/l: interfacce;route/r: rotte;neigh/n: vicini (ARP/NDP).show,add,del(odelete),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
ipspariscono al riavvio (e talvolta già al riavvio del servizio di rete). Per renderli permanenti si configuranetplan,NetworkManagero 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 enp3s0toglie tutti gli indirizzi dell'interfaccia eip route flushsvuota le rotte, senza chiedere conferma.- Con
NetworkManagerosystemd-networkdattivi, 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
addedelspecificadev nome; e nella cancellazione indirizzo e lunghezza devono coincidere (192.168.1.50/24, non solo192.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.xe172.16-31.x.xsono 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 concurl). - Non riconoscere i nomi delle interfacce: sui sistemi moderni si chiamano
enp3s0,wlp2s0,eno1e simili (nomi "prevedibili" basati sull'hardware), non piùeth0ewlan0. Il nome si legge conip -br link. - I vecchi comandi:
ifconfig,routeearpsono 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 esempioping fe80::1%enp3s0. - Molte interfacce nei sistemi con container: con Docker, KVM o VPN,
ip amostra anchedocker0,br-...,veth...etun0. 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 conip neigh.
Riepilogo
| Comando | Cosa fa |
|---|---|
ip -br a | Interfacce e indirizzi in forma compatta |
ip address show dev nome | Dettagli di una sola interfaccia |
ip -4 a / ip -6 a | Solo IPv4 / solo IPv6 |
ip -br link | Stato e indirizzo MAC delle interfacce |
ip route | Tabella delle rotte |
ip route show default | Gateway predefinito |
ip route get indirizzo | Rotta e interfaccia usate per una destinazione |
ip neigh | Vicini sulla rete locale (ARP/NDP) |
ip -s link show nome | Statistiche di traffico ed errori |
sudo ip link set nome up / down | Accende / spegne un'interfaccia |
sudo ip address add IP/24 dev nome | Aggiunge un indirizzo (temporaneo) |
sudo ip address del IP/24 dev nome | Toglie un indirizzo |
sudo ip route add rete via gateway | Aggiunge una rotta (temporanea) |
ip -j a | Output JSON per gli script |
ip monitor | Segue le modifiche di rete in tempo reale |