Динамично SSH препраќање како SOCKS прокси преку вашиот VPN
Апликацијата што зборува само SOCKS нема крајна точка за прокси на обичен VPN. Два скока, еден loopback слушател и едно барање на име што мора сам да го направи SSH серверот.
Апликацијата што зборува само 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 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 |
Првите три редови се тие што луѓето погрешно ги дијагностицираат, бидејќи секој создава обид за врска наместо грешка за самото прокси. Името што се решава на преносниот сметач не кажува ништо за решавачот на серверот, а грешката наместо тоа се чита како проблем со сертификат или рок. Апликациите само со UDP стојат надвор од дизајнот, а не расипани внатре во него, и никаква дополнителна ssh опција тоа не го менува. Редот за прелистувачот е вообичаеното потсетување дека поставките за прокси важат за секоја апликација одделно. Последниот ред е причината зошто постои проверката при затворање: порта што уште слуша значи дека сега нешто друго ја поседува.