Привет мой дорогой друг. Ну вот и ты озадачился вопросом безопасности и/или анонимности в сети интернет в столь сложное высокотехнологичное время, где каждый очень хочет подглядеть за тобой или как то ограничить в доступе к ресурсам.

Также подобный вид маскировки трафика отлично подойдет для использования в сетях 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)


  1. MiraclePtr
    22.01.2023 23:03
    +12

    Но они отказались от поддержки протокола obfs4 и скомпилить бил из свежих исходников не возможно. За старые исходники отдельное спасибо @fuccsoc

    Насколько старые? Разработчики obfs4 не иначе как пару месяцев назад рассылали емайлы операторам Tor-бриджей с obfs4 с просьбой срочно обновиться до версии 0.14, потому что в предыдущих версиях обнаружился какой-то эпичный баг с обфускацией и использование устаревших версий строго не рекомендуется (детали обещали опубликовать позднее, когда все обновятся).

    Если предполагается использование мобилок и прочих устройств, где нет возможности реализовать подключение через obfs4, тогда открываем дополнительно прямой порт 1515 до OpenVPN

    Ой. До этого, сказав про "у нас obfs4 уже шифрует" вы отключили шифрование на уровне OpenVPN, и трафик на "прямой порт" с мобилок у вас будет ходить в открытом для всех глаз виде.


    1. Goga075 Автор
      23.01.2023 09:08
      -4

      Насколько старые? Разработчики obfs4

      Вы комментарий выдрали из контекста. Читайте внимательней!

      Ой. До этого, сказав про "у нас obfs4 уже шифрует" вы отключили шифрование на уровне OpenVPN, и трафик на "прямой порт" с мобилок у вас будет ходить в открытом для всех глаз виде.

      Данная статья описана с максимальной гибкостью. Ни кто Вам не запрещает отконфигурировать по своему.


      1. MiraclePtr
        23.01.2023 10:44
        +1

        Вы комментарий выдрали из контекста. Читайте внимательней!

        Я и прочитал очень внимательно:
        Но они отказались от поддержки протокола obfs4 и скомпилить бил из свежих исходников не возможно.  Рабочие билды можно будет скачать по ссылке в конце поста. Больше про версию obfs4 ни в соседних абзацах, ни вообще в статье ничего нет. Какой еще контекст упущен конкретно?

        И вопрос все тот же - есть ли этих "старых исходниках" исправление этого недавнего критического бага в протоколе, или же использовать их небезопасно.

        Данная статья описана с максимальной гибкостью. Ни кто Вам не запрещает отконфигурировать по своему.

        Если вы пишете статью типа "мануал" для широкой публики на важную для широкой публики тему, лучше заранее принять, что многие люди будут способны только делать пошагово как написано, а шаг влево-вправо - уже провал. Поэтому лучше заранее подстелить соломки и обратить внимание читателя на все возможные девиации, особенно когда дело касается безопасности.


        1. Goga075 Автор
          23.01.2023 10:54

          Shapeshifter Dispatcher Проект не плохой. Но они отказались от поддержки протокола obfs4

          "они" имеется в виду shapeshifter-dispatcher


          1. MiraclePtr
            23.01.2023 10:58

            Это прекрасно понятно. Но реализацию протокола obfs4 в "старых исходниках" авторы shapeshifter-dispatcher же откуда-то взяли? Весьма вероятно, что из оригинальной кодовой базы obfs4 (он тоже написан на Go, наврядли они переизобретали велосипед) и тогда там, весьма вероятно, присутствует этот критический баг. А если они не переиспользовали код, а писали с нуля сами - то тем более, ибо баг, судя по всему, связан с какими-то неочевидными особенностями работы с эллиптическими кривыми.


            1. Goga075 Автор
              23.01.2023 11:01

              аааа.... мммм... а этого мы и не узнаем.

              Может по этому и отказались от поддержки.


  1. dumasti
    23.01.2023 02:07
    +3

    #comp-lzo не указываем #не хочет дружить с обфускацией

    Не знаю как comp-lzo работает с обфускацией, но во-первых, это устаревшая функция, а во-вторых, она небезопасна и имеет уязвимости.

    Вместо нее теперь можно использовать “compress lz4”.


    1. Goga075 Автор
      23.01.2023 09:19

      compress lz4-v2 Если быть точнее для последней версии OpenVPN

      Но не важно какая версия применяется. Обфускатор не может дешифровать сжатый трафик и выпадает в ошибку.


      1. Vindicar
        23.01.2023 10:32
        +1

        Обфускатор не может дешифровать сжатый трафик и выпадает в ошибку

        А на кой обфускатору дешифровывать сжатый трафик?


        1. Goga075 Автор
          23.01.2023 10:41

          Потому-что сперва идет дешифровка трафика, а потом декомпрессия.


  1. 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 лучше пускать через шифрованный канал, иначе будет утечка метаданных.


    1. Goga075 Автор
      23.01.2023 10:29

      Клиента для мобильных систем нет (android/ios)? Тогда это сильно ограничивает эту схему.

      Увы нету. Вероятнее всего это из-за не популярности данного способа шифрования трафика. Да и представь себе как это высасывало аккумулятор.

      А почему интересно обфускатор требует расшифровки проходящего трафика и нервно реагирует на сжатие?

      Я не очень шарю в криптографии. Но как я понял, обфускатор не может проверить целостность данных после дешифровки.


  1. 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.


    1. Goga075 Автор
      23.01.2023 10:31

      obfs4 не определяется ни чем.


    1. MiraclePtr
      23.01.2023 10:47

       зачем городить костыль когда есть ssl VPN?

      Есть тот же wireguard быстрое решение даже быстрее ipsec, далее ikev2 тоже отличный вариант, теперь варианты обхода жестких блокировок по протоколам openconnect/anyconnect, Ms sstp, outline VPN (для ленивых, медленнее), и уже в конце как самый запасной вариант это openvpn+обусфускатор (wstunnel, stunnel, socks5, и другие)

      Это до тех пор, пока эти варианты работают, если копнуть внимательнее, действительно "жестким блокировкам" большинство этих вариантов противостоять не смогут.


      1. KillJ0y
        23.01.2023 10:51

        Haproxy +SNI что бы держать и сайт на https и sstp, самое разумное решение. Но это уже нюансы настройки sstp


        1. MiraclePtr
          23.01.2023 10:55
          +1

          Haproxy +SNI что бы держать и сайт на https и sstp, самое разумное решение

          Это не решение, а решето, потому что SNI не шифруется и такая конструкция элементарно уязвима к active probing.


          1. KillJ0y
            23.01.2023 11:49

            За то работает, даже если будут блочить протоколы, outline для ленивых разработан для китайского фаервола. Или ssh vpn (заблокировать протокол управления сервера когда они переходят на отечественный linux? Чем черт не шутит). Решений много. Проще всего заблочить народные протоколы (ovpn, wg, ipsec, ikev2) и то ipsec может быть под вопросом бизнес будет много материться когда отвалится несколько десятков офисов. Ситуация двоякая конечно. 100% сделать свое решение чтобы завернуть весь трафик и dns в ssl тунель, и сделать это стандартезированно через openssl на 443 порту с ngnix proxy letsencrypt и легетимным сайтом (не заблочат же они ssl?)


            1. MiraclePtr
              23.01.2023 12:36

              Прочтите статью по ссылке выше. Там разобрано и про SSH, и про Outline (точнее про Shadowsocks внутри него), и про туннель с маскировой под легитимный сайт через SSL. Там очень много неочевидных нюансов и техник выявления, так что все эти варианты сработают, но только до определенного уровня обострения маразма у цензоров :(


              1. KillJ0y
                23.01.2023 12:53

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

                Потребовалось создал решение для раздачи и обновления сертификатов wildcard по всем сайтам, контейнерам и виртуалкам. И для обхода сделаем если будет необходимость. Ведь можно просто изолировать рунет вот вам вк, одноклассники и рутуб, а все остальное экстремистический контент, и что делать тогда ?


  1. mbobka
    23.01.2023 14:45

    Кстати, обфусцированный трафик сотовые операторы считают как торренты и ограничивают до 128кбит/с.


    1. Goga075 Автор
      23.01.2023 15:39

      Даже при fix ttl и смене imei?

      Я целенаправленных тестов не проводил.


  1. maikuss
    23.01.2023 18:41

    Была здесь на Хабре статья "Туннели и VPN, устойчивые к DPI". На мой взгляд, отличное решение с маскировкой личного VPN сервера под вебсайт с котиками. Сейчас она снята с публикации, но по русскоязычному интернету осталось немало её копий.


    1. MiraclePtr
      23.01.2023 20:07

      Есть новая статья на ту же тему: https://habr.com/ru/post/710980/
      И в ней подробно рассказывается, почему описанное в первой статье не сработает :)


      1. maikuss
        24.01.2023 23:12

        Хмм. Я вторую статью не читал, а первую, получается, прочитал, не очень внимательно, или следовал ей не очень четко. Потому что на её основе успешно построил себе VPN сервер. Программку оттуда взял со смешным названием, а также stunnel,и openvpn. Все поставил на роутер, которым у меня тогда работал маленький комп на атоме. Сайт, который хостился в Германии, уже был.


        1. MiraclePtr
          25.01.2023 01:08
          +1

          Про "не сработает" имеется в виду "может быть выявлено при достаточном желании и ресурсах цензоров". Пока что до этого не дошло (и будет надеяться, что не дойдет).

          Кстати, stunnel или wstunnel? Потому что если wstunnel, то программа со смешным названием (которая кнокер) не нужна, а если stunnel, то не понятно, зачем он вообще в этой схеме (для tls-терминирования вместо nginx?)


          1. maikuss
            25.01.2023 14:18

            А, понятно тогда. Ну, что ж , время показало, что с той стороны окошко стали прикрывать быстрее, чем с этой. От того немецкого хостинга пришлось отказаться, а потом у меня и вовсе поменялась ситуация, теперь мне актуален ВПН в обратную сторону, "сервер" стоит в моей московской квартире. А тогда был именно stunnel, не wstunnel. В этой схеме он, может быть, и не нужен, но у меня получилось сделать с ним, а дальше мне стало уже не до этого, заработал канал, и ладно.

            А, кстати, не может ли оказаться более перспективным именно такой вариант, чтобы подключение инициировалось из-за границы, а сервер с ВПН жил в РФ ? Будут ли они так же вдумчиво проверять вебсервера внутри страны?


  1. Chupaka
    24.01.2023 08:17
    +2

    #соберет мелкие пакеты в один,но более крупный #уменьшит нагрузку на сервер и на клиент #при отсутствии трафика незначительно увеличит пинг socket-flags TCP_NODELAY

    TCP_NODELAY не делает ли абсолютно противоположное описанному? No Delay как раз убирает задержку на "сборку" и отправляет доступные данные сразу же, мелкими пакетами.

    Обфускация русского языка в виде "ту-же" и прочих "что-бы" — вообще отдельный привет...


    1. Goga075 Автор
      24.01.2023 08:57

      Действительно. Почему то мне казалось что TCP_NODELAY делает на оборот.