Androids VpnService huet keng Ausschléissroute, an et gëtt keng Quantitéit API-Liesen, déi eng produzéiert. Builder.addRoute() füügt ëmmer nëmmen Destinatiounen an den Tunnel derbäi, also bedeckt e LAN-Segment lokal ze halen, datt dëst Segment ni an d'Routelëscht kënnt. Wat Dir amplaz derbäi füügt, ass de Komplement vum Segment, ausgedréckt a gewéinleche Prefixen. D'Aarbecht ass Arithmetik, an et schléit op enger Handvoll viraussobare Plazen feel.

Schafft d'Kontrollen hei drënner an der Rei of. Jiddwereen hëlt un, datt déi vireg gehalen huet, also stoppt beim éischten Ausfall, amplaz Symptomer weider ënnen ze flécken.

Fänkt domat un, wat den Tunnel behaapt

0.0.0.0/0 an addRoute() ze ginn, seet Android, datt all IPv4-Destinatioun zum Tunnel gehéiert. Dofir schéngen esou ville Cliente fäheg fir Split-Tunneling ze sinn: si behaapten de ganzen Adressraum a probéieren dann dovun ofzezéien. Nichts am Builder zitt of. Eng méi spezifesch Route fir den Netz, deen Dir lokal wëllt halen, mécht d'Géigendeel vun deem, wat d'Leit erwaarden, well de längsten iwwereneenstëmmende Prefix gewënnt an dësen Netz am Tunnel landt.

D'Routelëscht ass déi ganz Politk. Et gëtt keen Veto pro Destinatioun dobannen, an d'Builder-Referenz liste keng Method op, déi esou ee géif liwweren.

Generéiert de Komplement aus der Prefix-Arithmetik

De Komplement vun engem ausgeschlossene Prefix ass d'Set vu senge Geschwëster um Wee bis zur Wuerzel vum Adressbaum. Fir all Längt vun 1 bis zur ausgeschlossener Längt hëlt Dir de Block vun där Längt, deen Äre Prefix enthält, dréit dat Bit direkt ënner dem Prefix ëm a gitt d'Resultat aus. Et kléngt abstrakt, bis Dir et lafe léisst.

Den Ausschléiss vun 10.0.0.0/8 gëtt aacht Routen: 128.0.0.0/1, 64.0.0.0/2, 32.0.0.0/3, 16.0.0.0/4, 0.0.0.0/5, 12.0.0.0/6, 8.0.0.0/7, 11.0.0.0/8. Keng dovun enthält 10.0.0.0/8, an zesummen decke si alles anescht of.

Aacht Zeile generéieren déi Lëscht fir all Prefix:

import ipaddress
def complement(addr, length):
    base = int(ipaddress.IPv4Address(addr))
    out = []
    for k in range(1, length + 1):
        block = base & (0xFFFFFFFF << (32 - k))
        sibling = block ^ (1 << (32 - k))
        out.append(f"{ipaddress.IPv4Address(sibling)}/{k}")
    return out
print(complement("10.0.0.0", 8))

D'Zuel vun de Routen ass gläich der Prefixlängt, an dat ass d'Zuel, op déi een oppasse muss. Eng eenzeg /21-Ausschluess kost 21 Routen an bleift liesbar. Zéng Ausschlëss kënnen e puer Honnert kaschten, wat meeschtens heescht, datt den Netzwierkdesign geännert muss ginn an net de Generator.

Kontrolléiert d'Adressfamill an d'Umfang vum Tunnel

IPv4-Routen maache fir IPv6 näischt. Wann den Tunnel eng IPv6-Adress behaapt, brauch en IPv6-LAN-Prefix säin eegene Komplement, generéiert mat der selwechter Arithmetik iwwer 128 Bit. Eng heefeg Ursaach, datt den Ausschloss um Pabeier funktionéiert, während d'lokal Gerät onereechbar bleift, ass dës: den Host gouf iwwer IPv6 erreecht, an et war nëmmen IPv4 ausgeschnidden. Kontrolléiert béid Famillen, ier Dir schléisst, datt d'Mathematik falsch ass.

Den Umfang ass déi aner Hallschent vun der Kontroll. Android verfollegt Routing pro Netz a pro App, also kann dee selwechte Prefix fir eng App duerch den Tunnel goen an fir eng aner direkt, jee no wéi de VPN deklaréiert gouf.

Setzt DNS- an Pro-App-Reegelen dohin, wou se gehéieren

Routenausschlëss änneren de Resolver net. E lokale Hostnumm kann nach ëmmer vum DNS-Server vum Tunnel beäntwert ginn, während seng Adress lokal geroutet gëtt, an den Desaccord weist sech als Numm, dee sech zu eppes opléist, wat de LAN net erreeche kann. Setzt d'Resolver-Politik bewosst, mat enger Sichdomän oder enger Split-DNS-Reegel. Hält net un, datt d'Routen dat fir Iech decidéiert hunn.

addDisallowedApplication() hält eng App aus dem Tunnel; et hält keng Destinatioun dobausse fir d'Appen, déi dobannen bleiwen. protect() léisst e Socket, deen Dir opmaacht, den Tunnel ëmgoen, an esou vermeit den Tunnel, säin eegenen Transport ze fänken. Keng vun deenen zwou ersetzt de Komplement.

Verifizéiert mat engem Nokuck, net mat Ärer eegener Lëscht

Wann den Tunnel steet, frot d'Gerät, wou eng Adress tatsächlech hinnergeet, amplaz d'Lëscht, déi Dir gebaut hutt, nach eng Kéier ze liesen. Op engem Build, deen iproute2 liwwert, nennt adb shell ip route get 10.1.2.3 d'Interface, déi de Kernel gewielt huet. Fuert déiselwecht Commande fir eng ëffentlech Adress aus a bestätegt, datt se den Tunnel nennt.

Nach zwou Kontrollen zoumaachen de Krees. Léist fir d'éischt en lokalen Numm op, fuert dann adb shell ip route get op der opgelüster Adress aus a verlaangt eng Interface, déi net den Tunnel ass, well en erfollegräichen adb shell ping -c 1 host.lan d'Erreechbarkeet beweist an net de Wee. Widderhëlt den Adressfamill-Test iwwer IPv6, wann den Tunnel eng behaapt. Testt op der API-Ebene, déi Dir liwwert, well wéi VPN-Netzer der Routingtabell ausgesat ginn, huet sech iwwer Releases geännert. Eng Routelëscht, déi um Pabeier richteg ausgesäit, an en Nokuck, deen déi falsch Interface wielt, si verschidde Feeler, an nëmmen den zweeten erreecht d'Benotzer.

Wann d'Ausschluesslëscht weider wiisst, stoppt d'Routen ze generéieren an nummeréiert den entfernten Netz nei oder verengt den Tunnel amplaz. De Generator ass en Ëmwee fir déi fehlend API, keen Designinstrument.

Ähnlech Artikelen