SSTP nepavyksta ten, kur naršyklės HTTPS pavyksta: kodėl
SSTP veikia TLS viduje 443 prievade, bet tai nėra žiniatinklio užklausa. Tikrinkite TCP, TLS tapatybę, SSTP mainus ir PPP autentifikavimą kaip atskirus etapus.
Naršyklė atveria VPN pagrindinio kompiuterio vardą per HTTPS be priekaištų, o SSTP klientas vis tiek atsisako prisijungti. Šioje poroje nėra nieko prieštaringo. SSTP naudoja TLS kaip išorinį transportą ir tada tame pačiame ryšyje vykdo savo užklausą bei PPP naudingąją apkrovą, todėl sėkmingas puslapio įkėlimas įrodo tik vieną siaurą dalyką: serveris atsako į GET 443 prievade. Klientas užduoda kitą klausimą, o serveris gali į jį atsakyti blogai.
Puslapis įkeliamas, o tunelis ne
Žmonės griebiasi naršyklės testo, nes jis greitas, o paskui rezultatą laiko įrodymu, kad serveris pasiekiamas ir sukonfigūruotas. Tai įrodymas apie GET į kelią, kurį atidarė adreso juosta, ir nieko daugiau. VPN pokalbis prasideda po to paties TLS rankos paspaudimo, bet siunčia metodą ir kelią, kurių žiniatinklio puslapis niekada nenaudoja. Todėl 200 atsakymas naršyklei nieko nesako apie tai, ar SSTP galinis taškas egzistuoja.
Atskirkite du stebėjimus ir paieška sutrumpės. Transportas ir sertifikatų grandinė veikia, o kažkas protokolo mainuose virš jų neveikia. Tai kitas tyrimas nei sugedęs prievadas ar pasibaigęs sertifikatas, ir jam reikia kitų įrodymų.
Ką SSTP klientas iš tikrųjų siunčia
Klientas siunčia HTTP užklausą metodu SSTP_DUPLEX_POST į kelią /sra_{GUID}/, tada laiko ryšio turinį atvirą kaip dvikryptį srautą, kuris neša PPP kadrus. Atitinkantis serveris atsako HTTP/1.1 200 ir nustoja elgtis kaip žiniatinklio serveris. Visa kita yra parašas: 405 arba 404 reiškia, kad galinio taško nėra, 301 arba 302 reiškia, kad kažkas nukreipia užklausą, o momentinis FIN reiškia, kad tarpinė ar serveris uždarė srautą.
Todėl taikinys turi būti SSTP serveris, o ne žiniatinklio serveris su prisuktu TLS sertifikatu. Metodas, kelias ir ilgalaikis turinys yra protokolo reikalavimai, todėl atvirkštinė tarpinė negali jų pridėti vien konfigūracija. Tarpinė, kuri puikiai perduoda įprastą HTTPS, vis tiek gali atmesti metodą, kurio nepažįsta.
Kur tarpinė ar žiniatinklio serveris nutraukia srautą
Tarpininkas patikrina HTTP užklausos eilutę prieš ką nors perduodamas, o pasirinktinis metodas su neįprastu keliu gali nepraeiti jo taisyklių. Kai kurie įrenginiai tiekia įprastą puslapį, o tunelį atmeta arba nutraukia, todėl klientas praneša apie ryšį, kuris prasideda ir paskui miršta, o ne apie švarų atmetimą. Kiti priima užklausą, o tada taiko turinio arba neveiklumo laiko limitą, kurio PPP keepalive pranešimai neatlaiko. Abu kliento pusėje atrodo vienodai, todėl nepavykęs etapas svarbesnis už klaidos tekstą.
443 prievado bendrinimas tarp svetainės ir SSTP yra maršrutizavimo pasirinkimas, o ne pažadas, kad kiekvienas šuolis abu pokalbius tvarkys vienodai. Jei kelyje yra apkrovos balansuotojas, ugniasienė ar TLS terminatorius, pridėkite jį prie įtariamųjų sąrašo prieš liesdami VPN konfigūraciją.
Tikrinkite etapus atskirai
Vykdykite patikras iš eilės ir sustokite ties pirmąja klaida, nes kiekvienas etapas atmeta skirtingą sluoksnį. Žemiau esanti TLS zondas atskiria sertifikato tapatybę nuo visko, ką daro SSTP. Pakeiskite pagrindinio kompiuterio vardą savo galiniu tašku ir perskaitykite subject bei grandinę, kurią jis išspausdina.
openssl s_client -connect vpn.example.com:443 -servername vpn.example.com
Tada susiekite likusius įrodymus su etapais, o ne spėliokite iš kliento klaidos. Žemiau esanti lentelė yra kontrolinis sąrašas, kurį cituoti biliete, su parašu, skiriančiu vieną nesėkmę nuo kitos.
| Stage | What it proves | Failure signature |
|---|---|---|
| TCP to 443 | A listener exists and the path is open | Timeout or connection refused |
| TLS with SNI | The certificate matches the name you use | Name mismatch or untrusted chain |
| SSTP_DUPLEX_POST exchange | The endpoint is an SSTP server | 405, 404, 301 or an early FIN |
| PPP authentication | The user credential was accepted | Auth failure after a 200 response |
| Inner routing | A permitted destination is reachable | Tunnel up, no reply from the target |
Biliete užrašykite paskutinį sėkmingą etapą, o ne rašykite "nepavyksta prisijungti". MS-SSTP specifikacija dokumentuoja užklausą ir PPP mainus, einančius po TLS rankos paspaudimo, ir yra nuoroda, kodėl naršyklės testas negali pakeisti nė vieno iš jų.
Pirmiausia tapatybė, tada PPP
TLS tapatybė ir PPP autentifikavimas yra nuoseklūs, ne alternatyvūs, ir jų painiojimas nukreipia žmones prie neteisingo serverio nustatymo. Klientas pirmiausia patikrina serverio sertifikatą ir jo numatytą paskirtį, tada PPP derasi dėl savo būsenos ir autentifikuoja naudotoją iššūkio-atsakymo metodu arba EAP. Sertifikato problema duoda kitokią klaidą nei atmestas slaptažodis, ir nė viena klaida neaprašo etapo, kurį apima kita.
Pagrindinio kompiuterio vardo pakeitimas adresu arba sertifikato įspėjimo praleidimas pašalina patikrą, kuri būtų nustačiusi nepavykusį etapą, o ne ją ištaiso. Palikite įspėjimą ir perskaitykite jį. Taip pat neatstatykite PPP slaptažodžio, kai HTTP mainai niekada nepasiekė SSTP elgsenos, nes prisijungimo duomenų niekada nebuvo prašoma.