W systemie Linux, która metryka ma trasę bez metryki?

11

Jeśli masz (w systemie Linux) te dwie trasy:

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

Spodziewałbym się, że użyje się pierwszego, ale tak nie jest: zamiast tego użyto drugiego.

Jeśli zmienię to na to:

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

Następnie działa zgodnie z oczekiwaniami. Wydaje się, że „brak metryki” to gorsza (wyższa) metryka niż dowolna liczba zamiast metryki 0.

Co się dzieje? Czy jest to specyficzne dla Linuksa, czy standard sieciowy?

Z góry dziękuję.

rsuarez
źródło

Odpowiedzi:

6

Czy jesteś pewien swojej pierwszej obserwacji? Co zatem pokazuje ip route showlub route -npokazuje? Czy wynik zmienia się, jeśli dodasz proto staticw pierwszym przypadku?

Znalazłem co najmniej dwa zasoby, które wyraźnie mówią, że 0jest to domyślna wartość w systemie Linux:

Na pewno potrzebny byłby haker jądra Linux, aby to rozwiązać.

Niezależnie od tego, co zostanie wybrane domyślne, jest wyraźnie specyficzne dla systemu operacyjnego. W tym artykule ( https://support.microsoft.com/en-us/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-outout ) pokazano na przykład, że system Windows wybiera domyślną metrykę na podstawie przepustowości łącza.

Patrick Mevzek
źródło
Zaznaczam twoją odpowiedź jako właściwą, ponieważ nie widziałem tego zachowania na moim komputerze. Obwiniam to za coś dziwnego, co dzieje się na komputerach z Ubuntu, przynajmniej w wersji, którą miałem w momencie pytania. Nie widziałem, aby działo się to w kilku innych urządzeniach z systemem Ubuntu LTS. Plik X (czy to odwołanie jest obecnie zbyt stare?). Dzięki za odpowiedź!
rsuarez
6

Ponieważ te trasy znajdują się w różnych podsieciach, tutaj jest więcej zaangażowanych niż tylko metryka. Jeśli ruch inicjujący odbywa się na przykład w podsieci 192.168.1.1 i w tabeli routingu znajduje się pasująca trasa inna niż domyślna, trasa ta zostanie dopasowana przez najdłuższe dopasowanie prefiksu, zanim metryka zostanie wzięta pod uwagę.

Zakładając, że trasa inna niż domyślna nie jest zgodna, wówczas brak metryki powinien być interpretowany przez jądro jako metryka 0, a zatem trasa o najwyższym priorytecie. Chociaż jest to uproszczony widok, ponieważ niektóre demony routingu później przetłumaczą tę domyślną metrykę na inną wartość, np. 1024. Oczekuję, że to właśnie dzieje się z tobą i twoją nienazwaną dystrybucją.

Jeśli ip routenie pokazuje żadnej metryki, możesz potwierdzić, że rzeczywiście jest to 0, używając starszej route -nkomendy z pakietu net-tools lub cat /proc/net/route. Jednak dane wyjściowe niekoniecznie muszą odpowiadać wewnętrznemu demonowi routingu, gdy napotka wartość metryczną 0.

Ponadto liczy się również sposób tworzenia trasy. ip routeużywa interfejsu API netlink, podczas gdy routeużywa ioctl. Kod tworzenia domyślnych metryk między tymi dwoma podejściami powoduje różne wartości metryk. Na przykład: utworzenie domyślnej trasy IPv6 przez ip routespowoduje uzyskanie wartości metryki 1024 na RHEL 7, podczas gdy utworzenie tej samej trasy przez routeda metrykę 1.

Od RedHat :

  • jeśli nic nie zostanie przekazane do polecenia route jako metryka trasy, wartość 1 zostanie użyta przez samo polecenie.
  • Jeśli nic nie zostanie przekazane do polecenia ip jako metryka trasy, atrybut w ogóle nie zostanie utworzony, a jądro przyjmie wartość 0, która później zostanie domyślnie przetłumaczona na 1024.
noobish
źródło