Dinaminis SSH peradresavimas kaip SOCKS tarpinė serveris per jūsų VPN
Programa, kuri kalba tik SOCKS, įprastame VPN neturi tarpinio serverio galinio taško. Du šuoliai, vienas loopback klausytojas ir vienas vardo ieškojimas, kurį turi atlikti pats SSH serveris.
Programa, kuri kalba tik SOCKS, įprastame VPN neturi su kuo kalbėtis, nes tunelis perneša paketus, o programa nori tarpinio serverio galinio taško. OpenSSH gali suteikti tą tašką, kai prieigos savininkas leidžia, nes dinaminis peradresavimas vieną SSH sesiją paverčia vietiniu tarpiniu serveriu. Tada reikia aiškiai skirti du šuolius: tunelį, kuris pasiekia SSH mazgą, ir ryšį, kurį tas mazgas toliau atidaro. Jų atskyrimas paaiškina ir kodėl ši tvarka veikia, ir ko ji niekada nedarys.
Kuo SSH klausytojas tampa ir kuo ne
Dinaminis peradresavimas verčia SSH klientą klausytis vietoje ir kalbėtis SOCKS4 arba SOCKS5 su viskuo, kas prisijungia. Kiekviena užklausa įvardija paskirties tašką, o SSH serveris atidaro tolesnį ryšį, todėl paskirties taško paieška gali vykti kitoje pusėje. Tai TCP peradresavimas programų lygmeniu, o ne VPN visam įrenginiui. Jis neperneša nei UDP asociacijos, nei ICMP, nei nieko programoms, kurios visiškai ignoruoja tarpinio serverio nustatymus. Šuolis nuo SSH serverio iki programos taip pat nėra jūsų tunelio viduje, o tai svarbu, kai paskirties taškas priima srautą tik iš žinomų tinklų.
Būtinosios sąlygos yra realios: maršrutas iki SSH mazgo, įgaliota paskyra, patikrintas serverio mazgo raktas ir leidimas peradresuoti. Nė vienos jų nesukuria tarpinis serveris, o paskutinės paprastai trūksta pirmiausia. Patvirtinkite visas keturias prieš ieškodami ko nors kito, nes iš kliento pusės gedimas atrodo vienodai, kurios bebūtų trūkstama.
Paleiskite jį loopback sąsajoje su aiškiu prievadu
Pasirinkite nenaudojamą vietinį prievadą ir aiškiai pririškite jį prie loopback, o ne palikite adresą nenurodytą. Trys žemiau esančios parinktys egzistuoja kiekviena dėl vienos priežasties.
ssh -D 127.0.0.1:1080 -NT -o ControlPath=none -o ExitOnForwardFailure=yes \
[email protected]
-N praleidžia nuotolinę komandą, o -T praleidžia pseudoterminalą, todėl sesija egzistuoja tik peradresavimui. ExitOnForwardFailure priverčia klientą išeiti, kai klausytojo sukurti negalima, o ne veikti be prašyto peradresavimo. ControlPath=none laiko sesiją už esamo multipleksuoto ryšio, kuris galėtų pridėti savo peradresavimus. Loopback laiko klausytoją už LAN ribų, bet bendrinamoje mašinoje tai nėra įgaliojimų riba, nes ir kiti vietiniai procesai gali jį pasiekti. OpenSSH kliento nuoroda dokumentuoja visus šiuos parametrus, o įspėjimas dėl loopback kyla iš to, kas yra klausantis lizdas.
Siųskite vardus per tarpinį serverį, o ne aplink jį
SOCKS5 klientas gali pats išspręsti paskirties tašką arba paprašyti tarpinio serverio tai padaryti, ir šis pasirinkimas nulemia, kuris sprendėjas atsakys. Su socks5h curl siunčia mazgo vardą per tarpinį serverį, todėl paieška vyksta SSH serveryje. Su paprastu socks5 nešiojamasis kompiuteris pirmiausia išsprendžia, ir keliauja tik ryšys, o tai tyliai panaikina prasmę, kai vardas yra vidinis. Žemiau esanti užklausa taip pat išvalo sąrašą be tarpinio serverio, kad paveldėta NO_PROXY reikšmė negalėtų jos nukreipti aplink tarpinį serverį.
curl -sS --noproxy '' --proxy socks5h://127.0.0.1:1080 https://app.corp.example/health
Sertifikato tikrinimas ir pačios programos prisijungimas vis dar galioja, nes tarpinis serveris nepakeičia nė vieno. Lieka dvi paieškos: nešiojamasis kompiuteris turi pasiekti SSH mazgą leidžiamu VPN ir DNS keliu, o SSH serveris turi pats išspręsti programos vardą. Antrąją galima išbandyti atskirai prieš tai, kai bet koks srautas eis per tarpinį serverį.
ssh [email protected] getent hosts app.corp.example
Įrodykite vieną leidžiamą paskirties tašką, tada uždarykite sesiją
Išbandykite paskirties tašką, kurį politika leidžia, ir tą, kurį ji turėtų atmesti, nes veikiantis peradresavimas įrodo tik tai, kad klausytojas veikia, ir nieko daugiau. Programa mato šaltinio adresą, kurį pasirenka SSH serveris, ir tai nėra jūsų nešiojamojo kompiuterio tunelio adresas. Kai tolimoji pusė registruoja ryšius pagal šaltinį, tas skirtumas yra pirmas dalykas, kurį reikia patikrinti, kai užklausa atmetama.
Sustabdykite sesiją per jai priklausantį procesą, o ne žudydami nesusijusį apvalkalą. Tada patvirtinkite, kad klausytojo nebėra, nes prievadas, kuris dar atsako, yra sesija, kurios tikrai neuždarėte. Pašalinkite tik tą tarpinio serverio nustatymą, kurį įvedė šis pratimas, o likusią programos konfigūraciją palikite ramybėje. Neprižiūrimas terminalas su peradresavimo taisykle nėra paslauga, ir nuolatiniam tarpiniam serveriui reikia patvirtinto gyvavimo ciklo, o ne pamiršto lango.
ss -ltn | grep 1080
Gedimai, kurių ši tvarka negali ištaisyti
Kai kurie simptomai rodo tiesiai į aukščiau nurodytas ribas, o ankstyvas jų atpažinimas sutaupo popietę tarpinio serverio derinimo. Lentelė susieja tai, ką matote, su tuo, ką tai paprastai reiškia. Viskas paskutiniame stulpelyje yra dizaino klausimas, o ne konfigūracijos klaida.
| What you see | What it usually means | Where to look |
|---|---|---|
| The app connects and nothing follows | It ignores proxy settings entirely | Its own network settings, not the SSH session |
| A name resolution error for the destination | The SSH server cannot resolve it | Server resolver and search domains |
| A UDP-only application fails | Dynamic forwarding carries TCP only | This arrangement cannot serve it |
| curl works, the browser does not | The browser is not using the socks5h endpoint | Browser proxy configuration |
| The listener answers after the session ended | Another process owns port 1080 | The ss output, then the owning process |
Pirmosios trys eilutės yra tos, kurias žmonės diagnozuoja klaidingai, nes kiekviena sukuria prisijungimo bandymą, o ne klaidą apie patį tarpinį serverį. Vardas, kuris išsprendžiamas nešiojamajame kompiuteryje, nieko nesako apie serverio sprendėją, o gedimas skaitomas kaip sertifikato arba laiko limito problema. Programos, veikiančios tik su UDP, stovi už dizaino ribų, o ne sudužusios jo viduje, ir jokia papildoma ssh parinktis to nepakeis. Naršyklės eilutė yra įprastas priminimas, kad tarpinio serverio nustatymai galioja kiekvienai programai atskirai. Paskutinė eilutė yra priežastis, kodėl egzistuoja uždarymo patikra: prievadas, kuris dar klausosi, reiškia, kad dabar jį valdo kažkas kitas.