В интернете полно рецептов того, как обходить блокировки сайтов, введённые Российскими интернет-провайдерами по решению Российских властей. Например, заблокированный сайт lurkmore.to, или сайт rutracker.org, который на момент написания данной статьи еще не был заблокирован, но готовился к блокировке.
Существующие решения сводятся к двум видам:
- Использование стороннего прокси-сервера
- Использование VPN-соединения
Минусы этих способов для нас такие:
- Сторонние прокси-сервера могут просматривать ваш траффик, и получать к нему доступ
- Платные VPN-сервисы являются платными 🙂
- Сами VPN-соединения требуют настройки, которую не каждый готов проделывать
Мой рецепт лишен этих недостатков, правда, он ориентирован на тех, кто использует Linux на своей рабочей машине, а также, пользуется услугами DigitalOcean или любого другого сервиса, предоставляющего виртуальные машины.
Требования, необходимые для использования моего рецепта:
- Ваша машина (с которой вы пользуетесь браузером) должна работать под управлением Linux. В моём случае это Debian Linux 8.0 Jessie
- У вас должна быть виртуальная машина от DigitalOcean (от $5), или любая другая, сервер которой находится НЕ в России.
- У вас должен быть браузер FireFox или Chrome, в противном случае придётся настраивать прокси-сервер как-то иначе, чем в предложенном мной методе
Предполагаю, что читатели этого блога имеют какое-то отношение к программированию, разработке сайтов и администрированию, из чего следует, что какой-то виртуальный сервер наверняка у вас и так уже есть. Зачем же платить еще и за VPN, если у вас есть свой «VPN для бедных»?
Из чего будет состоять связка для обхода блокировок:
- Ваш браузер
- Расширение браузера для автоматического выбора прокси-сервера FoxyProxy
- SSH-подключение с ключём -D, создающее SOCKS5-прокси сервер на локальной машине
- AutoSSH для поддержания соединения и поднятия его, в случае пропадания интенета, и его последующего появления
- Ваш виртуальный сервер, куда мы и будем подключаться по SSH
Настройка виртуального сервера
1. Для начала нужно настроить сервер так, чтобы к нему можно было подключаться по SSH без ввода пароля, то есть по открытому ключу. Удивительно, но даже среди людей, регулярно общающихся с удалёнными *nix — системами, встречаются не пользующиеся авторизацией по открытому ключу, и даже и не слышавшие об этом.
Если ключа у вас ещё нет, создайте его командой на локальной машине:
ssh-keygen -b 1024 |
после этой команды у вас в папке ~/.ssh появится два файла id_rsa (это закрытый ключ) и id_rsa.pub (открытый). Вам нужно скопировать открытый ключ в буфер обмена, после чего, вставить его в файл ~/.ssh/authorized_keys на вашем виртуальном сервере.
После данных манипуляций вы сможете подключиться к удалённому серверу просто командой:
ssh user@remotehost.com |
без всякого ввода пароля.
Пробный запуск прокси-сервера
Для начала попробуем, как работает SSH в качестве прокси-сервера:
1. Подключимся по SSH к нашему виртуальному серверу с ключом -D, который, как раз, включает SOCKS5-сервер.
ssh user@remotehost.com -D 127.0.0.1 8080 |
Эта команда выполнит подключение к серверу и откроет на вашем локальному 127.0.0.1 порт 8080, который будет ожидать подключения.
2. Настроим браузер на использование SOCKS-прокси. Для начала настроим чтобы все сайты открывались через прокси, IP-адрес: 127.0.0.1, порт: 8080, тип прокси: SOCKS5.
Как настроить прокси в вашем браузере БЕЗ FoxyProxy, в задачи этой инструкции не входит, однако, для тех, кто по какой-то причине ни разу еще не настраивал прокси-сервер в браузере, вот ссылки:
Как настроить прокси-сервер в FireFox
Как настроить прокси-сервер в Google Chrome
Как настроить прокси-сервер в Opera
3. После настройки прокси-сервера проверим, какой IP-адрес теперь видят сайты, когда мы на них заходим: https://2ip.ru/ — там будет указан ваш IP, и из какой вы страны по мнению сервера. Страна должна быть та, в которой находится ваш виртуальный сервер.
Настройка постоянного подключения с помощью AutoSSH
Для того, чтобы подключение по SSH устанавливалось при запуске компьютера, и восстанавливалось после того как на время работы пропадала связь.
В этом нам поможет утилита autossh:
apt-get install autossh |
Сама эта утилита работает с теми же ключами, что и ssh, но у неё есть ряд своих собственных параметров, указывающих режимы работы.
Попробуем запустить её вот такой командой:
autossh -M 10000 -N -f -o "PubkeyAuthentication=yes" -o "PasswordAuthentication=no" -i /home/user/.ssh/id_rsa user@remotehost.com -D 127.0.0.1:8080 |
Разъясню суть параметров:
-M 10000 означает, что порт управления autossh будет 10000 (по этому порту можно подключаться чтобы давать autossh некоторые команды). Здесь мы задаём его чтобы потом знать куда подключаться для отладки.
-N параметр передаётся в ssh, и означает «не запускать терминал на удалённой машине»
-f означает, что autossh должен уйти в бэкграунд, перед тем как запускать ssh. В этом режиме не будет запроса логина и пароля (даже если SSH их требует), зато хорошо будет работать авто-возобновление подключения.
-o «PubkeyAuthentication=yes» означает, что аутентификацию нужно проводить по публичному ключу а не по логину и паролю. SSH обычно это понимает сам, а вот autossh’у надо объяснить.
-o «PasswordAuthentication=no» соответственно отключаем парольную аутентификацию
-i /home/user/.ssh/id_rsa путь к файлу закрытого ключа. Вместо «user» надо подставить вашего пользователя.
-D 127.0.0.1:8080 как уже упоминалось, открываем SOCKS5 прокси-сервер.
При запуске должно произойти подключение к SSH и снова должен заработать прокси-сервер.
Напишем скрипт для автоматического запуска и поддержки autossh в рабочем состоянии:
#!/bin/bash killall -SIGKILL autossh && # На всякий случай отладка export AUTOSSH_DEBUG=1 # Переподключение через 0 секунд export AUTOSSH_GATETIME=0 # Обратите внимание на "&" в конце следующей команды. autossh -M 10000 -N -f -o "PubkeyAuthentication=yes" -o "PasswordAuthentication=no" -i /home/user/.ssh/id_rsa user@remotehost.com -D 127.0.0.1:8080 & |
этот скрипт можно поместить в /usr/bin или ещё куда, и сделать его исполняемым. Например, кладём его в /usr/bin/autossh-proxy.sh и сделаем его исполняемым:
chmod +x /usr/bin/autossh-proxy.sh |
Осталось добавить вызов скрипта в автозапуск.
Например, в /etc/rc.local:
.... bash /usr/bin/autossh-proxy.sh .... |
Или в настройках KDE/Gnome/XFCE добавить скрипт в автозапуск
Проверить всё сделанное можно перезапустив систему, и убедившись в том, что прокси-сервер работает, а в процессах висит ssh.
Установим и настроим FoxyProxy
Сейчас прокси-сервер работает, но ведь он не нужен нам на всех сайтах. Обычные, не заблокированные сайты должны открываться через нормальное Интернет-соединение, так они будут работать быстрее. Для того чтобы переключаться между прокси-сервером и прямым Интернет-соединением, мы используем расширение для браузеров FoxyProxy. Его версии есть для FireFox и Chrome, установить его можно из стандартного репозитория расширений, предлагаемого Mozilla’й и Google’ом
Настройка в FireFox
1. Установить расширение отсюда: https://addons.mozilla.org/ru/firefox/addon/foxyproxy-standard/
После установки расширения, откроем настройки, и увидим такое окно:
В нём видно, что пока у нас только один «прокси-сервер», который олицетворяет собой прямое подключение к Интернету.
2. Добавление прокси-сервера:
В окне настроек нажимаем кнопку «Добавить» и видим такое окно:
(Красным помечено то, что вы должны заполнить)
3. Настройка прокси-сервера на определённые сайты
На вкладке «Шаблоны URL» можно добавить шаблоны адресов сайтов, на которых прокси-сервер будет включаться, например вот так:
4. Также, можно зайти на первую вкладку, «Общее описание», и задать там «Имя прокси» и цвет, которым данный сервер будет выделяться:
5. Теперь проверим, сайты которые вы прописали должны открываться даже будучи заблокированными (через прокси-сервер), при этом, все остальные сайты должны загружаться напрямую, с вашей обычной скоростью интернета.
Настройка в Chrome
1. Установить расширение отсюда: https://chrome.google.com/webstore/detail/foxyproxy-standard/gcknhkkoolaabfmlnjonogaaifnjlfnp?hl=ru
После установки расширения, откроем настройки, и увидим следующую страницу:
В нём видно, что пока у нас только один «прокси-сервер», который олицетворяет собой прямое подключение к Интернету.
2. Добавление прокси-сервера:
В окне настроек нажимаем кнопку «Add New Proxy» и видим такое окно:
(Красным помечено то, что вы должны заполнить)
3. Настройка прокси-сервера на определённые сайты
На вкладке «URL Patterns» можно добавить шаблоны адресов сайтов, на которых прокси-сервер будет включаться, например вот так:
4. Также, можно зайти на первую вкладку, «General», и задать там имя прокси (Proxy Name) и цвет, которым данный сервер будет выделяться:
5. Теперь проверим, сайты которые вы прописали должны открываться даже будучи заблокированными (через прокси-сервер), при этом, все остальные сайты должны загружаться напрямую, с вашей обычной скоростью интернета.
Ни в коем случаи не делайте того, что советует автор — дать автоматический доступ к Вашему виртуальному серверу любому желающему.
Привет. Дружище, а ты может как-то аргументируешь свою точку зрения?
В каком месте и каким образом даётся доступ к виртуальному серверу любому желающему?
Подключение осуществляется через ssh-туннель. Доступ по ssh есть только у тебя. Порт открыт лично на твоём компьютере. Единственный способ любому желающему получить доступ к виртуальному серверу — это сесть за твой ПК.
Я невнимательно прочитал статью. Тут лучше описано: https://www.shellhacks.com/ru/ssh-login-without-password/
У меня о генерации ключа и его использовании написан даже целый абзац 🙂
Но вообще, я уже привык считать, что все знают что такое авторизация SSH по открытому ключу.