Android OpenVPN не додаје руту без адресе тунела
OpenVPN клијенти на Android-у не могу додати руте док телефон нема адресу тунела. Проверите ко је додељује, који је pull филтри одбацују и када је треба сами уписати.
Ваш OpenVPN профил на Android-у не додаје руту јер телефон нема адресу на виртуелном интерфејсу, па нема чега да се рута дотакне. Руте одговарају само на питање куда пакети треба да иду. Адреса тунела одговара на питање ко је телефон унутар тунела, а клијент је мора обезбедити пре него интерфејс може постојати. Прођите кроз четири провере испод редом и зауставите се на првом неуспеху, јер уређивање рута пре него адреса постоји скрива прави проблем.
Прочитајте неуспех оним редом којим га клијент изводи
VpnService.Builder на Android-у држи два појма одвојена: addAddress() ставља адресу на интерфејс који апликација гради, addRoute() додаје префикс одредишта, а establish() одбија да створи интерфејс док се не дода бар једна адреса. OpenVPN клијент пресликава профил и опције које сервер гура тачно на те позиве, па веза која никада не парсира адресу уопште не може изградити интерфејс.
Зато линија записа коју читате може навести руту док узрок стоји корак раније. Клијент долази до фазе руте тек након што интерфејс постоји; без адресе позив руте одмах пада или се никада не извршава. Кад запис каже да не може додати руту, почните од адресе, а не од синтаксе руте.
Провера 1: ставља ли сервер адресу у одговор?
За рутирану OpenVPN услугу адреса долази из скупа сервера или из доделе по клијенту, а топологија одлучује какав ће облик имати. На серверу OpenVPN 2.4 или новијем, услуга са топологијом подмреже изгледа овако:
topology subnet
server 10.8.0.0 255.255.255.0
client-config-dir ccd
С тим обликом сервер гура нешто попут ifconfig 10.8.0.6 255.255.255.0. Старија topology net30 инсталација гура уместо тога адресу партнера, на пример ifconfig 10.8.0.6 10.8.0.5, па профил премештен између два модела може изгледати исправно док носи погрешну мрежну маску.
У запису везе клијента потражите послати скуп опција. Ако у њему уопште нема реда ifconfig, сервер никада није послао адресу или је клијент одбио опцију. На серверу који користи client-config-dir, датотека названа по common name-у сертификата мора постојати и носити доделу:
# ccd/phone-anna
ifconfig-push 10.8.0.6 255.255.255.0
Провера 2: задржава ли клијент добијену адресу?
Пребрз филтер је други чест узрок. pull-filter постоји у OpenVPN 2.4 и новијем, а кад више филтера одговара истој опцији, побеђује последњи који одговара, па завршни catch-all уклања адресу без грешке:
# removes every pushed option, including the address
pull-filter ignore "ifconfig"
pull-filter ignore "route"
Сузите филтер на опцију које се заиста желите решити и оставите адресу на миру:
# keeps the pushed address, drops one unwanted LAN route
pull-filter ignore "route 10.60.0.0"
Савет да искључите све pull-ове обично долази од некога ко жели да се реши једне једине руте. route-nopull је ужа преклопка: задржава ifconfig и остале послате опције, а одбија послате руте и опције налик DHCP-у. Употребите је кад је то заиста оно што желите, а питање адресе решите одвојено.
Провера 3: је ли адреса ваша за уписивање?
Ручно адресирање је оправдано само кад вам оператор преда вредност. Ако је упишете сами, мора доћи из подмреже VPN клијента, бити јединствена међу активним сесијама и одговарати топологији коју сервер извршава. Копирање адресе сточне премоснице или рачунара на удаљеном LAN-у пада по обе основе: телефон би тражио адресу која већ постоји негде другде, а пролаз не би имао повратни пут до ње.
Префикс удаљеног LAN-а у рути је одредиште, никада идентитет телефона. Рута за 10.60.0.0/24 каже дођи до те мреже кроз тунел; не говори ништа о томе коју адресу 10.60.0.x телефон треба имати, а телефон не треба имати ниједну од њих. Статичке доделе припадају страни сервера, где се не могу сударити с динамичким скупом.
Две сесије на једном идентитету откривају исти судар. Ако се исти сертификат повеже двапут и сервер гура једну фиксну адресу обема, друга сесија дуплира прву, а решење су одвојени идентитети или одвојене доделе, а не измена на страни клијента.
Провера 4: држи ли нешто друго место тунела?
Android дозвољава само једну активну VPN услугу истовремено. Друга VPN апликација или запис стално укљученог VPN-а остављен укључен за профил који више не ради може заузети то место пре него ваш OpenVPN клијент позове establish(). Интерфејс се тада никада не појави иако је профил ваљан, па одспојите други VPN, искључите поставку стално укљученог и поново се повежите пре него дирнете профил.
Услуга која инсистира на Ethernet премосници је други слепи пут. Android апликација без root-а може створити IP тунел, не премосни Ethernet сегмент, па ниједна адреса коју упишете неће покренути сервер dev tap; оператор мора понудити рутирану услугу. Кад пријављујете проблем, наведите назив и верзију клијента, послати скуп опција, топологију и тачан корак у којем се адреса требала појавити.
Ако све четири провере прођу и адреса је присутна, јединствена и исправно маскирана, питање руте постаје уобичајено: које префиксе сервер овлашћује и како их клијент треба ограничити. Запишите адресу тунела, његову мрежну маску и топологију пре него ишта друго промените, јер су те три вредности оно што оператор треба упоредити с погледом сервера.