Instrumentele de nivel înalt, cum ar fi NetworkManager, elimină de obicei adresa și ruta pe link-urile „linkdown” (adică: cu indicatorul NO-CARRIER afișat pe interfață). Deci, dacă interfața este gestionată de un astfel de instrument, se poate aștepta ca ruta sa să apară și să dispară atunci când este conectată și deconectată.
Înțeleg că utilizarea NetworkManager ar putea fi prea intruzivă cu un protocol de rutare dinamic utilizat în același timp și, prin urmare, ar putea să nu fie cea mai bună idee.
Dar, de fapt, stiva de rutare a nucleului oferă deja o astfel de caracteristică, fără a fi nevoie să modifice nicio adresă sau rută: ignore_routes_with_linkdown.
Ca și alte câteva intrări, aceasta a apărut în kernel-ul 4.2 (deci disponibil în kernel-ul Debian 10 4.19) și a fost afișat apoi în kernelnewbies.org când a apărut, a fost documentat doar din kernel-ul 5.11:
ignore_routes_with_linkdown - BOOLEAN
Ignorați rutele a căror legătură este întreruptă atunci când efectuați o căutare FIB.
Deci, dacă interfața este apelată mgmt0
iar ruta pe care o oferă ar trebui utilizată numai atunci când este detectat un transportator pe ea, ar trebui pur și simplu să faceți:
sysctl -w net.ipv4.conf.mgmt0.ignore_routes_with_linkdown=1
sau pune asta /etc/sysctl.conf
.
Acum, când această interfață încă menținută administrativ este deconectată, intrarea rutei este afișată înapoi de ruta ip
ar arăta steagurile linkdown mort
în locul steagului unic linkdown
pentru a spune utilizatorului că într-adevăr această rută este în prezent ignorată în timpul unei căutări FIB.
Notă: pentru ca o interfață să detecteze o legătură, aceasta trebuie să fie pornită. Așa că trebuie să rămână la nivel administrativ. Dacă a fost dezactivat atunci când purtătorul este pierdut, nu ar putea fi reactivat automat mai târziu la detectarea operatorului, deoarece nu ar mai exista o astfel de detectare.
Exemplu complet:
link ip adăugați nume vethtest1 sus tip veth peer name vethtest1peer
link ip adăugați numele vethtest2 sus tip veth peer name vethtest2peer
set de legătură ip dev vethtest2peer up
adresa ip add 192.0.2.2/25 dev vethtest1
adresa ip add 192.0.2.3/24 dev vethtest2
Setarea adreselor instalează rutele LAN automate ale nucleului. vethtest1
a cărui interfață peer nu a fost afișată va avea statutul NO-CARRIER și rutele sale vor primi a linkdown
steag.
# afișează ruta ip la rădăcină 192.0.2.0/24
192.0.2.0/25 dev vethtest1 proto kernel scope link src 192.0.2.2 linkdown
192.0.2.0/24 dev vethtest2 proto kernel scope link src 192.0.2.3
Se va folosi o rută către 192.0.2.100 vethtest1
deoarece a primit un traseu mai îngust (în ciuda faptului că avea linkdown
steag).
# ip route obține 192.0.2.100
192.0.2.100 dev vethtest1 src 192.0.2.2 uid 0
cache
Apoi, cu noua setare:
sysctl -w net.ipv4.conf.vethtest1.ignore_routes_with_linkdown=1
apare noul comportament:
# afișează ruta ip la rădăcină 192.0.2.0/24
192.0.2.0/25 dev vethtest1 proto kernel scope link src 192.0.2.2 dead linkdown
192.0.2.0/24 dev vethtest2 proto kernel scope link src 192.0.2.3
# ip -4 netconf show dev vethtest1
inet vethtest1 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown on
# ip route obține 192.0.2.100
192.0.2.100 dev vethtest2 src 192.0.2.3 uid 0
cache
Acum, dacă interfața devine purtător (simulat aici prin afișarea interfeței egale):
set de legături ip dev vethtest1peer up
traseul este restabilit prin ea:
# afișează ruta ip la rădăcină 192.0.2.0/24
192.0.2.0/25 dev vethtest1 proto kernel scope link src 192.0.2.2
192.0.2.0/24 dev vethtest2 proto kernel scope link src 192.0.2.3
# ip route obține 192.0.2.100
192.0.2.100 dev vethtest1 src 192.0.2.2 uid 0
cache