Kvifor iPhone-appen din viser éin IP og tenaren loggar ein annan
Ei grensesnittadresse, eit socket-endepunkt og kjelda ein tenar registrerer svarar på ulike spørsmål. Ein VPN legg til kontekst; han gjer dei ikkje til eitt tal.
Det kjem supportbillettar som seier at appen viser éin adresse medan tenaren logga ei anna, og deretter spør kva av dei som lyg. Ingen av dei; det er to observasjonar av to ulike ting. Ei adresse bunden til eit grensesnitt, ei adresse bunden til ein socket og ei kjeldeadresse sett av ein ekstern teneste svarar på tre separate spørsmål. Ein VPN legg til ein nettverkskontekst på telefonen og slår ikkje saman dei tre til eitt tal for heile eininga. Les feltnamna i billetten før du les adressene.
Kva billetten vanlegvis skildrar
Førestill deg ein telefon på Wi-Fi med ein tunnel oppe. Wi-Fi-grensesnittet har ei LAN-adresse, tunnelgrensesnittet har ei tildelt indre adresse, og ein førespurnad som går ut gjennom tunnelen, kjem til ei offentleg teneste frå kva som helst kjelde som overlever ei eventuell omsetjing undervegs. Ein app som skriv ut den indre adressa, og ein tenar som loggar den omsette kjelda, rapporterer begge nøyaktig, og dei to verdiane vil aldri stemme overeins.
Dei tre observasjonane skil seg i kva dei kan bevise, ikkje berre i kva dei skildrar.
| Observation | What it describes | What it cannot prove |
|---|---|---|
| An address on a local interface | One configured attachment: Wi-Fi, cellular or a tunnel | The source a remote site receives |
| A socket's local endpoint | The binding used by that one connection | The address after translation further along |
| The peer address at a service | What arrived at that observation point | Any other interface on the phone |
Hald den tabellen ved sida av koden som fyller desse verdiane inn i ein billett, for det meste av forvirringa her er ei kolonneforveksling og ikkje ein nettverksfeil.
Kva eit socket-kall kan og ikkje kan svare på
På API-nivå rapporterer getsockname det lokale endepunktet som for tida er bunde til ein bestemd socket. For ein tilkopla socket er det kjelda kjernen valde for den tilkoplinga, noko som allereie er meir spesifikt enn kva grensesnittliste som helst. Det er ikkje eit oppslag av offentleg adresse, og å kalle det på ein ubunden socket fortel deg nesten ingenting. Kva det enn returnerer, kan seinare skrivast om på vegen, så berre tenesta si eiga observasjon er autoritativ om kva tenesta tok imot.
På Apple-plattformer har grensesnittsida ei eiga flate: tunnelinnstillingane listar adressene som er tildelte tunnelgrensesnittet. Å lese dei fortel deg korleis tunnelen vart konfigurert, og det fortel deg ikkje kva veg ein gitt førespurnad tok, fordi ruting og reglar per app avgjer det for kvar tilkopling.
Delt tunnellering gjer gapet synleg. Éin førespurnad kan gå ut gjennom tunnelen medan den neste, retta mot ein annan destinasjon eller adressefamilie, ikkje gjer det, så to resultat frå same app med sekunds mellomrom kan vere ærlege og ulike.
Vel observasjonen som passar til spørsmålet
Vel medvite i staden for å instrumentere alt. For det backend ser, logg kjelda i backend, og der ein omvend proxy står framfor, les klientadressa frå vidaresendingshovudet utrullinga di faktisk set, og ikkje frå noko klienten sende.
For å vite om tunnelen er konfigurert, les grensesnittet. For å vite om trafikken til denne appen brukte han, send trafikk frå den appen til ein destinasjon du kontrollerer og samanlikn kjelda i begge endar.
Reglar per app fortener si eiga setning. Eit nettlesarresultat er bevis om den nettlesaren, og ein administrert tunnel per app kan setje to apper på same telefon på ulike vegar i same augneblink. Å verifisere dekning betyr å sende trafikk frå den aktuelle appen, i den aktuelle adressefamilien.
Grensesnittnamn er ikkje ein detektor
Ikkje bruk eit grensesnittnamn som VPN-sjekk heller. Namna er ikkje ein offentleg kontrakt, og ein telefon kan ha fleire tilkoplingar medan berre éin av dei ber førespurnaden din.
Gi feltet namn etter observasjonen det held. local_interface_address, socket_local_endpoint og service_observed_source er klossete og eintydige, og eintydig er det du vil ha når verdien endar i ein støttebillett ei veke seinare. Éin kolonne kalla device IP vil samle alle tre og deretter bli trudd på som om han var éin.
Hald identitet utanfor adressekolonnen
Ein delt VPN-utgang er ikkje ein brukaridentitet, og ei privat adresse er ikkje ei tilgangsopplysning. Begge skildrar ein veg og ikkje ein person, og å handsame ein av dei som autentisering gjer ei ruteulukke om til ei autorisasjonsavgjerd.
Når nokon spør kva adresse telefonen har, er det nyttige svaret eit spørsmål om kva tilkopling og kva observatør. Definisjonen av getsockname er verdt å sitere for midt-caset, fordi han avgjer socket-spørsmålet utan å late som han avgjer dei to andre.
Skriv deretter ned kva av dei tre produktet ditt faktisk treng å vise, og slett dei to andre frå grensesnittet.