Aplikácia, ktorá hovorí len SOCKS, nemá na bežnej VPN s kým hovoriť, pretože tunel prenáša pakety a aplikácia chce koncový bod proxy. OpenSSH môže taký bod poskytnúť, keď to vlastník prístupu dovolí, pretože dynamické presmerovanie mení jednu reláciu SSH na miestnu proxy. Potom treba držať rovno dva skoky: tunel, ktorý dosiahne hostiteľa SSH, a spojenie, ktoré tento hostiteľ následne otvorí. Ich oddelenie vysvetľuje jednak to, prečo usporiadanie funguje, jednak to, čo nikdy neurobí.

Čím sa poslucháč SSH stáva a čím nie

Dynamické presmerovanie núti klienta SSH počúvať lokálne a hovoriť SOCKS4 alebo SOCKS5 so všetkým, čo sa pripojí. Každá požiadavka pomenuje cieľ a server SSH otvorí ďalšie spojenie, a preto sa hľadanie cieľa môže odohrať na vzdialenej strane. To je presmerovanie TCP na úrovni aplikácie, nie VPN pre celé zariadenie. Neprenáša žiadnu asociáciu UDP, žiadne ICMP ani nič pre aplikácie, ktoré úplne ignorujú nastavenia proxy. Ani skok zo servera SSH do aplikácie nie je vnútri vášho tunela, čo je dôležité, keď cieľ prijíma prevádzku len zo známych sietí.

Predpoklady sú skutočné: trasa k hostiteľovi SSH, autorizovaný účet, overený kľúč hostiteľa servera a povolenie presmerovávať. Žiadny z nich proxy nevytvára, a ten posledný zvyčajne chýba ako prvý. Potvrďte všetky štyri, než začnete ladit čokoľvek iné, pretože z pohľadu klienta zlyhanie vyzerá rovnako, ktorýkoľvek chýba.

Spustite ho na loopbacku s výslovným portom

Vyberte nepoužívaný miestny port a výslovne ho zviažte s loopbackom, namiesto toho, aby ste adresu vynechali. Tri možnosti nižšie existujú každá z jedného dôvodu.

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

-N vynechá vzdialený príkaz a -T vynechá pseudoterminál, takže relácia existuje len kvôli presmerovaniu. ExitOnForwardFailure prinúti klienta ukončiť sa, keď poslucháča nemožno vytvoriť, namiesto behu bez požadovaného presmerovania. ControlPath=none drží reláciu mimo existujúceho multiplexovaného spojenia, ktoré by mohlo pridať vlastné presmerovania. Loopback drží poslucháča mimo LAN, ale na zdieľanom stroji to nie je hranica oprávnení, pretože sa k nemu dostanú aj iné miestne procesy. Referencia klienta OpenSSH dokumentuje všetky tieto prepínače a varovanie o loopbacku vyplýva z toho, čo je počúvajúci socket.

Posielajte mená cez proxy, nie okolo nej

Klient SOCKS5 môže cieľ vyriešiť sám alebo o to požiadať proxy, a táto voľba rozhoduje, ktorý resolver odpovie. S socks5h posiela curl meno hostiteľa cez proxy, takže hľadanie prebehne na serveri SSH. S obyčajným socks5 notebook najprv vyrieši sám a cestuje len spojenie, čo potichu ruší zmysel, keď je meno interné. Požiadavka nižšie tiež čistí zoznam bez proxy, takže zdedená hodnota NO_PROXY ho nemôže viesť okolo proxy.

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

Overenie certifikátu aj vlastné prihlásenie aplikácie platia ďalej, pretože proxy nenahrádza ani jedno. Zostávajú dve hľadania: notebook musí dosiahnuť hostiteľa SSH povolenou cestou VPN a DNS a server SSH musí sám vyriešiť meno aplikácie. Druhé možno otestovať samostatne, než cez proxy pretečie akákoľvek prevádzka.

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

Dokážte jeden povolený cieľ a potom reláciu ukončite

Otestujte cieľ, ktorý politika povoľuje, aj ten, ktorý má odmietnuť, pretože funkčné presmerovanie dokazuje len to, že poslucháč funguje, a nič viac. Aplikácia vidí zdrojovú adresu, ktorú zvolí server SSH, a to nie je adresa tunela vášho notebooku. Keď vzdialená strana loguje spojenia podľa zdroja, je tento rozdiel prvou vecou, ktorú treba skontrolovať, keď je požiadavka odmietnutá.

Ukončite reláciu cez proces, ktorý ju vlastní, namiesto zabíjania nesúvisiaceho shellu. Potom potvrďte, že poslucháč zmizol, pretože port, ktorý stále odpovedá, je relácia, ktorú ste v skutočnosti nezatvorili. Odstráňte len nastavenie proxy, ktoré zaviedlo toto cvičenie, a zvyšok konfigurácie aplikácie nechajte na pokoji. Neobsluhovaný terminál s pravidlom presmerovania nie je služba a trvalá proxy potrebuje schválený životný cyklus, nie zabudnuté okno.

ss -ltn | grep 1080

Zlyhania, ktoré toto usporiadanie nedokáže opraviť

Niektoré príznaky ukazujú priamo na vyššie uvedené hranice a ich včasné rozpoznanie ušetrí popoludnie ladenia proxy. Tabuľka spája to, čo vidíte, s tým, čo to zvyčajne znamená. Čokoľvek v poslednom stĺpci je otázka návrhu, nie chyba konfigurácie.

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

Prvé tri riadky sú tie, ktoré ľudia diagnostikujú nesprávne, pretože každý vytvára pokus o spojenie namiesto chyby o samotnej proxy. Meno, ktoré sa vyrieši na notebooku, nič nehovorí o resolveri servera a zlyhanie sa namiesto toho číta ako problém s certifikátom alebo časovým limitom. Aplikácie len s UDP stoja mimo návrhu, nie pokazené vnútri neho, a žiadny ďalší prepínač ssh to nezmení. Riadok s prehliadačom je obvyklá pripomienka, že nastavenia proxy platia pre každú aplikáciu zvlášť. Posledný riadok je dôvod, prečo kontrola pri ukončení existuje: port, ktorý stále počúva, znamená, že ho teraz vlastní niečo iné.

Súvisiace články