Маскировка openvpn с помощью obfsproxy

SKZHPRVT

Бывалый
ЮБИЛЕЙНАЯ ЛЕНТА

SKZHPRVT

Бывалый
ЮБИЛЕЙНАЯ ЛЕНТА
Регистрация
12 Июн 2018
Сообщения
549
Реакции
283
Репутация
0
Род занятий

Обнал, дебетовые карты

Интернет провайдер может отфильтровать OpenVPN протокол с помощью технологии

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

(сокр. DPI, также complete packet inspection и Information eXtraction или IX) — технология накопления статистических данных, проверки и фильтрации сетевых пакетов по их содержимому.

В данном случае использование UDP, TCP:443 не поможет. Даже если вы используете опцию

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

для запуска OpenVPN сервера на одном порту с https сервером это так же не спасет, так же как OpenVPN сервер различает https трафик от адресованного ему, провайдер определит https вы используете или маскируете OpenVPN под https. Причем OpenVPN трафик не обязательно будет блокироваться, интернет провайдер может создавать видимость отсутствия блокировки, но при этом резко ограничивать скорость прохождения пакетов OpenVPN или же осуществлять блокировку рандомно. Например до полной блокировки всех сервисов Google в Китае, поисковик google.com временами открывался только с нескольких попыток, что создавало впечатление проблем у самого сервиса.

Для обхода описанной выше проблемы построим

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

сетевой мост с помощью obfsproxy и ScrambleSuit и пустим OpenVPN трафик через него. Один из недостатков данного способа, OpenVPN должен работать в режиме TCP. Сразу оговорюсь, практика показала, что obfsproxy это не панацея в обходе DPI сканирования.

Obfsproxy — изначально инструмент для маскировки

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

трафика, маскируя TOR трафик под обычный HTTP трафик.

ScrambleSuit — набор программных модулей для Obfsproxy, обеспечивающий защиту от

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

, используя

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

, который позволяет выставлять для каждого сервера свою

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

(хэш) потока.

Установка

Установим необходимые для работы obfsproxy и scramblesuit пакеты (если таковые отсутствуют в системе):
Код:
sudo aptitude update
sudo aptitude install gcc make python python2.7 python-pip python-dev build-essential
Проверим последнею доступную версию obfsproxy на torproject.org.


Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.



В репозиториях Debian/Ubuntu лежать старые версии obfsproxy без подержки scramblesuit. В этом случае obfsproxy нужно устанавливать с помощью утилиты pip.
Код:
sudo pip install obfsproxy
Убедитесь, что используется версия obfsproxy с поддержкой scramblesuit:
Код:
/usr/local/bin/obfsproxy scramblesuit -h
Запуск
Далее все настройки описываются для obfsproxy 0.2.13, более ранние версии не подходят.

Ниже описываются общие настройки на стороне сервера и клиента.

Создадим пользователя и группу obfsproxy-openvpn.
Код:
sudo useradd obfsproxy-openvpn -UMr -c OBFSProxy-OpenVPN
Создадим необходимые каталоги.
Код:
mkdir -p /etc/obfsproxy/tmp

mkdir /var/log/obfsproxy

chown -R obfsproxy-openvpn:obfsproxy-openvpn /etc/obfsproxy
chmod 500 /etc/obfsproxy
chmod 700 /etc/obfsproxy/tmp

chown obfsproxy-openvpn:obfsproxy-openvpn /var/log/obfsproxy
chmod 700 /var/log/obfsproxy
ln -s /var/log/obfsproxy /var/log/openvpn
ln -s /var/log/openvpn /var/log/obfsproxy
ln -s /var/log/obfsproxy /etc/openvpn/obfsproxy-log
Для кодирования трафика будем использовать метод ScrambleSuit, для чего нам необходимо задать ключ (pre-shared key). Ключ должен быть строкой длиной 20 символов, закодированной в base32, и совпадать на клиенте и на сервере.
Код:
python -c "import os,base64; print base64.b32encode(os.urandom(20))" > /etc/obfsproxy/password1
chown -R obfsproxy-openvpn:obfsproxy-openvpn /etc/obfsproxy/password1
chmod 400 /etc/obfsproxy/password1
chattr +i /etc/obfsproxy/password1
  • Base32
    Использует только 32 символа: A-Z (или a-z), 2-7. Может содержать в конце кодированной последовательности несколько спецсимволов (по аналогии с base64).
Преимущества:

  • Последовательность любых байтов переводит в печатные символы.
  • Регистронезависимая кодировка.
  • Не используются цифры, слишком похожие на буквы (например, 0 похож на О, 1 на l).
Недостатки:

  • Кодированные данные составляют 160% от исходных.
Запуск obfsproxy (сервер)
Obfsproxy не умеет запускаться в режиме демона, обойдем этот недостаток с помощью screen, так же укажем повышенный приоритет выполнения, nice. У obfsproxy нет конфигурационного файлы, все параметры задаются при запуске.

Создадим скрипт запуска obfsproxy.
Код:
touch /etc/obfsproxy/obfsproxy.sh
chown -R root:root /etc/obfsproxy/obfsproxy.sh
chmod 700 /etc/obfsproxy/obfsproxy.sh
mcedit /etc/obfsproxy/obfsproxy.sh
Пример скрипта запуска obfsproxy на сервере.
Код:
#!/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

OPEN_VPN_SERVER_IP="127.0.0.1"
OPEN_VPN_SERVER_PORT="8888"
IP="1.2.3.4"
PORT="80"

USER="obfsproxy-openvpn"
NICE="-10"

DIR="/etc/obfsproxy"

TMP="${DIR}/tmp"
PASSWD_FILE="$DIR/password1"
LOG="/var/log/obfsproxy/obfsproxy-openvpn.log"

SCREEN_NAME="Obfsproxy-Server_(OpenVPN-${OPEN_VPN_SERVER_IP}-${OPEN_VPN_SERVER_PORT})"

# Посылаем сигнал SIGHUP obfsproxy запушенному в screen (убиваем сессию  screen).
screen -S ${SCREEN_NAME} -X quit# Если obfsproxy нормально не завершился то принудительно убьём
sleep 2
killall -9 obfsproxy
sleep 1

sudo -u root nice -n ${NICE} \
screen -dmS ${SCREEN_NAME} \
sudo -u ${USER} \
/usr/local/bin/obfsproxy \
--log-file ${LOG} \
--log-min-severity info \
--no-safe-logging \
--data-dir ${TMP} \
scramblesuit \
--password-file ${PASSWD_FILE} \
--dest ${OPEN_VPN_SERVER_IP}:${OPEN_VPN_SERVER_PORT} \
server ${IP}:${PORT}

# Показать созданную сессию screen
screen -ls|grep ${SCREEN_NAME}
  • 1.2.3.4:80 — IP-адрес и порт, который будет слушать obfsproxy;
  • 127.0.0.1:8888 — IP-адрес и порт который слушает OpenVPN сервер.
  • —data-dir — каталог для размещения временных данных.
  • mode — выбирает режим работы прокси.
    • server — принимает клиентские соединения, деобфусцирует и перенаправляет на адрес destination.
    • client — прозрачное проксирование: принимает данные, обфусцирует и отправляет серверу по адресу destination.
    • socks — имитация socks-прокси.
  • Разница между режимами client и socks в том, что в первом случае адрес удаленного хоста, к которому пытается подключиться целевое приложение, должен быть заменен на адрес opbfsproxy-клиента, тогда как во втором случае целевое приложение использует obfsproxy как SOCKS-прокси.

  • —dest — для сервера: задаёт пару адрес-порт, куда будут перенаправляться деобфусцированные соединения. Для клиента: задаёт адрес obfsproxy сервера.
  • —password BASE32PASS — задание ключа(pre-shared key) для метода scramblesuit.
  • —password-file filepath — альтернативный метод задания ключа для метода scramblesuit, на случай если вы не хотите писать pre-shared key в открытом виде.
  • log_options включает в себя следующие ключи:
    • —log-file path — задает расположение журнала.
    • —log-min-severity level — События какого уровня (debug, info, warning, error) записывать.
    • —no-safe-logging — по умолчанию obfsproxy вырезает адреса из лога, но данный ключ позволяет изменить это поведение.
    • —no-log — отключает ведение журнала совсем (по умолчанию).
Проверим какие порты слушает obfsproxy.
Код:
sudo netstat -tlpn|grep python
Пример вывода:

Код:
tcp 0 0 192.168.1.1:80 0.0.0.0:* LISTEN 9969/python
Получим больше информации:
Код:
Получим больше информации:
или
Код:
ps -aux | grep 9969
  • 9969 — pid obfsproxy, см. вывод netstat.
Клиент
Повторяем всё тоже самое, что мы делали на сервере.

Скрипт запуска obfsproxy на клиенте.
Код:
#!/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

REMOUTE_PROXY_IP="1.2.3.4"
REMOUTE_PROXY_PORT="80"
IP="127.0.0.1"
PORT="8881"

USER="obfsproxy-openvpn"
NICE="-10"

DIR="/etc/obfsproxy"

TMP="${DIR}/tmp"
PASSWD_FILE="$DIR/password1"
LOG="/var/log/obfsproxy/obfsproxy-openvpn.log"

SCREEN_NAME="Obfsproxy-Client-(OpenVPN-${REMOUTE_PROXY_IP}-${REMOUTE_PROXY_PORT})"

# Посылаем сигнал SIGHUP obfsproxy запушенному в screen (убиваем сессию  screen).
screen -S ${SCREEN_NAME} -X quit
# Если obfsproxy нормально не завершился то принудительно убьём
sleep 2
killall -9 obfsproxy
sleep 1

sudo -u root nice -n ${NICE} \
screen -dmS ${SCREEN_NAME} \
sudo -u ${USER} \
/usr/local/bin/obfsproxy \
--log-file ${LOG} \
--log-min-severity info \
--no-safe-logging \
--data-dir ${TMP} \
scramblesuit \
--password-file ${PASSWD_FILE} \
--dest ${REMOUTE_PROXY_IP}:${REMOUTE_PROXY_PORT} \
client ${IP}:${PORT}

# Показать созданную сессию screen
screen -ls|grep ${SCREEN_NAME}
 
Сверху