Nogen spørger, hvorfor en VPN-bruger dukker op i applikationsloggen med en adresse, der tilhører gatewayen, eller med en adresse, der ændrede sig efter frokost. Svaret begynder med, hvad værdien er: en post, som webserveren lagde i anmodningens miljø. Det er ikke et opslag i tunnelen, ikke en certifikatidentitet og ikke et løfte om, at nummeret tilhører én person. At læse det som en af de tre giver selvsikre svar, der er forkerte på forskellige måder.

Værdien kommer fra serveren, ikke fra tunnelen

PHP modtager anmodningens miljø fra det, der kørte scriptet. PHP's reference for servervariabler beskriver disse poster som skabt af webserveren, med en tilgængelighed, der afhænger af, hvordan anmodningen ankom.

Et script, der kører som kommandolinje-hook i VPN'en, er en helt anden udførelseskontekst. Det har ingen webanmodning, ingen klientsocket og ingen REMOTE_ADDR, og derfor giver kopieret webkode i et hook tomme værdier i stedet for forkerte. Hooket har sit eget miljø, fyldt af daemonen, og det er dokumenteret separat. At række efter REMOTE_ADDR der er at række efter en variabel, der aldrig blev sat.

Husk den forskel, før du sammenligner to logs. Du sammenligner måske en sideanmodning med et hook, og det er slet ikke en sammenligning. Kontroller først udførelseskonteksten og derefter adressen.

Gå anmodningens vej igennem, før du stoler på nummeret

Den rapporterede adresse er peer for den forbindelse, webserveren så. Sæt noget mellem klienten og den server, og peeren ændrer sig. Oversættelse, terminering og lastbalancering flytter hver observationen et hop længere væk fra brugeren.

Fire almindelige veje giver fire forskellige observationer.

Path to the listenerWhat can be reported
Client routed straight to the private listener, no translationThe client's tunnel address
Gateway translates the source before forwardingThe gateway's translated address
Reverse proxy terminates the client and opens its own backend connectionThe proxy's backend address
Load balancer in front of two proxiesWhichever hop the server treats as its peer

Skriv vejen ned med destinationsnavnet, adressefamilien og hvert oversættelsespunkt. Uden det kort ser en korrekt og en forkert værdi identiske ud i en loglinje. To linjer diagram sparer en eftermiddag med diskussion.

Erstatning sker kun, hvor den er konfigureret

En server eller et framework kan bevidst erstatte klientadressen. Apaches remote-IP-modul og NGINX' real-IP-modul gør begge dette, og den værdi, PHP modtager, afhænger af den konfiguration plus de parametre, der sendes til scripthandleren.

REMOTE_ADDR er altså ikke universelt den urørte TCP-peer. Det er peeren, som serveren valgte at rapportere den efter at have anvendt sin egen politik. Den forskel afgør, om værdien er bevis eller dekoration.

Spørg serverejeren, hvilket felt der er autoritativt i denne installation, og hvordan den oprindelige peer bevares, når erstatning sker. Hvis ingen kan svare, er loggen endnu ikke bevis for noget.

Læs ikke videresendelsesheaders på tillid

En kalder kan selv sende videresendelsesheaders. At behandle den første kommaseparerede post som en verificeret brugeradresse er at beslutte at tro på enhver, der forbinder, hvilket er det modsatte af, hvad headeren er til for. Headeren beskriver en kæde, og kun et betroet lag kan stå inde for den kæde.

Brug serverens eller frameworkets understøttelse af betroede proxier med den faktiske proxykæde konfigureret, og lad den kassere værdier fra kilder uden for den kæde. Håndskrevet parsning er det sted, hvor de fleste interessante fejl bor.

En proxyrapporteret adresse ændrer heller ikke den pakkekilde, som en firewall længere oppe ser. Hold HTTP-metadata og netværksfiltrering som separate observationer, fordi de besvarer forskellige spørgsmål.

Brug applikationens identitet til beslutninger

Til adgang til en brugers poster skal du stole på den autentificerede principal og applikationens autorisationsregler. En intern adresse kan tildeles igen, og en oversat adresse kan repræsentere hundredvis af samtidige brugere. Ingen af disse egenskaber kan en adressekontrol reparere.

Hvis driften skal knytte en anmodning til en VPN-session, skal du forbinde den observerede adresse og tidsstemplet med autoritative sessionsposter efter den oversættelsesmodel, du har dokumenteret. Det giver en association, du kan forsvare; en adresse alene gør det ikke.

Log til diagnostik de få felter, du har brug for, i stedet for hele serverarrayet, som kan bære headers og autentificeringsmateriale. Den nyttige konklusion siger, hvad denne værdi betyder i denne installation, ikke hvilken værdi der ligner en klient mest.

Relaterede artikler