Sovelluksella, joka puhuu vain SOCKS:ia, ei ole tavallisessa VPN:ssä mitään, minkä kanssa puhua, koska tunneli kuljettaa paketteja ja sovellus haluaa välityspalvelimen päätepisteen. OpenSSH voi tarjota tuon päätepisteen, kun pääsyn omistaja sallii sen, koska dynaaminen edelleenohjaus muuttaa yhden SSH-istunnon paikalliseksi välityspalvelimeksi. Sen jälkeen on pidettävä erillään kaksi hyppyä: tunneli, joka saavuttaa SSH-isännän, ja yhteys, jonka tämä isäntä avaa edelleen. Niiden erottaminen selittää sekä sen, miksi järjestely toimii, että sen, mitä se ei koskaan tee.

Mikä SSH-kuuntelijasta tulee ja mikä ei

Dynaaminen edelleenohjaus saa SSH-asiakkaan kuuntelemaan paikallisesti ja puhumaan SOCKS4:ää tai SOCKS5:tä kaiken kanssa, mikä yhdistää. Jokainen pyyntö nimeää kohteen ja SSH-palvelin avaa seuraavan yhteyden, minkä vuoksi kohteen haku voi tapahtua kaukopäässä. Se on sovellustason TCP-edelleenohjausta, ei koko laitteen VPN. Se ei kanna UDP-liitosta, ei ICMP:tä eikä mitään sovelluksille, jotka jättävät välityspalvelinasetukset kokonaan huomiotta. Myöskään hyppy SSH-palvelimesta sovellukseen ei ole tunnelisi sisällä, millä on merkitystä, kun kohde hyväksyy liikennettä vain tunnetuista verkoista.

Edellytykset ovat todellisia: reitti SSH-isäntään, valtuutettu tili, varmennettu palvelimen isäntäavain ja lupa edelleenohjata. Välityspalvelin ei luo niistä yhtäkään, ja viimeinen puuttuu yleensä ensimmäisenä. Vahvista kaikki neljä ennen muun vianetsintää, koska asiakkaan puolelta vika näyttää samalta riippumatta siitä, mikä niistä puuttuu.

Käynnistä se loopbackissa nimenomaisella portilla

Valitse käyttämätön paikallinen portti ja sido se nimenomaisesti loopbackiin sen sijaan, että jättäisit osoitteen pois. Alla olevat kolme vaihtoehtoa ovat olemassa kukin yhdestä syystä.

ssh -D 127.0.0.1:1080 -NT -o ControlPath=none -o ExitOnForwardFailure=yes \
  [email protected]

-N ohittaa etäkomennon ja -T ohittaa pseudoterminaalin, joten istunto on olemassa vain edelleenohjausta varten. ExitOnForwardFailure saa asiakkaan poistumaan, kun kuuntelijaa ei voi luoda, sen sijaan että se toimisi ilman pyytämääsi edelleenohjausta. ControlPath=none pitää istunnon poissa olemassa olevasta multipleksoidusta yhteydestä, joka voisi lisätä omat edelleenohjauksensa. Loopback pitää kuuntelijan poissa lähiverkosta, mutta jaetulla koneella se ei ole valtuutuksen raja, koska myös muut paikalliset prosessit voivat tavoittaa sen. OpenSSH-asiakkaan viite dokumentoi kaikki nämä valitsimet, ja loopbackia koskeva varoitus seuraa siitä, mikä kuunteleva socket on.

Lähetä nimet välityspalvelimen kautta, ei sen ohi

SOCKS5-asiakas voi ratkaista kohteen itse tai pyytää välityspalvelinta tekemään sen, ja tämä valinta ratkaisee, mikä ratkaisija vastaa. Kun käytössä on socks5h, curl lähettää isäntänimen välityspalvelimen kautta, joten haku tapahtuu SSH-palvelimella. Tavallisella socks5:lla kannettava ratkaisee ensin ja vain yhteys matkustaa, mikä hiljaa vesittää tarkoituksen, kun nimi on sisäinen. Alla oleva pyyntö tyhjentää myös ilman välityspalvelinta -luettelon, joten peritty NO_PROXY-arvo ei voi ohjata sitä välityspalvelimen ohi.

curl -sS --noproxy '' --proxy socks5h://127.0.0.1:1080 https://app.corp.example/health

Varmenteen validointi ja sovelluksen oma kirjautuminen pätevät edelleen, koska välityspalvelin ei korvaa kumpaakaan. Jäljelle jää kaksi hakua: kannettavan on saavutettava SSH-isäntä sallittua VPN- ja DNS-reittiä pitkin, ja SSH-palvelimen on ratkaistava sovelluksen nimi itse. Jälkimmäistä voi testata erikseen ennen kuin mitään liikennettä kulkee välityspalvelimen kautta.

ssh [email protected] getent hosts app.corp.example

Todista yksi sallittu kohde ja sulje sitten istunto

Testaa kohdetta, jonka käytäntö sallii, ja sitä, jonka se pitäisi hylätä, koska toimiva edelleenohjaus todistaa vain, että kuuntelija toimii, eikä mitään muuta. Sovellus näkee lähdeosoitteen, jonka SSH-palvelin valitsee, eikä se ole kannettavasi tunneliosoite. Kun kaukopää kirjaa yhteydet lähteen mukaan, tuo ero on ensimmäinen tarkistettava asia, kun pyyntö hylätään.

Pysäytä istunto sen omistavan prosessin kautta sen sijaan, että tappaisit asiaankuulumattoman kuoren. Vahvista sitten, että kuuntelija on poissa, koska portti, joka vielä vastaa, on istunto, jota et todella sulkenut. Poista vain se välityspalvelinasetus, jonka tämä harjoitus toi, ja jätä muu sovelluksen kokoonpano rauhaan. Valvomaton päätelaite, joka pitää edelleenohjaussääntöä, ei ole palvelu, ja pysyvä välityspalvelin tarvitsee hyväksytyn elinkaaren, ei unohdettua ikkunaa.

ss -ltn | grep 1080

Viat, joita tämä järjestely ei voi korjata

Jotkin oireet osoittavat suoraan yllä oleviin rajoihin, ja niiden varhainen tunnistaminen säästää iltapäivän välityspalvelimen vianetsintää. Taulukko yhdistää sen, mitä näet, siihen, mitä se yleensä tarkoittaa. Kaikki viimeisessä sarakkeessa on suunnittelukysymys, ei kokoonpanovirhe.

What you seeWhat it usually meansWhere to look
The app connects and nothing followsIt ignores proxy settings entirelyIts own network settings, not the SSH session
A name resolution error for the destinationThe SSH server cannot resolve itServer resolver and search domains
A UDP-only application failsDynamic forwarding carries TCP onlyThis arrangement cannot serve it
curl works, the browser does notThe browser is not using the socks5h endpointBrowser proxy configuration
The listener answers after the session endedAnother process owns port 1080The ss output, then the owning process

Kolme ensimmäistä riviä ovat niitä, jotka ihmiset diagnosoivat väärin, koska jokainen tuottaa yhteysyrityksen eikä virhettä itse välityspalvelimesta. Nimi, joka ratkeaa kannettavalla, ei kerro mitään palvelimen ratkaisijasta, ja vika luetaan sen sijaan varmenteen tai aikakatkaisun ongelmaksi. Vain UDP:tä käyttävät sovellukset ovat suunnittelun ulkopuolella, eivät rikki sen sisällä, eikä mikään ylimääräinen ssh-valitsin muuta sitä. Selainrivi on tavallinen muistutus siitä, että välityspalvelinasetukset ovat sovelluskohtaisia. Viimeinen rivi on syy sulkemistarkistuksen olemassaoloon: portti, joka vielä kuuntelee, tarkoittaa, että nyt sitä omistaa jokin muu.

Aiheeseen liittyvät artikkelit