Vad PHPs REMOTE_ADDR egentligen berättar bakom ett VPN
Det är ett värde som din webbserver levererade, inte en uppslagning i tunneln. Gå igenom begärans väg, kontrollera vem som får skriva om den och behåll identiteten i applikationen.
Någon frågar varför en VPN-användare dyker upp i applikationsloggen med en adress som tillhör gatewayen, eller med en adress som ändrades efter lunchen. Svaret börjar med vad värdet är: en post som webbservern la i begärans miljö. Det är inte en fråga in i tunneln, inte en certifikatidentitet och inte ett löfte om att numret tillhör en enda person. Att läsa det som något av de tre ger självsäkra svar som är fel på olika sätt.
Värdet kommer från servern, inte från tunneln
PHP tar emot begärans miljö från det som körde skriptet. PHP:s referens för servervariabler beskriver dessa poster som skapade av webbservern, med en tillgänglighet som beror på hur begäran kom in.
Ett skript som körs som kommandorads-hook i VPN:et är en helt annan exekveringskontext. Det har ingen webbegäran, ingen klientsocket och ingen REMOTE_ADDR, och därför ger kopierad webbkod i en hook tomma värden i stället för felaktiga. Hooken har sin egen miljö, fylld av daemonen, och den dokumenteras separat. Att där sträcka sig efter REMOTE_ADDR är att sträcka sig efter en variabel som aldrig sattes.
Håll den skillnaden i minnet innan du jämför två loggar. Du kanske jämför en sidbegäran med en hook, och det är ingen jämförelse alls. Kontrollera exekveringskontexten först och adressen sedan.
Gå begärans väg innan du litar på numret
Den rapporterade adressen är peeren för den anslutning som webbservern såg. Sätt något mellan klienten och den servern och peeren ändras. Översättning, terminering och lastbalansering flyttar var och en observationen ett hopp längre bort från användaren.
Fyra vanliga vägar ger fyra olika observationer.
| Path to the listener | What can be reported |
|---|---|
| Client routed straight to the private listener, no translation | The client's tunnel address |
| Gateway translates the source before forwarding | The gateway's translated address |
| Reverse proxy terminates the client and opens its own backend connection | The proxy's backend address |
| Load balancer in front of two proxies | Whichever hop the server treats as its peer |
Skriv ned vägen med destinationsnamnet, adressfamiljen och varje översättningspunkt. Utan den kartan ser ett korrekt och ett felaktigt värde identiska ut i en loggrad. Två rader diagram sparar en eftermiddag av diskussion.
Ersättning sker bara där den är konfigurerad
En server eller ett ramverk kan medvetet byta ut klientadressen. Apaches remote-IP-modul och NGINX real-IP-modul gör båda detta, och värdet som PHP tar emot beror på den konfigurationen plus de parametrar som skickas till skripthanteraren.
REMOTE_ADDR är alltså inte alltid den orörda TCP-peeren. Det är peeren så som servern valde att rapportera den efter att ha tillämpat sin egen policy. Den skillnaden avgör om värdet är bevis eller dekoration.
Fråga serverägaren vilket fält som är auktoritativt i den här installationen och hur den ursprungliga peeren bevaras när ersättning sker. Om ingen kan svara är loggen ännu inte bevis för något.
Lita inte blint på vidarebefordringsrubriker
En anropare kan själv skicka vidarebefordringsrubriker. Att behandla den första kommaseparerade posten som en verifierad användaradress är att besluta sig för att tro på vem som helst som ansluter, vilket är motsatsen till vad rubriken är till för. Rubriken beskriver en kedja, och bara ett betrott lager kan gå i god för den kedjan.
Använd serverns eller ramverkets stöd för betrodda proxyservrar med den faktiska proxykedjan konfigurerad, och låt den kasta bort värden från källor utanför den kedjan. Handskriven parsning är där de flesta intressanta felen bor.
En proxyrapporterad adress ändrar inte heller paketkällan som en brandvägg uppströms ser. Håll HTTP-metadata och nätverksfiltrering som separata observationer, eftersom de svarar på olika frågor.
Använd applikationens identitet för beslut
För åtkomst till en användares poster ska du lita på den autentiserade principalen och applikationens auktoriseringsregler. En intern adress kan tilldelas på nytt, och en översatt adress kan stå för hundratals samtidiga användare. Ingen av dessa egenskaper kan en adresskontroll reparera.
Om driften behöver knyta en begäran till en VPN-session, koppla den observerade adressen och tidsstämpeln till auktoritativa sessionsposter enligt den översättningsmodell du dokumenterat. Det ger en association du kan försvara; en adress ensam gör det inte.
Logga för diagnos de få fält du behöver i stället för hela serverarrayen, som kan bära rubriker och autentiseringsmaterial. Den användbara slutsatsen säger vad detta värde betyder i den här installationen, inte vilket värde som mest liknar en klient.