Введение
Хочу рассказать про один из способов, как можно использовать 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. Постараюсь не затягивать, заглядывайте периодически...
К сожалению, после смены роутера на Keenetic Viva, адрес стал меняться в начале месяца. Не знаю, связано это с роутером, или что-то поменялось у провайдера, но раз в месяц мой белый
IP
становится другим. ↩︎