Во еден миг лаптопот е на канцеларискиот Wi-Fi, во следниот е поврзан со телефон, а показателот на тунелот повторно е зелен пред да завршите со менување прозорци. Зелената светлина само известува дека тунелот повторно се поврзал; што правела политиката за рутирање и блокирање за време на празнината е друго прашање. Таа политика е збир услови за совпаѓање составени при последното инсталирање, и именува интерфејс, адреса и семејство адреси што преминот штотуку ги отстрани. Затоа истата промена дава три исходи што изгледаат исто: блокирањето продолжува, политиката го блокира сопственото закрепнување, или се отвора пат што ништо не го покрива.

Ништо на екранот не ги раздвојува тие три состојби, затоа прашајте на кои идентификатори биле прикачени правилата, наместо каква боја покажува показателот. На Linux правилото може да именува интерфејс или ipset наполнет од него; на Android на VpnService може да му се каже кои основни мрежи да ги следи преку setUnderlyingNetworks. Секое врзување покажува на врска што треба да биде заменета, и секое мора повторно да се оцени потоа.

Што всушност препишува преминот

Кога старата врска исчезнува, јадрото ги отстранува нејзините адреси, ги повлекува рутите што оделе низ неа и повторно го гради изборот на изворна адреса од она што останало. Стандардната рута се преместува на новата порта, а индексот на интерфејсот на кој укажуваа старите правила исчезнал или е рециклиран за друг уред. Резолверите по врска исто така се освежуваат, иако не во истиот миг како рутите. Сето ова се случува под VPN клиентот, така што клиент што го набљудува само сопствената состојба на тунелот не гледа ништо од тоа.

Проблемот е што правилото кодира конкретен идентификатор наместо намерата зад него. Правило што фрла сѐ што не излегува низ интерфејсот на тунелот кодира име на интерфејс; правило што го дозволува крајниот пункт кодира адреса што новата мрежа може да ја рутира на друго место. Кога идентификаторот исчезнува, правилото не станува видливо погрешно: или престанува да совпаѓа со ништо или почнува да совпаѓа со погрешното.

Повторно градење на надворешниот тунел без пробивање дупка

Надворешниот транспорт беше врзан за старата изворна адреса, затоа мора да отвори нова сокет од новата. Кога крајниот пункт е име на домаќин, а не буквална адреса, пребарувањето мора да успее додека блокирањето е сѐ уште на сила. Тоа е стапицата на редоследот: политика доволно строга за да фрли сѐ освен крајниот пункт ќе го фрли и пребарувањето потребно за да се најде, освен ако решавањето не се случи пред да се крене блокирањето или не се пренесе низ сѐ уште жив тунел. И двата редоследа можат да работат, но само ако клиентот знае во кој е.

Клиентите се разликуваат овде на начин што е важен при дијагностика. Некои прво решаваат, а потоа ги инсталираат правилата, така што преминот чини видлив прекин и потоа сам се опоравува; други го држат блокирањето и се потпираат на преживеаниот тунел да го пренесе пребарувањето, што целосно пропаѓа кога тунелот умрел со врската. Додавањето широка директна стандардна рута за враќање на поврзаноста секогаш го поминува тестот и секогаш го остава протекувањето што сте го спречувале.

Рута што сѐ уште покажува на старата порта го дава истото заглавено закрепнување од друга причина, затоа прочитајте ја табелата пред да го обвините клиентот. Командите подолу ги именуваат интерфејсот и изворната адреса што јадрото навистина би ги користело, и тоа во еден ред решава дали стариот пат е сѐ уште инсталиран.

ip route get 1.1.1.1
ip -6 route get 2606:4700:4700::1111

Кога новата врска носи IPv6, а правилата не

Мобилните и гостинските мрежи често доделуваат глобален IPv6 префикс дури и кога жичената LAN на канцеларијата никогаш не го направила тоа. Политика напишана само како IPv4 правила, вообичаената форма на повеќето рачно изработени рецепти за iptables и nftables, не покрива ништо од тоа. Тунелот останува поврзан, апликациите со достапност до IPv6 излегуваат надвор, а показателот не може да ја покаже разликата зашто тунелот навистина е кренат. Обратниот случај е исто толку чест: збир правила само за IPv6 не прави ништо на мрежа што не нуди v6.

Споредете што нуди врската со она што го споменува политиката, на двете страни на преминот. Овие команди ги печатат истите факти со кои работи клиентот:

ip -4 route show default
ip -6 route show default
sudo nft list ruleset | grep -c 'ip6 '

Ако втората команда печати стандардна рута, а третата враќа нула, новата врска може да ја изведе машината надвор преку IPv6 без ниту едно правило да внимава. Пуштете ги сите три повторно по префрлувањето, зашто интересниот број е разликата меѓу двете пуштања. Ако втората не печати ништо, важи обратниот случај и секоја политика тешка на v6 таму е само украс.

Резолверот менува раце на средина од сесијата

На современите системи резолверите се прикачени на врските, така што новата врска доаѓа со нов збир резолвери и можеби со поинаков поглед на split-DNS. systemd-resolved држи по еден опсег за секоја врска и избира меѓу нив по рута, додека macOS чита опсежни резолвери од динамичното складиште и го почитува редоследот на интерфејсите. Клиент што инсталира сопствен резолвер се натпреварува со оној на врската, а победникот го одлучуваат правила за приоритет што никој не ги гледа. Тогаш разрешувањето имиња може да се скрши додека филтрирањето пакети го прави точно она за што е напишано.

Читајте го активниот резолвер, а не конфигурираниот. На systemd домаќин подкомандата status покажува од која врска дошол секој опсег и дали е на сила име private-DNS:

resolvectl status --no-pager
resolvectl query intranet.example.com

Ако барањето излегува низ физичката врска наместо низ тунелот, клиентот ја загубил трката за приоритет и никакво дотерување на огнениот ѕид нема да го поправи именувањето. Споредете го патот на барањето на двете страни на преминот за да видите кој се поместил. Име што се разрешува на приватна адреса што новата мрежа не може да ја рутира е трет случај, и се појавува како истек на време, а не како грешка.

Вежбајте го преминот и чувајте запис

Репродуцирајте ја промената намерно наместо да ја чекате. Кренете го тунелот на првата врска, започнете долг пренос и повторливо пребарување, потоа сменете ја врската и гледајте која преживува. Запишете го интервалот меѓу исчезнувањето на старата врска и известувањето на тунелот дека е поврзан, зашто токму во тој прозорец политиката издржала или не. Пуштете ја низата и во спротивниот правец, за резултатот да не биде едностран.

Исклучоците бараат своја проверка, зашто заобиколување оправдано на старата мрежа не е автоматски оправдано на новата. Печатач, NAS или captive portal на домашната LAN немаат еквивалент на мобилната, а исклучокот што стигнуваше до нив станува правило без еквивалент.

Запишете ги имињата на интерфејсите, понудените семејства, активниот резолвер и должината на прекинот за секој правец. Повторното поврзување докажува дека транспортот се опоравил, а не дека блокирањето издржало во празнината, и тоа се одделни тврдења за тикет. Со тој запис следниот премин се споредува со позната состојба, а не со помнење.

Поврзани статии