Wi-Fi-ден ұялы желіге ауысқаннан кейінгі kill-switch: не бұзылады
Kill-switch желі өзгерісі алмастыратын интерфейс атауларына қарсы жазылады. Оған сенбес бұрын сыртқы жолды, мекенжай әулеттерін және шешушіні тексеріңіз.
Бір сәтте ноутбук кеңсе 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 әр буынға бір scope ұстайды және олардың арасында маршрут бойынша таңдайды, ал macOS scoped шешушілерді динамикалық қоймадан оқып, интерфейс ретін құрметтейді. Өз шешушісін орнатқан клиент буынның шешушісімен жарысады, ал ешкім бақыламайтын басымдық ережелері жеңімпазды анықтайды. Сонда атауларды шешу бұзылуы мүмкін, ал пакеттерді сүзу дәл өзі үшін жазылғанды істеп тұрады.
Конфигурацияланған шешушіні емес, белсенді шешушіні оқыңыз. systemd хостында status қосымша командасы әр scope қай буыннан келгенін және private-DNS атауының күшінде екенін көрсетеді:
resolvectl status --no-pager
resolvectl query intranet.example.comЕгер сұраныс туннельден емес, физикалық буыннан шықса, клиент басымдық жарысында ұтылды және ешбір firewall реттеуі атауды түзетпейді. Сұраныс жолын ауысудың екі жағында салыстырып, қайсысы жылжығанын көріңіз. Жаңа желі маршруттай алмайтын жеке мекенжайға шешілетін атау — үшінші жағдай, және ол қате ретінде емес, уақыттың бітуі ретінде көрінеді.
Ауысуды жаттықтырып, жазбаны сақтаңыз
Өзгерісті күтпей, әдейі қайта жаңғыртыңыз. Туннельді бірінші буында көтеріңіз, ұзақ тасымалдауды және қайталанатын іздеуді бастаңыз, содан кейін буынды ауыстырып, қайсысы аман қалатынын қараңыз. Ескі буын жоғалғаннан туннельдің қосылғаны туралы хабарлағанына дейінгі аралықты жазып алыңыз, өйткені дәл сол терезеде саясат шыдады ма, жоқ па. Тізбекті кері бағытта да орындаңыз, нәтиже біржақты болмас үшін.
Ерекшеліктерге жеке өту керек, өйткені ескі желіде ақталған айналып өту жаңасында автоматты түрде ақталмайды. Үй LAN-ындағы принтердің, NAS-тың немесе captive portal-дың ұялы желіде баламасы жоқ, және оларға жететін ерекшелік баламасыз ережеге айналады.
Әр бағыт үшін интерфейс атауларын, ұсынылатын әулеттерді, күшіндегі шешушіні және үзілістің ұзақтығын жазыңыз. Қайта қосылу тасымалдың қалпына келгенін дәлелдейді, үзіліс кезінде блоктың шыдағанын емес, және бұл билетке қоюға арналған бөлек тұжырымдар. Осы жазбамен келесі ауысу жадымен емес, белгілі күймен салыстырылады.