Введение

Хочу рассказать про один из способов, как можно использовать SSH сервер, "если, конечно, он у вас есть"©. Предположим, вы являетесь обладателем такого сервера. К тому же, у вас есть публичный IP адрес, который позволяет достучаться до машины, железной или виртуальной - не суть важно - на которой этот SSH сервер работает. Ну, примерно, как у меня 😉.

А что есть у меня? У меня есть "белый" IP адрес. Он условно статический - если я не забываю вовремя оплачивать интернет, он не меняется[1]. Есть у меня и зарегистрированный домен, который я связал с этим адресом - но это условие не является обязательным. Есть и компьютер с Windows 10, на котором запущен SSH сервер. Вопрос: как можно это всё использовать? И ответ: очень по-разному, и сегодня посмотрим, как можно развернуть SOCKS proxy.

Что такое proxy сервер

Для начала разберем, что это за зверь такой - proxy сервер, и зачем он нужен. Proxy часто используют для организации выхода в интернет нескольких компьютеров, при том, что физически такая возможность есть только у одного из них. Именно на этой машине и запускают proxy сервер. На других же компьютерах настраивают программное обеспечение (например, браузеры) таким образом, чтобы использовать этот proxy сервер для выхода в интернет. В результате, если всё сделано правильно, эти компьютеры, точнее, браузеры, работающие на них, получают доступ во всемирную паутину.

Владелец же proxy получает возможность управлять доступом всех клиентов, подключившихся к его серверу. Что под этим подразумевается? Например, он может ограничивать скорость доступа для клиентов, разрешать или запрещать доступ к определенным ресурсам, производить аутентификацию пользователей, вести учёт объёма потреблённого трафика, осуществлять кеширование. Вообщем, может очень многое. Именно поэтому proxy сервера так любят сетевые администраторы на различных предприятиях.

В домашних условиях proxy сервера сегодня используются редко. Я поднимал такой, когда выходил в интернет через простейший ADSL модем году так в 2009 - нужно было через один модем вывести в интернет два компа. В наши дни большинство людей используют дома роутеры, которые сейчас почти поголовно имеют встроенную реализацию механизма NAT, что позволяет устройствам в локальной сети получать доступ в интернет. При этом, от конечных пользователей практически не требуется производить специальную настройку своего программного обеспечения, не то, что в случае с proxy. Правда, NAT не позволяет реализовывать такое управление подключенными компьютерами, как proxy сервер, но в домашних условиях этого, как правило, и не требуется.

Proxy бывают разными. Чаще всего используются HTTP proxy, которые позволяют перенаправлять HTTP трафик от конечного устройства до требуемого ресурса. Существуют FTP proxy, позволяющие работать по протоколу FTP, нельзя не упомянуть и HTTPS proxy, которые, по факту, являются теми же HTTP proxy, только работают с зашифрованным трафиком. В настоящее время считается, что самыми прогрессивными являются SOCKS proxy, вернее, последняя версия - SOCKS5 proxy. Эти proxy изначально анонимные - конечный ресурс не узнает, какой у вас адрес и вас никто не "вычислит по IP" 😉. Кроме того, даже факт использования proxy останется скрытым. К тому же, SOCKS5 proxy работают как по протоколу TCP, так и по протоколу UDP, и, в отличии от SOCKS4, умеют производить аутентификацию пользователей. В общем, как написал выше - самые прогрессивные.

На самом деле, я не собираюсь углубляться в эту тему - тему proxy серверов, NAT и прочих высоких материй. Будем считать, что приличия соблюдены и минимальный реверанс в сторону ознакомительной информации завершён.

Как можно использовать proxy сервер

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

Дело в том, что я использую несколько провайдеров: дома - один провайдер, на даче - другой. Я не буду сейчас рекламировать того или иного провайдера, отмечу лишь, что дома используется "приземленный", стационарный, так сказать, провайдер, с оборудованием на чердаке подъезда, проводами по стояку, дырками в стенах и так далее и тому подобное, а на даче - обычный мобильный провайдер. Но, так случилось, что разница между ними заключается не только в "мобильности".

Мобильный провайдер - самый обычный. В том числе и в отношении того, как он исполняет блокировки Роскомнадзора. А вот домашний провайдер... С ним что-то не так... Есть некоторое количество сайтов, которые меня интересуют, и которые должны блокироваться, по крайней мере, они есть в списке РКН, но, почему-то, через домашнего провайдера я могу до них достучаться. Не подумайте ничего плохого, это не какие-то террористические и порнографические сайты, и не сайты с пропагандой суицидов или нацизма, а вполне себе безобидные сайты, например, linkedin.com.

Что должен делать человек, который хочет получить доступ к заблокированному сайту? Вообще говоря, есть довольно широкий список возможностей. Тут и расширения/дополнения для браузеров, использование заграничных proxy серверов и VPN, всевозможных TOR и Shadowsocks. Но... любое использование стороннего сервиса ослабляет безопасность и увеличивает вероятность несанкционированного доступа к вашим данным.

Я являюсь убежденным сторонником собственных сервисов. Можно, конечно, найти хостера и развернуть у него собственный proxy или VPN сервер. Правда, в этом случае желательно, чтобы сервера хостера территориально были размещены за пределами влияния списков РКН и, кроме того, следует учесть, что придётся платить, причем ежемесячно. И чем активнее вы будете пользоваться этими серверами/сервисами, тем больше надо будет платить, так как, при расчёте стоимости, учитывается не только количество и мощь выделяемых вам процессоров, объём ОЗУ и дискового пространства, но и банальный трафик. В общем, если есть возможность избежать использования сторонних хостеров и развернуть нужный сервис у себя, то надо такой возможностью пользоваться. Мне в этом смысле повезло, не пришлось искать заморского хостера и платить ему.

Почему именно proxy

Почему для обхода блокировок я решил использовать proxy? Почему не стал использовать VPN, например? Ну почему же не стал - я использую VPN и довольно часто. Но, все-таки, VPN - это немного про другое, хотя и замечательным образом позволяет обходить блокировки. На мой взгляд, это, примерно, как "из пушки по воробьям". К тому же, не всегда удобно.

Ну, например, предположим, что я сижу и удаленно работаю на своей рабочей виртуалке - при помощи VMWare Horizon Client. И что тут такого? Пока ничего, но представим, что по каким-то причинам мне буквально приспичило зайти на этот самый linkedin.com. Если, заходя удаленно на рабочий компьютер, я использовал "чистый" интернет от провайдера, то, при включении VPN для просмотра заблокированного сайта, Horizon Client просто сбросит соединение и мне придется коннектиться заново. Ничего страшного, но - неудобно. Можно, конечно, всё время сидеть в VPN, и, возможно, когда-нибудь я к этому и приду, но пока я так не делаю.

Так вот, в описанной выше ситуации использование proxy решает и саму задачу доступа к заблокированному ресурсу и удаленный сеанс продолжает свою работу, ведь для установленного при помощи Horizon Client-a соединения ничего не изменилось, proxy - это для браузера.

SOCKS5 proxy сервер

Теперь, когда я объяснил, почему решил использовать именно proxy сервер, пора перейти у описанию процесса его установки и настройки. И когда я подошёл к этому этапу, мне стало понятно, что если я остановлю свой выбор на SOCKS5 proxy, то и устанавливать ничего не придется, и настройка будет очень и очень простой.

Судите сами. У меня есть постоянно работающая машинка под Windows 10 - мой домашний сервер. На нем запущен стандартно входящий в поставку Windows 10 SSH сервер. На домашнем роутере осуществлен проброс порта до этого самого SSH сервера. К тому же, на любом компьютере, с которым я имею дело, есть SSH клиент. А всем известно, что с помощью SSH клиента очень легко реализовать SOCKS5 proxy: надо лишь использовать ключ -D командной строки. Вот цитата из документации команды SSH:

-D [bind_address:]port Dynamic application-level port forwarding. This allocates a socket to listen to port on the local side. When a connection is made to this port, the connection is forwarded over the secure channel, and the application protocol is then used to determine where to connect to from the remote machine.

Коротенько, минут на 40 ©, докладик, что этот отрывок документации значит. При использовании ключа -D осуществляется динамическая переадресация портов на уровне приложения. На локальном устройстве (где работает SSH клиент) выделяется/создается сокет для прослушивания определенного порта. Когда с этим портом устанавливается соединение, оно перенаправляется по безопасному каналу на удаленное устройство (на котором работает SSH сервер), а затем уже там, на удаленном компьютере, для определения того, куда именно должно быть осуществлено соединение, используется прикладной протокол.

Таким образом, если использовать команду:

ssh -D local_port user@server.at.home -p port_at_home

то мы получим на порту local_port работающий SOCKS5 proxy. В приведенной команде:

  • local_port - порт на локальной машине, именно его надо будет использовать при настройке, например, браузера. Я частенько использую порт 1080 (таковы общепризнанные рекомендации), но можно укaзать любой, главное, чтобы он не был задействован какой-нибудь другой программой. И помните, что первые 1024 порта зарезервированы системой, и если надо назначить какой-нибудь из них, то потребуются права суперпользователя (речь про root)
  • user - имя пользователя, под которым будет осуществляться соединение с удаленным SSH сервером
  • server.at.home - адрес вашего удаленного (домашнего) сервера. Если домен у вас не зарегистрирован - не беда, используйте IP адрес. Вот если IP адреса нет, тодга - да, тогда работать не будет 🙁.
  • -p port_at_home - при помощи ключа -p можно указать порт на удаленном устройстве (сервере), на который будет осуществляться перенаправление соединения. Как я уже сказал, у меня на роутере настроен проброс определенного порта (какого - я вам не скажу 😉) на 22 порт домашнего сервера - именно 22 порт по умолчанию используется SSH серверами, и Windows тут не исключение. Так вот, в этой команде я указываю именно порт на роутере. Кстати, если бы я "прокидывал" 22 порт на роутере, то ключ -p можно было бы и не использовать, но это было бы чуть менее безопасно.

Еще, буквально, пара слов про необязательный [bind_address:]. В приведенном примере подразумевается, что будет слушаться локальный порт, причем обращение (соединение) должно осуществляться именно к локальному хосту, он же localhost, он же 127.0.0.1. Если команду переписать вот так:

ssh -D 0.0.0.0:local_port user@server.at.home -p port_at_home

то будут обрабатываться запросы, пришедшие через любой интерфейс. Таким образом, можно разрешить другим устройствам в локальной сети использовать наш SOCKS5 proxy сервер.

Планы на будущее

С тех пор, как в Windows 10 появился SSH клиент (он даже сразу активирован, в отличии от SSH сервера), приведенной информации, в принципе, уже достаточно для организации SOCKS5 proxy. Но я сам довольно часто предпочитаю использовать вместо командной строки различные GUI приложения. Поэтому я решил, что опишу несколько шагов по созданию и настройке proxy серера с использованием такого вот GUI SSH клиента. Причем, если честно, я соригинальничал и не стал использовать (и описывать) всем известную программу PuTTY (таких описаний полно в сети), а установил другого клиента - Bitvise SSH Client. Так что, если интересно, ждите - скоро опишу процесс.

Про настройку клиента тоже, пожалуй, напишу. Но, опять же, не про Fairfox, в котором такая настройка предусмотрена в пользовательском интерфейсе, а про то, как при помощи параметров командной строки можно настроить всем известный Chrome, да и любой другой браузер, основанный на движке Chromium, например, тот же Microsoft Edge. Постараюсь не затягивать, заглядывайте периодически...


  1. К сожалению, после смены роутера на Keenetic Viva, адрес стал меняться в начале месяца. Не знаю, связано это с роутером, или что-то поменялось у провайдера, но раз в месяц мой белый IP становится другим. ↩︎