OpenVPN-ova poruka "File exists" na ruti nije problem s datotekom
Poruka dolazi iz kernelove tablice ruta, ne iz datotečnog sustava. Pročitajte zapis koji već posjeduje prefiks prije nego promijenite LAN politiku.
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 porodica, 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 uporediti prije zaključka. Nesklad među njima je zanimljiv 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 instrukciju, 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 menadžer 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 menadžer treba mijenjati kroz taj menadžer, a ne ručnom ip route del koju sljedeće ponovno povezivanje poništava.
Zadržani interfejs 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 šta se događa s lokalnom mrežom. Zastavica block-local mijenja tu odluku rutirajući lokalni LAN kroz tunel, uz zadržavanje dokumentovanog izuzetka 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 prihvatanje 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 instrukciju tamo gdje je definirana. To može biti redak route u profilu, push sa servera 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 ponovo 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 njenom mjestu. Čist dnevnik s pogrešno odabranom putanjom nije popravka.
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 istinitim istovremeno. Taj slučaj traži drugačiji plan za jednu od dvije mreže. Odlučite koja će strana biti prenumerisana prije nego dodirnete bilo koju.