Mitä PHP:n REMOTE_ADDR todella kertoo VPN:n takana
Se on arvo, jonka verkkopalvelimesi toimitti, ei kysely tunneliin. Käy pyynnön reitti läpi, tarkista kuka saa kirjoittaa sen uudelleen ja pidä identiteetti sovelluksessa.
Joku kysyy, miksi VPN-käyttäjä näkyy sovelluslokissa osoitteella, joka kuuluu yhdyskäytävälle, tai osoitteella, joka vaihtui lounaan jälkeen. Vastaus alkaa siitä, mikä arvo on: merkintä, jonka verkkopalvelin asetti pyynnön ympäristöön. Se ei ole kysely tunneliin, ei sertifikaatin identiteetti eikä lupaus siitä, että numero kuuluu yhdelle henkilölle. Sen lukeminen minä tahansa näistä kolmesta tuottaa varmoja vastauksia, jotka ovat eri tavoin vääriä.
Arvo tulee palvelimelta, ei tunnelista
PHP vastaanottaa pyynnön ympäristön siltä, mikä suoritti skriptin. PHP:n palvelinmuuttujien viite kuvaa nämä merkinnät verkkopalvelimen luomiksi, ja niiden saatavuus riippuu siitä, miten pyyntö saapui.
Komentorivikoukuksi VPN:ään ajettu skripti on täysin erilainen suoritusympäristö. Sillä ei ole webpyyntöä, ei asiakassocketia eikä REMOTE_ADDR:ää, ja siksi koukkuun kopioitu webkoodi tuottaa tyhjiä arvoja väärien sijaan. Koukulla on oma ympäristönsä, jonka daemon täyttää, ja se on dokumentoitu erikseen. REMOTE_ADDR:n tavoittelu siellä on sellaisen muuttujan tavoittelua, jota ei koskaan asetettu.
Pidä tämä ero mielessä ennen kuin vertaat kahta lokia. Saatat verrata sivupyyntöä koukkuun, eikä se ole vertailu lainkaan. Tarkista ensin suoritusympäristö ja vasta sitten osoite.
Käy pyynnön reitti läpi ennen kuin luotat numeroon
Raportoitu osoite on sen yhteyden päätepiste, jonka verkkopalvelin näki. Aseta mitä tahansa asiakkaan ja palvelimen väliin, ja päätepiste vaihtuu. Käännös, terminointi ja kuormantasaus siirtävät kukin havaintoa yhden hypyn kauemmaksi käyttäjästä.
Neljä tavallista reittiä tuottaa neljä erilaista havaintoa.
| 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 |
Kirjoita reitti muistiin kohteen nimellä, osoiteperheellä ja jokaisella käännöspisteellä. Ilman sitä karttaa oikea ja väärä arvo näyttävät samalta lokirivillä. Kaksi riviä kaaviota säästää iltapäivän väittelyä.
Korvaaminen tapahtuu vain siellä, missä se on määritetty
Palvelin tai kehys voi tietoisesti korvata asiakkaan osoitteen. Apachen remote-IP-moduuli ja NGINX:n real-IP-moduuli tekevät molemmat tämän, ja PHP:n vastaanottama arvo riippuu tästä kokoonpanosta sekä skriptikäsittelijälle välitetyistä parametreista.
REMOTE_ADDR ei siis ole yleisesti koskematon TCP-päätepiste. Se on päätepiste sellaisena kuin palvelin päätti sen raportoida sovellettuaan omaa käytäntöään. Tämä ero ratkaisee, onko arvo todiste vai koriste.
Kysy palvelimen omistajalta, mikä kenttä on tässä käyttöönotossa valtuuttava ja miten alkuperäinen päätepiste säilytetään, kun korvaaminen tapahtuu. Jos kukaan ei osaa vastata, loki ei vielä todista mitään.
Älä lue edelleenlähetysotsakkeita luottaen
Kutsuja voi lähettää edelleenlähetysotsakkeita itse. Ensimmäisen pilkulla erotetun merkinnän pitäminen vahvistettuna käyttäjäosoitteena on päätös uskoa ketä tahansa, joka yhdistää, eli päinvastoin kuin mihin otsake on tarkoitettu. Otsake kuvaa ketjun, ja vain luotettu kerros voi taata sen ketjun.
Käytä palvelimen tai kehyksen luotettujen välityspalvelimien tukea todellisen välitysketjun kanssa ja anna sen hylätä arvot lähteistä, jotka ovat ketjun ulkopuolella. Käsin kirjoitettu jäsennys on paikka, jossa useimmat kiinnostavat viat asuvat.
Välityspalvelimen raportoima osoite ei myöskään muuta pakettilähdettä, jonka ylempänä oleva palomuuri näkee. Pidä HTTP-metatiedot ja verkkosuodatus erillisinä havaintoina, koska ne vastaavat eri kysymyksiin.
Käytä sovelluksen identiteettiä päätöksiin
Käyttäjän tietueiden käyttöoikeuteen luota todennettuun päämieheen ja sovelluksen valtuutussääntöihin. Sisäinen osoite voidaan jakaa uudelleen, ja yksi käännetty osoite voi edustaa satoja samanaikaisia käyttäjiä. Kumpaakaan ominaisuutta osoitetarkistus ei voi korjata.
Jos ylläpito tarvitsee liittää pyynnön VPN-istuntoon, yhdistä havaittu osoite ja aikaleima valtuuttaviin istuntotietueisiin dokumentoimasi käännösmallin mukaisesti. Se tuottaa suhteen, jota voit puolustaa; pelkkä osoite ei sitä tee.
Kirjaa diagnostiikkaa varten ne harvat kentät, joita tarvitset, koko palvelinmatriisin sijaan, joka voi sisältää otsakkeita ja todennusmateriaalia. Hyödyllinen johtopäätös kertoo, mitä tämä arvo tarkoittaa tässä käyttöönotossa, ei sitä, mikä arvo näyttää eniten asiakkaalta.