Интернет провайдер может отфильтровать 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 пакеты (если таковые отсутствуют в системе):
Проверим последнею доступную версию obfsproxy на torproject.org.
В репозиториях Debian/Ubuntu лежать старые версии obfsproxy без подержки scramblesuit. В этом случае obfsproxy нужно устанавливать с помощью утилиты pip.
Убедитесь, что используется версия obfsproxy с поддержкой scramblesuit:
Запуск
Далее все настройки описываются для obfsproxy 0.2.13, более ранние версии не подходят.
Ниже описываются общие настройки на стороне сервера и клиента.
Создадим пользователя и группу obfsproxy-openvpn.
Создадим необходимые каталоги.
Для кодирования трафика будем использовать метод ScrambleSuit, для чего нам необходимо задать ключ (pre-shared key). Ключ должен быть строкой длиной 20 символов, закодированной в base32, и совпадать на клиенте и на сервере.
Запуск obfsproxy (сервер)
Obfsproxy не умеет запускаться в режиме демона, обойдем этот недостаток с помощью screen, так же укажем повышенный приоритет выполнения, nice. У obfsproxy нет конфигурационного файлы, все параметры задаются при запуске.
Создадим скрипт запуска obfsproxy.
Пример скрипта запуска obfsproxy на сервере.
Проверим какие порты слушает obfsproxy.
Пример вывода:
Получим больше информации:
или
Повторяем всё тоже самое, что мы делали на сервере.
Скрипт запуска obfsproxy на клиенте.
В данном случае использование 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: (Karlstad University, Швеция).
Установим необходимые для работы obfsproxy и scramblesuit пакеты (если таковые отсутствуют в системе):
Код:
sudo aptitude update
sudo aptitude install gcc make python python2.7 python-pip python-dev build-essential
В репозиториях Debian/Ubuntu лежать старые версии obfsproxy без подержки scramblesuit. В этом случае obfsproxy нужно устанавливать с помощью утилиты pip.
Код:
sudo pip install obfsproxy
Код:
/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
Код:
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 не умеет запускаться в режиме демона, обойдем этот недостаток с помощью 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
Код:
#!/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 — отключает ведение журнала совсем (по умолчанию).
Код:
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}