SSH тунелиране

Една от големите злини в компютърния свят е постоянното нарушаване на личната тайна на потребителите. Не става дума само за вирусите, които колекционират всичко, което знае за вас компютърът ви (а той знае за вас несравнимо повече, отколкото знаете вие). Нито пък само за злонамерените кракери (“хакери” значи друго!), които подслушват Интернет връзката ви, събират информацията и я продават на, хм, заинтересовани страни. (Чудите ли се откъде крадците разбраха кога сте на излет, за да ви оберат апартамента точно тогава?) Става дума за най-обикновените Интернет провайдери, които търсят средства, за да надконкурират колегите си. Ако вие сте управител на такъв провайдер, ще можете ли лесно да откажете оферта за милиони?…

Друга от големите злини е ограничаването на свързаността ви в Интернет. Формално то пак идва от провайдерите. Някои от тях например много обичат да ви орежат свързаността, и да ви искат повече пари за неорязана. (Науча ли за такива маймуни, пиша тук за тях, за да знаят хората да ги избягват.) Други обаче просто биват принудени да го правят от разни праводържателски корпорации, или държавно-службенски интереси. Независимо от причината, и в двата случая не е приятно. Най-сетне, разни фирми, хотели и прочее много обичат да орязват достъпа на Интернет вътре в тях. Понякога просто се грижат служителите да не висят по цял ден във Фейсбук, вместо да работят – уви, и това го има. Но понякога става дума единствено за нечие его, или пък за пари.

Двете злини се съчетават много добре в условията на “облачните” технологии. Най-нормално и разумно е да не искате да си качите важните файлове при някой външен “облачен” провайдер – ако мислите, че няма да ги продаде на секундата на дискретни купувачи, не живеете на този свят. Сигурно бихте предпочели да използвате за “облак” домашния си компютър, и да се свързвате към него с лаптопа, таблета или смартфона си. Да, но някои провайдери ще ви орежат този достъп. Други няма да ви го орежат, но ще запишат и продадат обменяната информация. Трети ще бъдат коректни с вас, но пък юнакът от паркираната пред хотела ви “баничарка” с подслушвателна апаратура – надали… А може би домашните ви провайдери са истински, но там, където ще ходите, ви режат достъпа до любимия ви сайт? Или искат куп пари специално за него? Също не е рядкост.

Едно елегантно решение на проблемите с блокирането на портове и подслушването на връзки е SSH тунелирането. Същността му е простичка: порт (ако не знаете какво е това, го разбирайте като услуга – уебсървър, поща или каквото и да е друго) на домашния ви компютър се пренасочва към порт на мобилното ви устройство. Трафикът тече между домашния ви компютър и мобилното ви устройство през дебело шифрован канал между портове, които провайдерът ви не блокира.

Звучи ви като на китайски? Не е хубаво. За да го разберете ви трябват съвсем основни познания по компютри, нищо сложно. Нещо като най-основна грамотност. Помислете си как би се чувствал неграмотен човек в непознат град и ще разберете колко полезно би ви било да отделите няколко часа (стигат и артисват), за да научите нещата дотолкова. Защото напоследък само овчарите живеят извън града, наречен Интернет…

Ако ли пък имате някаква представа, дори не съвсем точна, за какво става дума в по-горния абзац, ето и обяснение как се правят нещата. 🙂

Като начало, ви трябва домашен компютър под Линукс. Не е задължително да е супер-дупер-модерен. Чудесна работа ще ви свърши и старият компютър, който планирате да изхвърлите. А ако нямате такъв, купете си за към 150 лева на старо – ще е предостатъчен… Под Уиндоус той ще става в добрия случай за пишеща машина, но под Линукс ще е един чудесен сървър за всичко, което ви е необходимо. Уеб страници, поща, файлове (добавете му един голям харддиск, и той ще побере всичките ви файлове, и ще ги споделя удобно към всички компютри в дома ви), и не на последно място също може да е удобен за пишеща машина или браузване на Интернет. И най-вече, софтуерът ви на него ще е напълно легален – подкрепете легалния софтуер! 🙂

Друго, което ще ви трябва, е статичен IP адрес от провайдера ви. (Ако той не ви го предоставя, или ви иска повече пари за него, и това има заобикаляне – DynDNS и подобни неща. Ще ги опиша обаче някой друг път, да не става този запис прекалено дълъг.) След като имате и това, започваме.

Инсталирайте Линукс. (Писал съм преди някъде как става това, но версията, която описах, вече е доста стара – полезно е да опиша нова, но ще е в последващ запис.) Сложете му:

– ако ще го използвате за тунелиране – SSH сървър (това е темата на този запис – сложете го)
– ако ще го използвате за домашен файлов сървър – Samba
– ако ще го използвате за уеб сървър – Apache, lighthttpd или nginx
– ако ще го използвате за пощенски сървър – Postfix, fetchmail и/или друг пощенски софтуер
– ако ще го използвате за уеб прокси – Squid
и т.н.

Обикновено т.нар. “високи портове” (над 1024) не се блокират от провайдерите – настройте SSH сървъра да работи на такъв. (Влезте с администраторски достъп и отворете за редактиране файла /etc/ssh/sshd_config. Още в началото му ще видите ред, на който пише: Port 22. Сменете го на Port 5522, или което друго число над 1024 ви харесва, и престартирайте SSH сървъра. Ако не знаете как, просто престартирайте компютъра.) Пробвайте да се свържете отвън към вашия IP адрес и избрания от вас порт, най-лесно с програмката telnet – има я и за Уиндоус, и за Линукс. Ако системата ви плюе, че няма отговор, или провайдерът блокира този порт, или сте направили нещо не както трябва – потърсете си грешката и/или сменете порта. Ако излизат разни странни текстове, вероятно съдържащи неща като “OpenSSH”, имате връзка.)

Ще ви трябва също така пълноценен SSH клиент на мобилното ви устройство. Ако то е под Линукс (или Андроид), не е никакъв проблем. 🙂 Ако е под Уиндоус, помислете за вариант на SSH за Уиндоус, или за SSH клиент с поддръжка за форуардване на портове, примерно PuTTY (той ще се настройва по различен от описания начин, но принципно ще върши работа – просто го разцъкайте, и ще видите как става).

След като имате необходимото, се свържете с мобилното си устройство към Интернет извън дома си и стартирайте SSH със следната зловеща команда:

ssh -L localport:localhost:homeport -p homeSSHport user@homeIP

където думичките трябва да бъдат заместени със следното:

– localport: портът на мобилното устройство, на който искате да се появи съответната услуга
– localhost: адресът или името на локалния му хост (обикновено буквалното “localhost” върши работа)
– homeport: портът, на който се намира услугата на домашния ви компютър
– homeSSHport: портът, на който сте настроили да работи SSH сървъра у дома.
– user: потребителският ви акаунт на домашната ви машина
– homeIP: домашният ви IP адрес (става и DNS / DynDNS име, ако го имате)

Резултатът е, че ако насочите съответната програмка на мобилното ви устройство към неговия локален порт localport, тя ще се окаже свързана със съответната услуга на домашния ви сървър. И данните ще се преточват през обещания шифрован канал, към неблокирания порт. 🙂

Твърде омотано? Ето ви пример.

Да предположим, че на домашния си сървър имате импровизирано сайтче, чрез което си вършите някаква работа. (Например, скоро се очаква популярният свободен офис пакет LibreOffice да придобие възможността да работи през уебсървър и браузер, подобно на Google Docs – да кажем, че сте си направили личен “Google Docs” за документите ви.) Ако провайдерът ви блокира входящите връзки към порт 80 (уебсървър), няма да можете да се свържете с него отвън. А и да можете, идеята може да не е добра – не настроите ли HTTPS връзка, което е по-сложничко, всеки ще може да подслуша паролата ви… Затова е хубаво тази връзка да бъде преточена през шифрования канал на SSH.

В този вариант, настройките ви са следните:

– localport – да кажем, 1080 (може и да е 80, но ако портът е “нисък”, ще ви трябва локален администраторски достъп)
– homeIP – вашият домашен IP адрес, примерно 12.34.56.78
– homeport – 80 (уебсървърите обикновено чакат на този порт; ако специално сте конфигурирали вашия да чака на друг, впишете тук него)
– user – името на потребителския ви акаунт на домашния сървър (какъвто сте си го създали при инсталацията; да кажем, joe)
– homeSSHport – номерът, който вписахте в /etc/ssh/sshd_config срещу думата Port (да кажем, 5522)

При този вариант, “зловещата” командна инструкция ще изглежда така:

ssh -L 1080:localhost:80 -p 5022 joe@12.34.56.78

Въвеждате я. SSH ви пита за парола (тази на юзера joe на домашния ви сървър). Пишете я и се оказвате на командния ред на домашния ви сървър. Той може да ви е от полза за много неща (пак предмет на друг запис), но засега го зарежете – важното тук е друго. Отваряте браузера си и въвеждате в полето за сайт:

localhost:1080

и – о, чудо – мобилното ви устройство отваря “блокирания” ви домашен уебсървър. Или ви дава възможност да браузвате Интернет през него, без блокирания, ако сте настроили връзка за прокси. Или започва да сваля пощата ви, ако сте настроили връзка за пощенски клиент. Или ви предоставя каквато и да е друга услуга от домашния сървър. През обещания шифрован канал. 🙂

Разбира се, нещата могат да се опростят. Като начало, можете да запишете “зловещата” команда в шорткътче на екрана или на друго удобно място – само го цъкате и въвеждате парола. Ако сте много убедени, че никога няма да ви откраднат мобилното устройство, можете и да настроите домашния SSH сървър да позволява връзка по ключ от мобилката – тогава няма дори да въвеждате парола. (И можете да направите шорткътчето да отваря автоматично след това и браузера ви с подходящия адрес.) Може да се направят много удобства…

Но основното вече е готово. Честито! 🙂

Може да се напише още много. През SSH можете да форуарднете свой порт нанякъде другаде. Можете да свържете към “облака” си едновременно две мобилки, и да форуарднете порт от едната на другата. Или да ползвате от мобилното си устройство, където и да сте, услуга ограничена до само един IP адрес. Или, ако ви е нужен само порт форуардинг, без командния ред на SSH, да го махнете. Или да си препратите по същия начин екрана на служебния компютър, и да свършите на него спешната работа направо от плажа или хотелското легло с изглед към морето, без риск да ви подслушат. Или каквото още може ум да ви побере, свързано с подсигурено срещу подслушване прехвърляне на информация… Но успеете ли да направите това, със съвсем мъничко четене ще можете и другото сами. Съберете ли смелост да пробвате, ще сте стъпили на пътя на хакера – не кракера, а истинския хакер, онзи от легендите. Добре дошли!

А, щях да забравя. Искате да си ползвате файлсървъра, за да си дръпнете от него малко музика? Еквилибристиката с SSH клиента дори не ви е нужна, въпреки че и през нея става. Инсталирайте си какъв да е клиент, който поддържа SSH трансфери – Filezilla за Уиндоус или Линукс, WinSCP за Уиндоус – и точете каквото искате. Или си пуснете на сървърчето си аудиострийминг и си направете лично онлайн радио. Или…

Накратко – светът е пред вас. Имате свобода.

21 thoughts on “SSH тунелиране

  1. dobo

    Вместо squid, за ползване от един user, бих избрал вградената възможност на ssh да работи като локално proxy. Много по-лесно се настройват програмите, които трябва да минат през тунела, защото ако поддържат socks5 работят много добре.
    autossh user@box -p 5522 -D 6677 -f -C -N

    Reply
  2. Григор Post author

    @dobo: И така става, ако юзерът е един или са малко, и не трябва пък проксито да налага някакви ACL ограничения. 🙂

    Reply
  3. Alexander

    Мисля, че мога да допълня с друга шашма, пак с ssh, като това всъщност е малко по-удобен (според мен) вариант на горното. Става дума за опцията -D, благодарение на която може да се използва ssh тунела като SOCKS4/5 прокси. Използва се по същият начин като горе описаното, но накрая вместо

    ssh -L 1080:localhost:80 -p 5022 joe@12.34.56.78

    пишем:

    ssh -D 1080 -p 5022 joe@12.34.56.78

    След което настройваме програмата (браузър, ftp клиент или каквото и да е, стига да поддържа socks4/5) да използва localhost:1080 като прокси сървър и отваряме каквото си искаме. Ако използваме този начин за връзка, вече не е нужно да сменяме името на хоста, към който се свързваме. Ако искаме да използваме софтуер, който не поддържа socks (в моят случай – наложи ми се да използвам svn) на помощ идва програмката proxychains. Ако има желаещи ще обясня как става работата с нея.

    Reply
  4. JJ

    И с Вин-а стават нещата, макар и не толкова елегантно. Имам машина с Лицензен Win XP refurbished в офиса си -което струва само +60лв към старото P4 IBM-че. Ползвам VPN входяща конекция към Win7 Ultimate мощната машина у дома, и после Remote Desktop Protocol да си гледам екранчето. Става много лесно и елегантно – всъщност RDP може да се ползва и без VPN свързаност, но аз съм малко параноичен. Работя си с програмката за фактуриране, редактирам си документи и си ги принтя на офис принтера, който през RDP си се закача автоматично и излиза в списъка с принтери. За домашно съм си оставил серийния порт да тествам дали ще успее да го прекара през ИП и дали ще вади касови бележки на локалния касов апарат в офиса – ако някой знае дали работи читаво : да свирка.
    Елегантно , но нелегално все пак:
    1. офис пакета на домашния компютър не е легален
    2. разбира се същото важи и за домашната 7-ца
    3. обичам и с CorelDraw и AutoCad да се гъбаркам от време на време – 2000$+
    Като цяло технологията също е проста и надеждна (макар и затворена като протокол) пък и има предимството спрямо Линукс , че счетоводно-фактурната програмка не яде друго освен Виндоуз и ако не съм фокусник и не разбирам от wine (а аз определено не разбирам) няма как да я пусна на такава платформа. Разбира се твоят вариант е по-готин защото е безплатен и легален.
    За DynDns мнението ми е че е работещ, но капризен доставчик когато е безплатен- последния ми сблъсък с него беше покрай замразен акаунт заради изключен от нета рутер. Производителите на рутери много го обичат и в някои по-стари модели е единствен вариант. Разбира се има и алтернативи. На рутера ми е с DD-WRT използвам no-ip.org като динамичен ДНС и съм доволен.

    Reply
  5. Морфиус

    Това го правя със стария си рутер WRT54GL & DDWRT… вярно ако пусна торент клиент през тунела и рутера погива, но за прескачане на други ограничения е перфектно.
    Пути, Проксичейнс или подобна програмка на другата машина и всичко мога да превозя през тунела.
    Старо ПЦ = шум … каня се да си намеря аз някой лаптоп с повреден екран за по-малко пари и да му купя 1 батерия от й-бей…. ще стане перфектен сървър с вграден юпс от него.
    Тихо и сравнително евтино 🙂
    Ама ще трябва да си припомням Линукс … а не съм пипал от повече от 7 години такова.
    @Григор, Микротик дали ще даде по-добра производителност от линксисчето, имам едно в шкафа със сходни характеристики?

    Reply
  6. Само с добро

    Пишеща машина и пликче с марка по традиционния морал са безкрайно по-сигурни от SSH (Rijndael). Да не говорим за някакви неща с PKI и УЕП по PC-та. Не знам как са го замислили с електронното правителство, но настръхвам като се сетя, че хората ще започнат масово да се разписват за тези неща.
    Дори и да внедрят нестандартен код, който Служби и приятели по света не декодират, в крайна сметка пак остават изключително тежките въпроси за Черните кутии в хардуера.
    Не мога да разбера толкова ли е трудно да се спазват някакви елементарни етични правила…

    Reply
  7. Григор Post author

    @Alexander: Сто на сто ще е полезно за някого – ще приема обяснението с удоволствие 🙂

    @JJ: Ако счетоводната програма не е правена на принципа “всичката пара в защитите”, е вероятно да тръгне под най-новите WinE-та без чоплене. Може да си струва да се пробва.

    @Морфиус: На такъв сървър трудничко ще му закачиш голям диск. Иначе идеята е добра. Да пипнеш Линукс определено си струва напоследък. А за Микротика – честно казано, не знам, никога не съм сравнявал.

    @Само с добро: Не съм уверен за сигурността. За повечето служби по света, примерно българските, Rijndael е сигурно някой терорист, но пък пликчето с писмото е златна мина – хартия, специфика на машината, отпечатъци… Нестандартният код обикновено е несравнимо по-слаб от стандартния, истински добрите криптографи го ядат за апетит преди закуската. Черни кутии в повечето съвременни хардуери засега няма; нищо чудно за в бъдеще да проима. (Затова има инициативи от сорта на OpenHardware.) А за етичните правила – нищо лично, просто бизнес…

    Reply
  8. Божо

    може с ssh тунел да се вържете и към машина зад рутер, без портът, който търсим да е форваднат на рутера.
    Примерно ако както в горния пример IP на рутера е 12.34.56.78, а машината, с която искаме да се свържем е с частно IP 192.168.1.10 да речем:

    ssh -L 1080:192.168.1.10:80 -p 5022 joe@12.34.56.78

    и после с
    на localhost:1080 виждаме страницата.
    ( -L означава локален порт – т.е. порт на localhost, така че затова пак търсим localhost)

    Е, в тоя случай зависи дали рутерът приема ssh конекции. Може да имаме пренасочен порт 22 от вътрешна машина и тогава тунелирането става през нея. Изобщо вариантите са много.
    Всъщност в тоя случай е по правилно така:

    ssh -f -N -L 1080:192.168.1.10:80 -p 5022 joe@12.34.56.78

    за да не се логваме излишно на тунелиращата машина.

    Reply
  9. Данаил

    Аз също предпочитам някой лаптоп с повреден дисплей пред старата машина. Първо по-тих е, второ има си собствен UPS и трето, сметката за тока става сравнително по-малка (машинката която сега ползвам за тези нужди харчи около 15лв на месец, може и 20 да са).
    Микротик е платена дистрибуция оптимизирана за управление на мрежи, рутиране и т.н. всяка Линукс дистрибуция е много по-гъвкава от нея, макар по производителност да отстъпва с някакви проценти . Но като помислим, тук идва реч за домашен облак, няма да го ползват 2000+ човека едновременно. Тук 4-5% производителност не са фатални.

    Reply
  10. Само с добро

    Търговия без балансирани правила и честни участници води до конфликти. Освен това някои неща са незаменими.
    Под “Черна кутия” имах предвид всеки механизъм в хардуера/софтуера, за който обикновените потребители не знаят нищо. На практика някакви хора изпълват пространството около нас, близко и далечно, с “Черни кутии”, чрез които ни шпионират и манипулират, което си е, меко казано, социална несправедливост и потъпкване на основни човешки права.
    Справедливост, доброта и висок морал в обществото са нужни; криптографията не може да реши човешките проблеми.

    Reply
  11. Григор Post author

    @Божо: Според мен логването на тунелиращата машина често е полезно. 🙂

    @Данаил: Надали има 4-5% разлика в производителността, освен ако машината не е едновременно изключително слаба и натоварена до края на възможностите си. Рутирането и управлението на мрежите обикновено се прави от ядрото, рядко от някоя и друга допълнителна програмка, така че се върши при максимална ефективност – сериозно бих се изненадал, ако разликата в производителността е над 2% дори за най-граничните реално представими случаи.

    @Само с добро: Моето впечатление е, че справедливостта, добротата и високият морал в обществото се възпитават от наличието на убедителни мерки срещу тези, които не ги изповядват. В противен случай гаднярите се оказват в изгодна позиция. Както казва Тери Пратчет, ако искаш да се не начудиш колко много можеш да постигнеш с блага дума, дръж в ръка дебела тояга.

    Reply
  12. Данаил

    Григор, аз избрах числата 4 и 5 за да подчертая колко малка е разликата. Реално не съм тествал колко ще е разликата. Но за нашия случак дори и 10% да е разликата, пак няма да го усетим. Иначе радвам се че съм преувеличил разликата и тя е по-малка.

    Reply
  13. Само с добро

    Тоягата ми приключи още преди да стане дебела. Нова не мога да си отгледам, но хората имат избор и вярвам, че няма да позволят да ги набутат в антиутопията, която им готвят.

    Reply
  14. Божо

    “Пишеща машина и пликче с марка по традиционния морал са безкрайно по-сигурни от SSH”

    което показва, че не си живял по времето на социализЪма
    😀

    И не си видял, как на плика не му личи да е отварян, а неща, за които знаеш че са изпратени, не са там 😉

    Reply
  15. Само с добро

    Да кажем, че това е въпрос на мироглед и чувство за естетика.
    И не, не харесвам фантастика и винаги съм се опитвал да бъда толерантен към хората, които са се държали надменно с мен. Хората си правят някакви проекции за мен без да отчитат факта, че всъщност нямат право да налагат мнението си, тъй като личното ми пространство е извън тяхната компетенция. Всъщност някои от тях преминаха всякакви граници.

    Reply
  16. Кал

    Има ли вече български софтуер за генериране на (привидно) свързани изречения?

    (Навремето бях попаднал на един англоезичен генератор за гневни писма. Задаваш му колко абзаца искаш да е дълго писмото, облягаш се назад и си умираш от смях. Огромна част от писмата звучаха що-годе свързано. А за генератора на поезия на Ray Kurzweil да не говорим изобщо…)

    Reply
  17. Божо

    Бе сещам се за генератора на простотии на Георги Чорбаджийски, ама не ми се иска да го поствам адреса, че четат и малки деца и хора с морални принципи 😀

    Reply
  18. Григор Post author

    @Кал: Като ученик, преди 30 години, бях писал (на Правец-82) генератор за доклади. Задаваш му колко изречения да е дълъг докладът и колко често да слага нов ред, и гледаш сеир. Единствено трябваше да сложиш заглавие на доклада и да си го препишеш от екрана – към този момент не ми беше известно да има принтер за Правеца… 🙂

    Reply
  19. Морфиус

    Тоя микротик (желязото) го купувах навремето като доставчиците ни бяха трагични, а исках да имам Интернет (тая играчка с оня капацитет се справяше чудесно, лоуд балансинг със “статични” сесии и приоритети)… но после доживях да видя оптично влакно в апартамента си и стана не само излишен но и неизползваем – натоварен се спъваше на 35 Мб/с а шейпъра на доставчика е на 70 Мб/с. ОС а си върви с желязото.
    Въпроса ми беше, ще се справи ли само като SSH сървър/прокси по-добре от Linksys WRT54GL & DD-WRT… всичко друго освен ядрото изключено, при сходни характеристики на процесорите им.
    Дето се вика, хем дребно, хем безшумно, хем така и така събира прах в шкафа.

    Reply
  20. Pingback: Grigor Gatchev – A Weblog » Blog Archive » Още SSH трикове

Leave a Reply

Your email address will not be published. Required fields are marked *