Привет мой дорогой друг. Ну вот и ты озадачился вопросом безопасности и/или анонимности в сети интернет в столь сложное высокотехнологичное время, где каждый очень хочет подглядеть за тобой или как то ограничить в доступе к ресурсам.
Также подобный вид маскировки трафика отлично подойдет для использования в сетях 4G/LTE или иных сетях, где есть ограничение по виду трафика в попытках ограничить доступ или скорость.
Обфускация трафика тема не новая, но и не особо популярная. По этому действительно рабочих и стоющих статей крайне мало.
И так, в качестве сервера будет взят VDS на ubuntu 22.04. В качестве клиента будем настраивать все ту же ubuntu и Windows 10. (Думаю что большинство предпочтут именно 2 вариант настроек клиента.) Для реализации самой обфускации трафика, на сервере и клиенте будет использоваться Shapeshifter Dispatcher Проект не плохой. Но они отказались от поддержки протокола obfs4 и скомпилить билд из свежих исходников невозможно. За старые исходники отдельное спасибо @fuccsoc Рабочие билды можно будет скачать по ссылке в конце поста.
Установка и настройка сервера
И так. Сперва обновляемся. И устанавливаем нужные пакеты.
apt update
apt upgrade
apt install openvpn
apt install easy-rsa
Настраиваем обфускацию
Собранный билд под нашу ОС помещаем в папку /usr/local/bin
И выставляем права на выполнение.
chmod +x /usr/local/bin/shapeshifter-dispatcher
После чего выполняем тестовый запуск:
shapeshifter-dispatcher -transparent -server -state /var/lib/state -orport 127.0.0.1:1515 -transport obfs4 -bindaddr obfs4-0.0.0.0:1516 -logLevel DEBUG -enableLogging
В ответ мы должны получить listening on 0.0.0.0:1516
-- адрес и порт на который будет идти наш шифрованный трафик. После чего, можно остановить выполнение данной программы. И идем в папку /var/lib/state, там создались 3 файла. dispatcher.log
и 2 конфиг файла obfs4_bridgeline.txt + obfs4_state.json
В файле obfs4_bridgeline.txt
копируем ключ после переменной cert=
Он генерируется автоматически и нужен будет для наших клиентов.
Чтобы shapeshifter-dispatcher стартовал при запуске системы, создадим для него свой сервис с нужными аргументами для запуска. Для этого создаем файл сервиса:
nano /etc/systemd/system/shapeshifter-dispatcher.service
Со следующими строками:
[Unit]
Description=shapeshifter-dispatcher service
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/shapeshifter-dispatcher -transparent -server -state /var/lib/state -orport 127.0.0.1:1515 -transport obfs4 -bindaddr obfs4-0.0.0.0:1516 -logLevel DEBUG -enableLogging
Restart=on-failure
RestartSec=30s
[Install]
WantedBy=multi-user.target
Перезапускаем systemd
systemctl daemon-reload
Далее запускаем наш сервис, и делаем его активным на автозапуск
systemctl start shapeshifter-dispatcher.service
systemctl enable shapeshifter-dispatcher.service
Настраиваем OpenVPN
Т.к протокол obfs4 имеет собственное шифрование, OpenVPN будет настраиваться на работу без шифрования. Это уменьшит нагрузку на наш сервер и клиентскую машину.
Но сертификат и ключи все равно придется создавать. У меня версия easy-rsa 3.0.8, в котором внесены незначительные изменения по синтаксису и алгоритмы работы. Будьте внимательны, есть отличия на более ранних версиях. Копируем нужные файлы и переходим к настройке:
mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa /etc/openvpn
cd /etc/openvpn/easy-rsa
cp -r ./vars.example ./vars
nano vars
Образец vars. Синтаксис немного поменялся. Редактируем на свое усмотрение.
set_var EASYRSA_REQ_COUNTRY "US"
set_var EASYRSA_REQ_PROVINCE "California"
set_var EASYRSA_REQ_CITY "San Francisco"
set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
set_var EASYRSA_REQ_EMAIL "me@example.net"
set_var EASYRSA_REQ_OU "My Organizational Unit"
Затем генерируем ключи и перемещаем в рабочую папку. (инициализация конфиг файла ./vars уже не требуется.)
./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-dh
./easyrsa gen-req vpn-server nopass
./easyrsa sign-req server vpn-server
mkdir /etc/openvpn/keys
cp -r pki/* /etc/openvpn/keys/
Теперь собственно конфиг для OpenVPN
nano /etc/openvpn/server.conf
Добавляем следующие строки:
mode server
dev tun_obfs4
#протокол всегда должен быть tcp
proto tcp
port 1515
persist-tun
persist-key
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/issued/vpn-server.crt
key /etc/openvpn/keys/private/vpn-server.key
dh /etc/openvpn/keys/dh.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 1.0.0.1"
push "redirect-gateway def1 bypass-dhcp"
client-to-client
keepalive 60 300
#отключаем шифрование
#openvpn клиент и сервер будут ругаться что весь трафик не зашифрован
#не рекомендуется указывать в случае использования openvpn без офускации
data-ciphers none
cipher none
tun-mtu 1500
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3
###########################################
#tls-server не указываем
#файл ta.key не генерируем
#
#comp-lzo / compress lz4 / compress lz4-v2 не указываем
#не хочет дружить с обфускацией
###########################################
Перезапускаем сервис
service openvpn restart
Теперь при вводе команды ifconfig мы должны увидеть наш интерфейс tun_obfs4. Отлично, сервер openvpn запустился.
Создаем клиента
./easyrsa build-client-full client nopass
Для подключения клиента к серверу копируем следующие файлы:
/etc/openvpn/easy-rsa/pki/ca.crt
/etc/openvpn/easy-rsa/pki/issued/client.crt
/etc/openvpn/easy-rsa/pki/private/client.key
Настройка Iptables
В случае, если использование сервера предполагает только через obfs4, тогда открываем 1516 порт. Если предполагается использование мобилок и прочих устройств, где нет возможности реализовать подключение через obfs4, тогда открываем дополнительно прямой порт 1515 до OpenVPN. И разрешаем обмен трафика за nat.
iptables -I INPUT -p tcp -m tcp --dport 1516 -j ACCEPT
iptables -t nat -A POSTROUTING -o ens3 -s 10.8.0.0/24 -j MASQUERADE
На этом, настройка сервера закончена.
Дебаг по серверу
shapeshifter-dispatcher в файле логов dispatcher.log всегда будет писать ошибку вида:
2023/01/13 06:34:13 [INFO]: initializing transparent proxy
2023/01/13 06:34:13 [INFO]: initializing TCP transparent proxy
2023/01/13 06:34:13 [NOTICE]: dispatcher-0.0.7-dev - launched
2023/01/13 06:34:13 [INFO]: initializing server transport listeners
2023/01/13 06:34:13 [INFO]: shapeshifter-dispatcher - initializing server transport listeners
2023/01/13 06:34:13 [ERROR]: Error resolving Extended OR address "missing port in address"
2023/01/13 06:34:13 [INFO]: shapeshifter-dispatcher - accepting connections
2023/01/13 06:34:13 [INFO]: obfs4 - registered listener: [scrubbed]:1516
С чем это связанно не известно. Но работает стабильно.
Настройка клиента для Windows
Качаем архив с билдами. Подходящий исполняемый файл shapeshifter-dispatcher-386.exe или shapeshifter-dispatcher-amd64.exe помещаем в папку C:\shapeshifter-dispatcher.
Создаем .bat файл с содержимым:
@echo off
cd C:\Program Files\OpenVPN\bin
openvpn-gui.exe --connect client.ovpn
cd C:\shapeshifter-dispatcher\
shapeshifter-dispatcher-amd64.exe -transparent -client -state state -target 45.45.45.45:1516 -transports obfs4 -proxylistenaddr 127.0.0.1:1515 -optionsFile obfs4.json -logLevel DEBUG -enableLogging
-target 45.45.45.45:1516 -- меняем IP на свой.
В папке C:\shapeshifter-dispatcher\state создаем файл obfs4.json с содержимым:
{"cert": "uXsRLSgnHHI0JwGE+uPFRVCnGLIZesduokAAbMGy7cTxdErirK8aYWcrFol7Nr6k/c6pAw", "iat-mode": "0"}
В переменную "cert": "........" вставляем свой ключ, который сгенерировал сервер.
Осталось создать конфиг файл для клиента OpenVPN C:\Users\client\OpenVPN\config\client.ovpn и запихивает туда это:
client
dev tun
remote 127.0.0.1 1515
socket-flags TCP_NODELAY
proto tcp
persist-key
persist-tun
cipher none
data-ciphers none
tun-mtu 1500
ca C:\\Users\\client\\OpenVPN\\config\\keys\\ca.crt
cert C:\\Users\\client\\OpenVPN\\config\\keys\\client.crt
key C:\\Users\\client\\OpenVPN\\config\\keys\\client.key
И скормить ему файлы ключей которые мы качали ранее с сервера.
/etc/openvpn/easy-rsa/pki/ca.crt
/etc/openvpn/easy-rsa/pki/issued/client.crt
/etc/openvpn/easy-rsa/pki/private/client.key
Файл .bat будет запускать OpenVPN клиент и следом обфускатор в один клик.
Наслаждаемся скрытым трафиком и весьма простой настройкой под винду.
Настройка клиента для linux ubuntu 22.04
Hidden text
В процессе...
Настройка клиента для macOS
В архиве есть готовый билд который позволит запустить OpenVPN с обфускацией. Но опыта работы с этой ОС у меня нет. Если будут желающие, статью можно будет дописать.
Настройка клиента для arm/mips/mipsle
Мне удалось скомпилировать билды для этих архитектур. Я пытался запустить их на бюджетном роутере TL-WR841N под управлением OpenWrt. Но увы не получилось. Возможно кому-то удастся запуститься на одноплатных системах типа raspberry pi. Или эти билды пригодятся в будущем...
Загрузка
Комментарии (29)
dumasti
23.01.2023 02:07+3#comp-lzo не указываем #не хочет дружить с обфускацией
Не знаю как comp-lzo работает с обфускацией, но во-первых, это устаревшая функция, а во-вторых, она небезопасна и имеет уязвимости.
Вместо нее теперь можно использовать “compress lz4”.
Goga075 Автор
23.01.2023 09:19compress lz4-v2
Если быть точнее для последней версии OpenVPNНо не важно какая версия применяется. Обфускатор не может дешифровать сжатый трафик и выпадает в ошибку.
titbit
23.01.2023 10:16+2Клиента для мобильных систем нет (android/ios)? Тогда это сильно ограничивает эту схему.
А почему интересно обфускатор требует расшифровки проходящего трафика и нервно реагирует на сжатие? Мне казалось что он должен молча съедать любой трафик на входе вообще и не важно что там внутри и как оно устроено, и на выходе выдавать идентичный входному.
push "dhcp-option DNS 1.1.1.1" push "dhcp-option DNS 1.0.0.1"
DNS лучше пускать через шифрованный канал, иначе будет утечка метаданных.
Goga075 Автор
23.01.2023 10:29Клиента для мобильных систем нет (android/ios)? Тогда это сильно ограничивает эту схему.
Увы нету. Вероятнее всего это из-за не популярности данного способа шифрования трафика. Да и представь себе как это высасывало аккумулятор.
А почему интересно обфускатор требует расшифровки проходящего трафика и нервно реагирует на сжатие?
Я не очень шарю в криптографии. Но как я понял, обфускатор не может проверить целостность данных после дешифровки.
KillJ0y
23.01.2023 10:30Три вопроса
1 - разве obfs4 определяется dpi? Насколько я помню он давно детектиться.
2 - зачем городить костыль когда есть ssl VPN?
3 - оставлять VPN только на шифрование obfs, не столь надёжное решение.
Суммирую, для нагруженного VPN по трафику (а учитывая какие сервера берут под vpn) Решение не очень в плане оверхеда с обусфикацией. Есть тот же wireguard быстрое решение даже быстрее ipsec, далее ikev2 тоже отличный вариант, теперь варианты обхода жестких блокировок по протоколам openconnect/anyconnect, Ms sstp, outline VPN (для ленивых, медленнее), и уже в конце как самый запасной вариант это openvpn+обусфускатор (wstunnel, stunnel, socks5, и другие). Не openvpn'ом единым, даже wg на udp можно завернуть в wstunnel через tls.
MiraclePtr
23.01.2023 10:47зачем городить костыль когда есть ssl VPN?
Есть тот же wireguard быстрое решение даже быстрее ipsec, далее ikev2 тоже отличный вариант, теперь варианты обхода жестких блокировок по протоколам openconnect/anyconnect, Ms sstp, outline VPN (для ленивых, медленнее), и уже в конце как самый запасной вариант это openvpn+обусфускатор (wstunnel, stunnel, socks5, и другие)
Это до тех пор, пока эти варианты работают, если копнуть внимательнее, действительно "жестким блокировкам" большинство этих вариантов противостоять не смогут.
KillJ0y
23.01.2023 10:51Haproxy +SNI что бы держать и сайт на https и sstp, самое разумное решение. Но это уже нюансы настройки sstp
MiraclePtr
23.01.2023 10:55+1Haproxy +SNI что бы держать и сайт на https и sstp, самое разумное решение
Это не решение, а решето, потому что SNI не шифруется и такая конструкция элементарно уязвима к active probing.
KillJ0y
23.01.2023 11:49За то работает, даже если будут блочить протоколы, outline для ленивых разработан для китайского фаервола. Или ssh vpn (заблокировать протокол управления сервера когда они переходят на отечественный linux? Чем черт не шутит). Решений много. Проще всего заблочить народные протоколы (ovpn, wg, ipsec, ikev2) и то ipsec может быть под вопросом бизнес будет много материться когда отвалится несколько десятков офисов. Ситуация двоякая конечно. 100% сделать свое решение чтобы завернуть весь трафик и dns в ssl тунель, и сделать это стандартезированно через openssl на 443 порту с ngnix proxy letsencrypt и легетимным сайтом (не заблочат же они ssl?)
MiraclePtr
23.01.2023 12:36Прочтите статью по ссылке выше. Там разобрано и про SSH, и про Outline (точнее про Shadowsocks внутри него), и про туннель с маскировой под легитимный сайт через SSL. Там очень много неочевидных нюансов и техник выявления, так что все эти варианты сработают, но только до определенного уровня обострения маразма у цензоров :(
KillJ0y
23.01.2023 12:53Да да, цензоры не отличаются умом особенно блокировками целыми подсетями. Да все это известно. По этому и говорю про свое решение о котором ни кто не будет знать, единственное сервер нужен будет по мощнее чтоб бы выкинуть туда сайт с медиаконтентом и пусть ковыряются что там.
Потребовалось создал решение для раздачи и обновления сертификатов wildcard по всем сайтам, контейнерам и виртуалкам. И для обхода сделаем если будет необходимость. Ведь можно просто изолировать рунет вот вам вк, одноклассники и рутуб, а все остальное экстремистический контент, и что делать тогда ?
maikuss
23.01.2023 18:41Была здесь на Хабре статья "Туннели и VPN, устойчивые к DPI". На мой взгляд, отличное решение с маскировкой личного VPN сервера под вебсайт с котиками. Сейчас она снята с публикации, но по русскоязычному интернету осталось немало её копий.
MiraclePtr
23.01.2023 20:07Есть новая статья на ту же тему: https://habr.com/ru/post/710980/
И в ней подробно рассказывается, почему описанное в первой статье не сработает :)maikuss
24.01.2023 23:12Хмм. Я вторую статью не читал, а первую, получается, прочитал, не очень внимательно, или следовал ей не очень четко. Потому что на её основе успешно построил себе VPN сервер. Программку оттуда взял со смешным названием, а также stunnel,и openvpn. Все поставил на роутер, которым у меня тогда работал маленький комп на атоме. Сайт, который хостился в Германии, уже был.
MiraclePtr
25.01.2023 01:08+1Про "не сработает" имеется в виду "может быть выявлено при достаточном желании и ресурсах цензоров". Пока что до этого не дошло (и будет надеяться, что не дойдет).
Кстати, stunnel или wstunnel? Потому что если wstunnel, то программа со смешным названием (которая кнокер) не нужна, а если stunnel, то не понятно, зачем он вообще в этой схеме (для tls-терминирования вместо nginx?)
maikuss
25.01.2023 14:18А, понятно тогда. Ну, что ж , время показало, что с той стороны окошко стали прикрывать быстрее, чем с этой. От того немецкого хостинга пришлось отказаться, а потом у меня и вовсе поменялась ситуация, теперь мне актуален ВПН в обратную сторону, "сервер" стоит в моей московской квартире. А тогда был именно stunnel, не wstunnel. В этой схеме он, может быть, и не нужен, но у меня получилось сделать с ним, а дальше мне стало уже не до этого, заработал канал, и ладно.
А, кстати, не может ли оказаться более перспективным именно такой вариант, чтобы подключение инициировалось из-за границы, а сервер с ВПН жил в РФ ? Будут ли они так же вдумчиво проверять вебсервера внутри страны?
Chupaka
24.01.2023 08:17+2#соберет мелкие пакеты в один,но более крупный #уменьшит нагрузку на сервер и на клиент #при отсутствии трафика незначительно увеличит пинг socket-flags TCP_NODELAY
TCP_NODELAY не делает ли абсолютно противоположное описанному? No Delay как раз убирает задержку на "сборку" и отправляет доступные данные сразу же, мелкими пакетами.
Обфускация русского языка в виде "ту-же" и прочих "что-бы" — вообще отдельный привет...
Goga075 Автор
24.01.2023 08:57Действительно. Почему то мне казалось что
TCP_NODELAY
делает на оборот.
MiraclePtr
Насколько старые? Разработчики obfs4 не иначе как пару месяцев назад рассылали емайлы операторам Tor-бриджей с obfs4 с просьбой срочно обновиться до версии 0.14, потому что в предыдущих версиях обнаружился какой-то эпичный баг с обфускацией и использование устаревших версий строго не рекомендуется (детали обещали опубликовать позднее, когда все обновятся).
Ой. До этого, сказав про "у нас obfs4 уже шифрует" вы отключили шифрование на уровне OpenVPN, и трафик на "прямой порт" с мобилок у вас будет ходить в открытом для всех глаз виде.
Goga075 Автор
Вы комментарий выдрали из контекста. Читайте внимательней!
Данная статья описана с максимальной гибкостью. Ни кто Вам не запрещает отконфигурировать по своему.
MiraclePtr
Я и прочитал очень внимательно:
Но они отказались от поддержки протокола obfs4 и скомпилить бил из свежих исходников не возможно. Рабочие билды можно будет скачать по ссылке в конце поста. Больше про версию obfs4 ни в соседних абзацах, ни вообще в статье ничего нет. Какой еще контекст упущен конкретно?
И вопрос все тот же - есть ли этих "старых исходниках" исправление этого недавнего критического бага в протоколе, или же использовать их небезопасно.
Если вы пишете статью типа "мануал" для широкой публики на важную для широкой публики тему, лучше заранее принять, что многие люди будут способны только делать пошагово как написано, а шаг влево-вправо - уже провал. Поэтому лучше заранее подстелить соломки и обратить внимание читателя на все возможные девиации, особенно когда дело касается безопасности.
Goga075 Автор
"они" имеется в виду
shapeshifter-dispatcher
MiraclePtr
Это прекрасно понятно. Но реализацию протокола obfs4 в "старых исходниках" авторы shapeshifter-dispatcher же откуда-то взяли? Весьма вероятно, что из оригинальной кодовой базы obfs4 (он тоже написан на Go, наврядли они переизобретали велосипед) и тогда там, весьма вероятно, присутствует этот критический баг. А если они не переиспользовали код, а писали с нуля сами - то тем более, ибо баг, судя по всему, связан с какими-то неочевидными особенностями работы с эллиптическими кривыми.
Goga075 Автор
аааа.... мммм... а этого мы и не узнаем.
Может по этому и отказались от поддержки.