Праграма, якая разумее толькі SOCKS, не мае з чым размаўляць у звычайным VPN, бо тунель пераносіць пакеты, а праграме патрэбна кропка проксі. OpenSSH можа даць гэтую кропку, калі ўладальнік доступу дазваляе, бо дынамічнае перанакіраванне ператварае адну сесію SSH у лакальны проксі. Далей ёсць два пераходы, якія трэба трымаць паасобку: тунель, што дасягае хоста SSH, і злучэнне, якое гэты хост адкрывае далей. Іх раздзяленне тлумачыць і тое, чаму схема працуе, і тое, чаго яна ніколі не зробіць.

Чым слухач SSH становіцца, а чым не

Дынамічнае перанакіраванне прымушае кліент SSH слухаць лакальна і гаварыць SOCKS4 або SOCKS5 з усім, што падключаецца. Кожны запыт называе пункт прызначэння, і сервер SSH адкрывае далейшае злучэнне, таму пошук пункта прызначэння можа адбывацца на далёкім баку. Гэта перанакіраванне TCP на ўзроўні праграмы, а не VPN для ўсёй прылады. Яно не нясе ні асацыяцыі UDP, ні ICMP, ні чаго-небудзь для праграм, якія цалкам ігнаруюць налады проксі. Пераход ад сервера SSH да праграмы таксама не ўнутры вашага тунеля, што важна, калі пункт прызначэння прымае трафік толькі з вядомых сетак.

Папярэднія ўмовы рэальныя: маршрут да хоста SSH, аўтарызаваны ўліковы запіс, правераны ключ хоста сервера і дазвол на перанакіраванне. Ніводную з іх не стварае проксі, і апошняя звычайна адсутнічае першай. Пацвердзіце ўсе чатыры, перш чым што-небудзь іншае, бо збоі выглядаюць аднолькава з кліента, якая б з іх ні была адсутная.

Запусціце яго на loopback з яўным портам

Выберыце вольны лакальны порт і прывяжыце яго яўна да loopback, а не пакідайце адрас пустым. Тры параметры ніжэй існуюць кожны па сваёй прычыне.

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

-N прапускае аддаленую каманду, а -T прапускае псеўдатэрмінал, так што сесія існуе толькі для перанакіравання. ExitOnForwardFailure прымушае кліент выйсці, калі слухач не можа быць створаны, замест працы без запытанага перанакіравання. ControlPath=none трымае сесію па-за існуючым мультыплексаваным злучэннем, якое магло б дадаць свае перанакіраванні. Loopback трымае слухач па-за LAN, але на агульнай машыне гэта не мяжа аўтарызацыі, бо іншыя лакальныя працэсы таксама могуць да яго дабрацца. Даведка кліента OpenSSH апісвае ўсе гэтыя параметры, і папярэджанне пра loopback вынікае з таго, чым з’яўляецца слухаючы сокет.

Праводзьце імёны праз проксі, а не вакол яго

Кліент SOCKS5 можа сам вырашыць пункт прызначэння або папрасіць гэта зрабіць проксі, і гэты выбар вызначае, які рэзалвер адкажа. З socks5h curl перадае імя хоста праз проксі, таму пошук адбываецца на серверы SSH. З простым socks5 ноўтбук спачатку вырашае сам, і падарожнічае толькі злучэнне, што ціха знішчае сэнс, калі імя ўнутранае. Запыт ніжэй таксама ачышчае спіс без проксі, каб унаследаванае значэнне NO_PROXY не магло накіраваць яго вакол проксі.

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

Праверка сертыфіката і ўласны ўваход праграмы па-ранейшаму дзейнічаюць, бо проксі не замяняе ні таго, ні таго. Застаюцца два пошукі: ноўтбук павінен дасягнуць хоста SSH праз дазволены шлях VPN і DNS, а сервер SSH павінен сам вырашыць імя праграмы. Другі можна праверыць асобна, перш чым любы трафік пойдзе праз проксі.

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

Дакажыце адзін дазволены пункт прызначэння, потым зачыніце сесію

Праверце пункт прызначэння, які дазваляе палітыка, і той, які яна павінна адхіліць, бо працоўнае перанакіраванне даказвае толькі тое, што слухач працуе, і больш нічога. Праграма бачыць адрас крыніцы, які выбірае сервер SSH, а гэта не адрас тунеля вашага ноўтбука. Калі далёкі бок запісвае злучэнні па крыніцы, менавіта гэта розніца — першае, што варта праверыць, калі запыт адхілены.

Спыніце сесію праз працэс, які ёю валодае, а не забіваючы староннюю абалонку. Потым пераканайцеся, што слухач знік, бо порт, які ўсё яшчэ адказвае, — гэта сесія, якую вы насамрэч не зачынілі. Выдаліце толькі наладу проксі, якую ўвяло гэтае практыкаванне, і пакіньце астатнюю канфігурацыю праграмы ў спакоі. Тэрмінал без нагляду з правілам перанакіравання — не служба, і пастаянны проксі патрабуе ўзгодненага жыццёвага цыкла, а не забытага акна.

ss -ltn | grep 1080

Збоі, якія гэтая схема не можа выправіць

Некаторыя сімптомы ўказваюць прама на абмежаванні вышэй, і ранняе іх распазнанне зэканоміць паўдня на адладцы проксі. Табліца суадносіць тое, што вы бачыце, з тым, што гэта звычайна значыць. Усё ў апошнім слупку — пытанне праектавання, а не памылка канфігурацыі.

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

Першыя тры радкі — гэта тыя, якія людзі дыягнастуюць няправільна, бо кожны дае спробу злучэння, а не памылку пра сам проксі. Імя, якое вырашаецца на ноўтбуку, нічога не кажа пра рэзалвер сервера, і збой чытаецца як праблема сертыфіката або тайм-аўту. Праграмы толькі з UDP стаяць па-за межамі схемы, а не зламаныя ўнутры яе, і ніякі дадатковы параметр ssh гэтага не зменіць. Радок пра браўзер — звычайнае напамінанне, што налады проксі дзейнічаюць для кожнай праграмы асобна. Апошні радок — прычына існавання праверкі закрыцця: порт, які ўсё яшчэ слухае, азначае, што цяпер ім валодае нешта іншае.

Падобныя артыкулы