Апликацијата што зборува само 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 опција тоа не го менува. Редот за прелистувачот е вообичаеното потсетување дека поставките за прокси важат за секоја апликација одделно. Последниот ред е причината зошто постои проверката при затворање: порта што уште слуша значи дека сега нешто друго ја поседува.

Поврзани статии