Ali predpomnilnik poti VPN skriva vašo spremembo? Preverite tri stvari
Linux nima globalnega predpomnilnika poti za praznjenje. Zastarel test običajno pomeni zastarel socket, vnos NAT ali znova uporabljen profil. Tri preverjanja jih ločijo.
Praznjenje predpomnilnika poti je prvi instinkt, ko sprememba ne učinkuje, in na sodobnem Linuxu je to zapravljeno delo: globalni predpomnilnik poti IPv4 je bil odstranjen pred leti, zato ip route show cache ne izpiše ničesar in ni ničesar za počistiti. Stanje, ki vas zavaja, živi eno plast višje: v socketu, preslikavi NAT, resolverju ali omrežnem upravitelju, ki je znova uporabil stari profil. Tri vprašanja ločijo te primere: ali napačna pot prihaja iz novega toka ali stare povezave, ali vaša platforma sploh predpomni poti, in ali je stanje v usmerjanju ali nad njim. Odgovorite nanje, preden ponastavite vmesnik.
Prvo preverjanje: ali stara pot prihaja iz novega toka?
Vzpostavljena povezava obdrži pot, s katero je bila ustvarjena. Zato SSH seja skozi tunel preživi spremembo usmerjevalne tabele, medtem ko nova seja takoj prevzame novo pot, in zato »sprememba ni naredila ničesar« pogosto pomeni »stari socket jo še vedno drži«. Testirajte z novim procesom, ne z oknom, ki ga že imate odprtega.
ss -tnp | head
ip route get 1.1.1.1
curl -m 5 -sS -o /dev/null -w '%{remote_ip}
' https://example.com
Zadnji ukaz izpiše naslov, ki ga je nova povezava dejansko dosegla, in to je najcenejši način, da vidite resnično pot brez zaupanja v okno stanja. Primerjajte ga z izvornim naslovom, ki bi ga moral uporabiti namespace ali vmesnik.
Če nov tok ubere pravo pot, stari pa si ne opomore, nehajte gledati usmerjanje. Pot je bila prava; seja je bila stara.
Drugo preverjanje: ali vaša platforma sploh hrani predpomnilnik poti?
Na Linuxu je odgovor ne, v smislu, ki ga ima v mislih večina vodnikov. Globalnega predpomnilnika ciljev za zavreči ni, vnos na ravni socketa, ki hrani izbrano pot, pa se sprosti skupaj s socketom. Razdelek o predpomnilniku v priročniku ip-route opisuje zgodovinsko vedenje, ne česa, kar bi lahko izpraznili na trenutnem jedru.
Druge platforme se razlikujejo in prav tu gre kopiranje nasvetov narobe. Windows hrani predpomnilnik ciljev, ki ga lahko počistite z netsh interface ip delete destinationcache. BSD in macOS omogočata iskanja po cilju prek route -n get, njuni predpomnilniki pa potečejo po lastnem urniku. Ukaz, ki deluje na eni od njih, na Linuxu ne naredi prav ničesar, zato se ista popravka zdi neuspešna pri polovici ljudi, ki jo preizkusijo.
Tabela NAT ali conntrack ni predpomnilnik poti, čeprav povzroča enak simptom. Tok, ki je bil preveden pred vašo spremembo, obdrži svoj prevod, in conntrack -L ga bo prikazal še dolgo po tem, ko je usmerjevalna politika šla naprej. To je zastarelo stanje, a brisanje poti se ga ne bo dotaknilo.
Tretje preverjanje: ali je stanje v usmerjanju ali nad njim?
Preberite trenutno iskanje, preden preberete karkoli drugega: ip route get za cilj, nato isti ukaz z from in izvornim naslovom, nato ip rule show. Če se ti trije ujemajo s tem, kar ste nameravali, usmerjanje ni plast za popravljanje in zastarelo opažanje je prišlo od drugod.
Trije običajni osumljenci sedijo nad usmerjanjem. Omrežni upravitelj lahko znova namesti pot iz shranjenega profila sekunde po tem, ko jo izbrišete, zato se vaša sprememba zdi, kot da se vrača; preverite nmcli connection show --active in stanje enote, preden znova uredite tabelo. Predpomnilnik resolverja vrne star naslov, kar je videti kot odpoved usmerjanja, dokler isto ime ne vprašate z orodjem, ki obide predpomnilnik. Pul povezav aplikacije hrani delujoč socket do starega cilja in jedra nikoli ne prosi za novo odločitev.
Kaj vam trije odgovori omogočajo sklepati
Sestavite odgovore in popravilo se običajno izreče samo. Nov tok, ki ubere napačno pot na platformi brez predpomnilnika poti, pomeni, da je politika res napačna, zato preberite pravila in tabelo, ki jo je namestil tunel. Nov tok, ki ubere pravo pot, medtem ko stara seja obtiči, pomeni, da je problem v aplikaciji ali socketu. Pravilne poti z zlomljenim opažanjem v obeh primerih pomenijo, da je stanje nad usmerjanjem.
Uprite se splošnemu osveževanju. Ponovni zagon omrežnega sklada ali brisanje vsake poti na stroju, katerega privzeta pot je tunel, lahko prekine prav tisto povezavo, ki jo uporabljate za popravilo, in uniči dokaz, ki bi povedal, katera plast je odpovedala.
Če res morate kaj počistiti, počistite najmanjšo stvar, ki ustreza diagnozi: sockete enega procesa, en vnos conntrack, predpomnilnik resolverja. Nato ponovite isti test novega toka in zapišite, kaj se je spremenilo.
V svojih zapiskih imejte tri stanja ločena
Shranjena konfiguracija, trenutno iskanje in opaženi tok so tri različna dejstva, in njihovo zlivanje v »predpomnilnik« je tisto, kar oteži ponovitev napake. Zapišite profil ali enoto, ki ima v lasti pot, izhod ip route get ter izvor in cilj dejanske povezave.
Ob njih zapišite platformo in različico odjemalca, ker popravek, ki čisti predpomnilnik ciljev Windows, ni popravek, ki bi veljal za gostitelja Linux, in postopek, kopiran med obema, uči napačno lekcijo. Ko problem predate nekomu drugemu, mu te tri vrstice omogočijo, da ponovi stanje okvare, namesto da ugiba.