Kodėl „Port-Share“ visus svetainės lankytojus rodo kaip localhost
Užpakalinė dalis mato persiuntimo šuolį, o ne naršyklę. Patikrinkite, kur prarandamas šaltinio adresas, tada nuspręskite, kuris komponentas gali už jį laiduoti.
Kiekviena prieigos žurnalo eilutė rodo tą patį loopback adresą, nors puslapis įkeliamas ir sertifikatas patikrinamas teisingai. Niekas nesugedę nepasiekiamumo prasme, ir būtent todėl tai tęsiasi mėnesius. Sugedo priskyrimas: žiniatinklio užpakalinė dalis įrašo to šuolio adresą, kuris persiuntė ryšį, ir kiekvienas vėlesnis sprendimas, pasitikėjęs žurnalu, paveldėjo tą patį neteisingą atsakymą.
Toliau pateikti patikrinimai eina nuo kabelio į vidų. Sustokite ties pirmuoju, kuris paaiškina matomą reikšmę, nes kiekvienas vėlesnis žingsnis daro prielaidą, kad ankstesni jau teisingi. Nė vienas jų nereikalauja spėlioti priekinės dalies konfigūraciją.
Sekite dviem ryšiais, o ne žurnalo eilute
„Port-Share“ multipleksuoja du protokolus viename TCP klausytojuje. OpenVPN patikrina pirmuosius įeinančio ryšio baitus, pasilieka jį, kai jis atrodo kaip jo paties protokolas, o visa kita perduoda antrajai paskirties vietai. Ta vieta paprastai yra žiniatinklio serveris tame pačiame hoste, todėl priimtas žiniatinklio serverio lizdas turi OpenVPN procesą kaip partnerį.
ss -ltnp 'sport = :443'
ss -tnp 'dport = :8080'
Pirmoji komanda parodo, kam priklauso viešasis klausytojas. Antroji parodo ryšius, atvykstančius į užpakalinės dalies prievadą, o jų partnerio adresas yra tas, kurį atspausdins prieigos žurnalas. Jei tas partneris yra loopback, žurnalas tikslus, o informacija prarasta vienu sluoksniu anksčiau. Žurnalo lauko pervadinimas arba kliento IP modulio įjungimas neatgaus adreso, kurio ryšys niekada nevežė.
Tai patikrinimas, kuris nulemia visa kita. Jei užpakalinės dalies partneris yra naršyklės adresas, prievado bendrinimas nėra jūsų problema, o žurnalo formatas yra.
Transporto persiuntimas nėra antraščių įterpimas
Persiuntėjas perkelia baitus. Jis nenagrinėja HTTP, todėl negali įterpti antraštės į užklausą, kurios niekada neskaito kaip užklausos, ir negali nieko pridėti prie TLS srauto, kurį praleidžia nepaliestą. Modulis, laukiantis tarpinio serverio antraštės, toliau lauks tos, kurios joks komponentas negamina.
Originalų adresą gali perduoti du mechanizmai, ir abiem reikia susitarimo abiejuose galuose. PROXY protokolas prideda nedidelę antraštę ryšio pradžioje, o užpakalinė dalis turi būti sukonfigūruota jos laukti; užpakalinė dalis, kuri jos nelaukia, tuos baitus laikys užklausos pradžia ir nepavyks klaidinančiai. Patikimos tarpinio serverio antraštės, pavyzdžiui, X-Forwarded-For, veikia, kai HTTP suprantantis tarpinis serveris jas nustato, o užpakalinei daliai pasakoma, kurie partneriai gali jas tvirtinti.
Nė vienas nėra automatinis, ir nė vienas nėra saugus pagal nutylėjimą. Užpakalinė dalis, kuri tiki bet kuria gaunama persiųsta antrašte, leidžia klientui pasirinkti savo adresą, o tai žurnalo netikslumą paverčia prieigos kontrolės apėjimu. Vieną kartą paleiskite demonstraciją bandomajame hoste, prieš pasitikėdami bet kuria antrašte gamybiniame kelyje.
curl -sS -H 'X-Forwarded-For: 127.0.0.1' https://site.example.com/health
grep -F '127.0.0.1' /var/log/nginx/access.log | tail -n 3
Neprivalomas šaltinių susiejimo katalogas
Prievado bendrinimas turi neprivalomą katalogo argumentą, kuris įrašo susiejimą tarp pradinio šaltinio adreso ir persiuntimo ryšio platformose, kuriose ši funkcija įdiegta. Tikimasi, kad žiniatinklio pusė pasinaudos tuo susiejimu; tai nėra antraštė ir ji neįterpiama į užklausą.
Ši konstrukcija verta dėmesio, nes paaiškina, kodėl kai kurie diegimai praneša tikrus adresus, o kiti ne, esant iš pažiūros identiškai priekinės dalies konfigūracijai. Skirtumas yra priėmimo pusėje, ir jis paprastai glūdi modulyje ar pataisoje, kurios dauguma supakuotų žiniatinklio serverių neįjungia pagal nutylėjimą. Perskaitykite savo žiniatinklio serverio dokumentacijoje, kokį tikslų kabliuką jis siūlo, ir patvirtinkite, kad modulis įkeltas, o ne manykite.
Jei eisite šiuo keliu, traktuokite tai kaip dviejų pusių integraciją: persiuntėjo rašomą susiejimą ir užpakalinės dalies atliekamą paiešką. Patikrinkite abu ir patvirtinkite, kad katalogas išgyvena perkrovimą ir neauga neribotai užimtame klausytojuje.
Nuspręskite, kuris komponentas laiduoja adresą
Prieš keisdami konfigūraciją, įvardykite komponentą, kuriam leidžiama tvirtinti kliento adresą, ir komponentus, kuriems leidžiama juo tikėti. Vienas užrašytas atsakymas apsaugo nuo įprasto dreifo, kai trys skirtingi sluoksniai pasitiki skirtingu šaltiniu.
Trys konstrukcijos patenkina daugumą poreikių. Laikykite viešąjį klausytoją ir žiniatinklio klausytoją atskirai, kad žiniatinklio serveris matytų tikrus partnerius ir nekiltų priskyrimo problema. Priekyje pastatykite HTTP suprantantį atvirkštinį tarpinį serverį, ten užbaikite arba išnagrinėkite užklausą ir leiskite jam nustatyti persiųstą antraštę užpakalinei daliai, kuri pasitiki tik tuo tarpiniu serveriu. Arba palikite prievado bendrinimą ir sutikite, kad žurnalai rodo šuolį, o prieigos taisyklės rašomos pagal programos tapatybę, o ne adresą.
Tai, kas neveikia, yra persiųsto loopback adreso laikymas įrodymu, kad užklausa kilo šioje mašinoje. Ši išvada yra visiškai atvirkščia: adresas yra būtent todėl, kad vietinis komponentas sukūrė ryšį. Taip parašyta taisyklė įleidžia kiekvieną, kuris gali pasiekti klausytoją.
Bandykite taisyklę, o ne puslapį
Įkeliamas puslapis įrodo, kad persiuntimo kelias veikia, ir nieko nesako apie priskyrimą. Bandykite adreso vartotoją: prieigos taisyklę, greičio ribą, audito įrašą, geografinę paiešką.
curl -sS -o /dev/null -w '%{http_code}\n' https://site.example.com/
tail -n 5 /var/log/nginx/access.log
grep -c '' /var/log/nginx/access.log
Palyginkite leistą išorinę užklausą su abiem įrašais, priekinės ir užpakalinės dalies, ir patvirtinkite, kad taisyklė, kuri turėtų atmesti, vis dar atmeta, o ta, kuri turėtų leisti, vis dar leidžia. Jei žurnalo eilutė teisinga, bet taisyklė vis dar elgiasi taip, lyg visi būtų vietiniai, taisyklė skaito kitą lauką nei tas, kurį pataisėte.
Užbaikite įrašydami priskyrimo grandinę į diegimo pastabas: kuris klausytojas, kuris persiuntėjas, kuri antraštė ar susiejimas ir kuri užpakalinė dalis sukonfigūruota ja pasitikėti. Kitam žmogui, kuris skaitys žurnalo eilutę, reikės visų keturių, ir būtent šios pastabos nebuvimas lemia, kad tas pats bilietas po metų vėl atsidaro. Laikykite ją prie konfigūracijos, o ne pokalbių gijoje.