In Linux, quale metrica ha un percorso senza metrica?


11

Se hai (in Linux) questi due percorsi:

default via 192.168.1.1 dev enp58s0f1
default via 192.168.16.1 dev wlp59s0  proto static  metric 600

Mi aspetto che venga usato il primo, ma non è così: il secondo invece viene usato.

Se lo cambio a questo:

default via 192.168.1.1 dev enp58s0f1  proto static  metric 100 
default via 192.168.16.1 dev wlp59s0  proto static  metric 600

Quindi funziona come previsto. Sembra che "nessuna metrica" ​​sia una metrica peggiore (maggiore) di qualsiasi numero, anziché la metrica 0.

Cosa sta succedendo? È specifico per Linux o uno standard di rete?

Grazie in anticipo.

Risposte:


6

Sei sicuro della tua prima osservazione? Cosa fa ip route showo route -nmostra allora? Il risultato cambia se si aggiunge proto staticnel primo caso?

Ho trovato almeno due risorse che dicono esplicitamente che 0è il valore predefinito in Linux:

  • http://0pointer.de/lennart/projects/ifmetric/ : la metrica predefinita per una route nel kernel Linux è 0, ovvero la priorità più alta.
  • http://www.man7.org/linux/man-pages/man8/route.8.html : se questa opzione non è specificata, la metrica per la famiglia di indirizzi inet6 (IPv6) è impostata su '1', per inet (IPv4) il valore predefinito è '0'. (suggerisce quindi che il valore predefinito potrebbe essere diverso durante l'utilizzo iproute2ma l'analisi di queste fonti non mostra di cosa si tratta)

Un hacker del kernel Linux sarebbe sicuramente necessario per risolverlo.

Inoltre, qualunque sia il valore predefinito scelto è chiaramente specifico del sistema operativo. Questo articolo ( https://support.microsoft.com/en-us/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-routes ) ad esempio mostra che Windows sceglie la metrica predefinita basato sulla larghezza di banda del collegamento.


Sto contrassegnando la tua risposta come quella giusta perché non ho visto di nuovo questo comportamento nel mio computer. Lo sto dando la colpa a qualcosa di strano che succede nei computer desktop con Ubuntu, almeno con la versione che avevo al momento della domanda. Non l'ho visto accadere in poche altre scatole con Ubuntu LTS. Quindi, un X-File (quel riferimento è troppo vecchio al giorno d'oggi?). Grazie per la tua risposta!
rsuarez,

6

Dal momento che questi percorsi si trovano su sottoreti diverse, qui è più coinvolto solo la metrica. Se il traffico di origine si trova nella sottorete 192.168.1.1, ad esempio, e esiste una route non predefinita corrispondente nella tabella di routing, tale route corrisponderà tramite la corrispondenza del prefisso più lunga prima che la metrica venga mai considerata.

Supponendo che una route non predefinita non corrisponda, quindi non avere una metrica dovrebbe essere interpretata dal kernel come se avesse una metrica pari a 0, e quindi la route con priorità più alta. Anche se questa è una visione semplicistica perché alcuni demoni di routing in seguito tradurranno quella metrica predefinita in un altro valore come 1024. Mi aspetto che questo sia ciò che sta accadendo a te e alla tua distribuzione senza nome.

Se ip routenon mostra alcuna metrica, puoi confermare che è effettivamente 0 usando il route -ncomando precedente dal pacchetto net-tools o cat /proc/net/route. Tuttavia, questo output non corrisponde necessariamente a ciò che il demone di routing utilizzerà internamente quando incontra un valore di metrica 0.

Inoltre, anche il modo in cui crei il percorso è importante. ip routeusa l'API netlink, mentre routeusa ioctl. Il codice per la modalità di creazione delle metriche predefinite tra i due approcci determina valori di metrica diversi. Ad esempio: la creazione di una route predefinita IPv6 tramite ip routecomporterà un valore di metrica di 1024 su RHEL 7, mentre la creazione della stessa route via routecomporterà una metrica di 1.

Da RedHat :

  • se non viene passato nulla al comando route come metrica route, il valore 1 viene utilizzato dal comando stesso.
  • Se non viene passato nulla al comando ip come metrica di instradamento, l'attributo non viene creato affatto e il kernel lo comprende come 0, che viene successivamente tradotto 1024 come predefinito.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.