Обход блокировок сайтов Linux + FireFox/Chrome + FoxyProxy + DigitalOcean + autossh

В интернете полно рецептов того, как обходить блокировки сайтов, введённые Российскими интернет-провайдерами по решению Российских властей. Например, заблокированный сайт lurkmore.to, или сайт rutracker.org, который на момент написания данной статьи еще не был заблокирован, но готовился к блокировке.
Существующие решения сводятся к двум видам:

  1. Использование стороннего прокси-сервера
  2. Использование VPN-соединения

Минусы этих способов для нас такие:

  1. Сторонние прокси-сервера могут просматривать ваш траффик, и получать к нему доступ
  2. Платные VPN-сервисы являются платными 🙂
  3. Сами VPN-соединения требуют настройки, которую не каждый готов проделывать

Мой рецепт лишен этих недостатков, правда, он ориентирован на тех, кто использует Linux на своей рабочей машине, а также, пользуется услугами DigitalOcean или любого другого сервиса, предоставляющего виртуальные машины.

Требования, необходимые для использования моего рецепта:

  1. Ваша машина (с которой вы пользуетесь браузером) должна работать под управлением Linux. В моём случае это Debian Linux 8.0 Jessie
  2. У вас должна быть виртуальная машина от DigitalOcean (от $5), или любая другая, сервер которой находится НЕ в России.
  3. У вас должен быть браузер 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» можно добавить шаблоны адресов сайтов, на которых прокси-сервер будет включаться, например вот так:
Шаблоны URL

4. Также, можно зайти на первую вкладку, «Общее описание», и задать там «Имя прокси» и цвет, которым данный сервер будет выделяться:
Название и цвет

5. Теперь проверим, сайты которые вы прописали должны открываться даже будучи заблокированными (через прокси-сервер), при этом, все остальные сайты должны загружаться напрямую, с вашей обычной скоростью интернета.

Настройка в Chrome

1. Установить расширение отсюда: https://chrome.google.com/webstore/detail/foxyproxy-standard/gcknhkkoolaabfmlnjonogaaifnjlfnp?hl=ru

После установки расширения, откроем настройки, и увидим следующую страницу:

Настройка Chrome

В нём видно, что пока у нас только один «прокси-сервер», который олицетворяет собой прямое подключение к Интернету.

2. Добавление прокси-сервера:
В окне настроек нажимаем кнопку «Add New Proxy» и видим такое окно:
(Красным помечено то, что вы должны заполнить)
Настройка прокси

3. Настройка прокси-сервера на определённые сайты
На вкладке «URL Patterns» можно добавить шаблоны адресов сайтов, на которых прокси-сервер будет включаться, например вот так:
Список масок URL

4. Также, можно зайти на первую вкладку, «General», и задать там имя прокси (Proxy Name) и цвет, которым данный сервер будет выделяться:
Название и цвет

5. Теперь проверим, сайты которые вы прописали должны открываться даже будучи заблокированными (через прокси-сервер), при этом, все остальные сайты должны загружаться напрямую, с вашей обычной скоростью интернета.


4 комментария

  • Ответить Сергей |

    Ни в коем случаи не делайте того, что советует автор — дать автоматический доступ к Вашему виртуальному серверу любому желающему.

    • Ответить mihanentalpo |

      Привет. Дружище, а ты может как-то аргументируешь свою точку зрения?
      В каком месте и каким образом даётся доступ к виртуальному серверу любому желающему?
      Подключение осуществляется через ssh-туннель. Доступ по ssh есть только у тебя. Порт открыт лично на твоём компьютере. Единственный способ любому желающему получить доступ к виртуальному серверу — это сесть за твой ПК.

    • Ответить mihanentalpo |

      У меня о генерации ключа и его использовании написан даже целый абзац 🙂
      Но вообще, я уже привык считать, что все знают что такое авторизация SSH по открытому ключу.

Оставить комментарий