Раздзелены тунель для кліентаў кропкі доступу — гэта не выключэнне па праграмах
Выключэнне праграмы з VPN змяняе толькі тэлефон. Падключаны ноўтбук мае патрэбу ў сваім правіле перасылкі, якое супастаўляецца па крыніцы, прызначэнні і NAT.
Два патрабаванні, якія гучаць аднолькава, не аднолькавыя: «выключыць гэтую праграму з VPN» і «адправіць гэтае адзінае прызначэнне па-за VPN для ноўтбука на маёй кропцы доступу». Першае змяняе тое, як сокет на тэлефоне выбірае сетку. Другое павінна змяніць рашэнне аб перасылцы для пакета, які прыйшоў з іншай прылады пасля таго, як тэлефон ужо яго прыняў. Блытаць гэтыя два — гэта шлях да таго, што кліент кропкі доступу атрымае выключэнне, якое заўсёды датычылася толькі ўласнага браўзера тэлефона.
Дзве падсістэмы адказваюць за два пытанні
Android трымае сеткі праграм і тэтэрынг асобна. Сокеты праграм прызначаюцца да сеткі стэкам злучэнняў, а праграма VPN вырашае, якія з яе ўласных сокетаў трапяць у тунель. Перасланыя пакеты ад падключанага кліента апрацоўвае падсістэма тэтэрынгу, якая запытвае ў netd маршруты, правілы палітыкі і трансляцыю на інтэрфейсе ўніз.
Выключэнне асобнай праграмы ацэньваецца, калі праграма адкрывае сокет. Перасланы пакет ніколі не даходзіць да гэтай праверкі, бо ён не ўзнік з сокета праграмы на гэтай прыладзе. Менавіта таму два налады не могуць замяніць адна адну, і гэта не дэфект ні ў адной з іх.
Што насамрэч змяняе выключэнне па праграмах
Будаўнік VpnService можа назваць пакеты, якія застаюцца па-за тунелем, праз addDisallowedApplication, або назваць адзіныя пакеты, дазволеныя ўнутры, праз addAllowedApplication. Тады гэтыя праграмы адкрываюць сокеты ў базавай сетцы, пакуль VPN працягвае валодаць маршрутам па змаўчанні для ўсяго астатняга.
Ахоп дакладны: уласныя сокеты пакета, на гэтай прыладзе, пакуль тунель падняты. Ён нічога не кажа пра перасланы трафік, пра другую прыладу і пра пакеты, якія сістэма адпраўляе ад імя тэтэрынгу.
Гэта таксама не кіраванне прызначэннем. Выключэнне браўзера выключае кожны адрас, да якога гэты браўзер даходзіць, уключаючы той, які вы хацелі пакінуць унутры тунеля. Калі патрабаванне называе прызначэнне, а не праграму, выбар праграмы — гэта інструмент, няправільны па самай канструкцыі.
Як выглядае перасланы пакет для тэлефона
Пакет кліента прыходзіць на інтэрфейс кропкі доступу з прыватным адрасам крыніцы, які прызначыў тэлефон, скажам 192.168.43.20, і публічным прызначэннем. Каб пераслаць яго, тэлефону патрэбны маршрут да ўзыходнага канала і правіла трансляцыі, каб адказы знайшлі зваротны шлях, бо прыватны адрас кліента бессэнсоўны ў сотавай сетцы.
Android выражае гэта правіламі палітыкі, якія выбіраюць табліцу маршрутызацыі, а netd перабудоўвае адпаведныя табліцы і правілы, калі сеткі і VPN змяняюцца. Нумар табліцы, прыярытэт правіла ці назва інтэрфейса, скапіяваныя з паведамлення на форуме або з той жа мадэлі на старэйшым выпуску, не ствараюць трывалага валодання. Гэтая перабудова — таксама прычына таго, што напісанае ўручную правіла можа працаваць гадзіну і спыніцца пасля наступнага перападключэння.
Якая палітыка насамрэч патрэбна выключэнню для кропкі доступу
Запішыце рашэнне як крыніцу, прызначэнне і меркаваны шлях, перш чым кранаць правіла. Мінімальная форма для аднаго ўзгодненага прызначэння выглядае так:
| Source | Destination | Intended path |
|---|---|---|
| One authorized hotspot client | One approved public service address | Ordinary cellular uplink |
| The same client | All other covered destinations | Shared VPN |
| The phone's own apps | Their existing destinations | Unchanged phone policy |
Абодва напрамкі павінны быць поўнымі. Прамая галіна патрабуе працаздольнага маршруту праз сотавы ўзыходны канал, які выпадкова з'яўляецца бягучым; галіна VPN патрабуе маршруту тунеля плюс дазволу на перасылку. Любая трансляцыя крыніцы павінна адпавядаць выбранаму выхаду, бо NAT, ужыты на інтэрфейсе тунеля, паказвае адрас тунеля, а не сотавы, і зваротны шлях тады не ўзгадняецца з зыходным шляхам.
Адказы павінны даходзіць да таго ж кліента ўнізе праз адсочванне стану або яўны маршрут, а лічыльнік зыходных пакетаў нічога з гэтага не даказвае. Трымайце ўласны знешні транспарт VPN таксама па-за межамі выключэння, інакш пакеты-носьбіты тунеля атрымаюць у спадчыну палітыку, напісаную для вэб-запыту кліента.
Адзін перахоплены адрас — не прызначэнне
Адзін адрас IPv4, прачытаны з браўзера, — гэта здымак. Вялікія сэрвісы адказваюць з anycast або з зменлівага набору перыферыйных адрасоў, многія з'яўляюцца двухстэкавымі, а працэс уваходу можа закранаць хасты аўтэнтыфікацыі і тэлеметрыі, якія старонка ніколі не паказвае. Выключэнне, пабудаванае вакол адраса, які вы выпадкова ўбачылі, ламаецца наступным разам, калі сэрвіс пераразмяркоўвае нагрузку.
Выкарыстоўвайце дакументаваныя адрасы ўласніка сэрвісу або дыяпазон, які ён публікуе, і ўлічвайце абодва сямействы адрасоў. Калі патрабаванне нельга выказаць як стабільны набор, гэта, хутчэй за ўсё, пытанне палітыкі для сэрвісу, а не маршрутная хітрасць на тэлефоне.
Праверце з боку ўнізе
Тры праверкі, у такім парадку: выбраны сэрвіс з ноўтбука, звычайнае прызначэнне, якое павінна застацца ўнутры VPN, і праграма на тэлефоне, якая павінна застацца незакранутай. Затым паўтарыце пасля перападключэння і пасля змены ўзыходнага канала, бо менавіта тады табліцы палітыкі перабудоўваюцца.
Калі рэалізацыя сумеснага доступу на тэлефоне не можа ўтрымаць гэты кантракт праз перападключэнне, перанясіце выбарачную палітыку на падтрыманы маршрутызатар унізе, а не назапашвайце root-правілы на апараце. Маршрутызатар можа выказаць супастаўленне крыніцы і прызначэння са стабільным уласнікам, а дакументацыя модуля тэтэрынгу — гэта правільная даведка пра тое, што тэлефон насамрэч робіць.