Počnite tamo gdje se poruka pojavljuje. Klijent se poveže, tunel se podigne, a zatim dnevnik javlja da je Linux naredba za dodavanje rute neuspješna uz File exists. Ništa u toj rečenici ne odnosi se na certifikat, ključ ili konfiguracijsku datoteku, iako riječi na to upućuju. Kernel opisuje svoju tablicu rutiranja, a prefiks koji ste tražili da se instalira već ima zapis.

Slijedite klijentov vlastiti redoslijed: što je tražio, što je tablica već sadržavala, ko je taj zapis tamo postavio i tek onda što promijeniti. Svaki korak uklanja jednog mogućeg vlasnika.

Što je klijent zapravo tražio

Prije neuspjeha klijent bilježi rutu koju namjerava dodati, obično kao odredište, mrežnu masku, gateway i ponekad metriku ili tablicu. Taj redak je zahtjev. Greška koja slijedi kernelov je odgovor na njega, i njih dvoje treba čitati jedan uz drugi.

journalctl -u openvpn-client@office -b --no-pager | grep -nE 'route|File exists'
openvpn --config /etc/openvpn/client/office.ovpn --verb 4 --log /tmp/ovpn.log

Nenulti izlazni status pomoćnika za rute manje je informativan od teksta ispod njega, jer različiti odgovori kernela daju nenulti status. Sačuvajte točnu poruku; razlika između postojećeg zapisa i nedostupnog gatewaya odlučuje koji od sljedećih odjeljaka vrijedi.

Čitajte postojeću rutu, ne samo adresu

Pretraga tablice za isti točkasti kvadriple nije dovoljna. Objekt rute identificiraju adresna obitelj, tablica, prefiks odredišta, metrika, protokol i izlazni uređaj, a zapisi koji dijele prefiks mogu legitimno koegzistirati kada se ti atributi razlikuju. Sudara se cijeli objekt, a ne tekst.

ip -4 route show table all | grep -F '10.40.'
ip -4 route show match 10.40.0.0/16
ip -4 route get 10.40.0.5

Posljednja naredba odgovara na drugo pitanje od prve dvije: ne što postoji, već koji bi zapis kernel sada odabrao za to odredište. Oba su pogleda korisna i dovoljno se često razilaze da ih vrijedi usporediti prije zaključka. Nesklad među njima zanimljiv je slučaj, a ne greška zaokruživanja.

Zabilježite prefiks, tablicu, metriku i uređaj pored neuspjelog zahtjeva. Ako postojeći zapis ima iste atribute i isti sljedeći hop, imate dupliciranu uputu, a ne problem s rutiranjem.

Četiri vlasnika koja prefiks može imati

Povezane rute dolaze iz dodijeljene adrese i sustav ih ponovno stvara kad god ta adresa postoji. DHCP klijent ili upravitelj veza instalira rute kao dio vlastitog životnog ciklusa. Drugi VPN klijent možda već nosi isti prefiks. A lokalni hook ili skripta može dodati onu za koju ništa drugo ne zna.

Svaki vlasnik zahtijeva drugačiju ispravku. Povezana ruta nije vaša za brisanje; uklanjanje može prekinuti lokalni pristup prije nego tunel bude upotrebljiv, a kernel će je vratiti. Rutu koju posjeduje upravitelj treba mijenjati kroz taj upravitelj, a ne ručnom ip route del koju sljedeće ponovno povezivanje poništava.

Zadržano sučelje olakšava istu zbrku. Kada tunel uređaj preživi ponovno povezivanje, rute koje je instalirao prilagođeni kod za postavljanje mogu i dalje postojati pri drugom pokretanju, pa skripta koja pretpostavlja čist početak ne uspijeva drugi put i radi prvi. Ili namjerno očistite zastarjeli zapis ili učinite kod za postavljanje idempotentnim.

block-local odgovara na drugo pitanje

Kada profil šalje sav promet kroz tunel, klijent mora odlučiti što se događa s lokalnom mrežom. Zastavica block-local mijenja tu odluku rutirajući lokalni LAN kroz tunel, uz zadržavanje dokumentirane iznimke za LAN gateway; to je izbor prometne politike s vidljivim posljedicama na dostupnost.

To ne objašnjava zašto je dodavanje rute vratilo grešku postojećeg zapisa, a prihvaćanje toga kao univerzalnog popravka skriva stvarni sukob iza promjene politike. Ako vaši lokalni resursi postanu nedostupni nakon izmjene profila, ova je zastavica jedna od prvih stvari koju treba provjeriti; ako dodavanje rute ne uspije, ona nije odgovor.

Tretirajte je kao odluku o tome koja odredišta ostaju lokalna, donesenu namjerno i zapisanu. To nije prekidač koji treba isprobati kad dnevnik izgleda alarmantno.

Zatvorite krug: uklonite duplikat na njegovu izvoru

Kada znate koji vlasnik drži zapis, uklonite dupliciranu uputu tamo gdje je definirana. To može biti redak route u profilu, push sa poslužitelja ili hook koji više ne treba izvršavati.

ip -4 route show match 10.40.0.0/16
ip -4 route get 10.40.0.5
journalctl -u openvpn-client@office -b --no-pager | tail -n 15

Zatim se ponovno povežite i potvrdite tri stvari: tunel se podigne, predviđeno odredište razriješi se na putanju koju ste željeli, i greška nestane bez nove koja se pojavljuje na njezinu mjestu. Čist dnevnik s pogrešno odabranom putanjom nije popravak.

Ako prefiks znači lokalni LAN s jedne strane i udaljenu mrežu s druge, problem je preklapanje adresa, a ne duplikat, i nikakvo brisanje neće učiniti oba značenja istinitima istodobno. Taj slučaj traži drugačiji plan za jednu od dvije mreže. Odlučite koja će strana biti prenumerirana prije nego dodirnete bilo koju.

Povezani članci