LEAP Docs
GitHub Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Настройка обфусцированного VPN (1/2)

Note
В этом туториале устанавливается обфусцированный VPN-шлюз. Мы пройдём все шаги в очень заботливой и подробной манере:). Он не предполагает каких-либо знаний в области системного администрирования (но умение работать с терминалом будет плюсом). Вам понадобится доступ к VPS-провайдеру по вашему выбору, чтобы создать новые виртуалки (в идеале - три, но можно обойтись и двумя или даже одной для тестирования). Если вы предпочитаете обращаться непосредственно к технической документации, вы можете пропустить этот туториал и посмотреть непосредственно docker compose in obfsvpn.

Author

kikki

Last edited

25 Mar 2023

Обзор

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

💡
Зачем нам нужны три дополнительных сервера, чтобы просто использовать интернет? Короткий ответ: потому что есть больше одного злоумышленника, от которого мы хотим защититься. Во-первых, это администратор самого сайта: сайты могут регистрировать IP-адреса пользователей и пытаться использовать цифровой отпечаток. Во-вторых, это провайдер пользователя: он регистрирует сайты, которые пользователь пытается посетить/посещает, и может блокировать запросы по своему усмотрению.

Шлюз обеспечивает повышенную конфиденциальность для пользователя при работе в публичном Интернете.

Сайты воспринимают весь трафик пользователя как исходящий от шлюза, который действует как адрес прикрытия для нескольких человек одновременно.

Хоть мы и пытаемся скрыть истинный IP-адрес пользователя, на сетевом уровне мы не можем остановить получение цифрового отпечатка браузера, это задача браузера.

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

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

  1. Во-первых, потому что трафик OpenVPN можно поймать.

  2. Во-вторых, шлюзы попадают в глобальный список для больших объемов исходящего трафика или даже для умеренно известных сервисов, таких как RiseupVPN.

Мы не можем использовать протокол OpenVPN к шлюзу, если, например, подключаемся из Ирана, России или Китая.

Чтобы скрыть протокол OpenVPN от глаз потенциального цензора, мы будем использовать другой протокол, obfs4, для инкапсуляции (воспринимайте это как сокрытие) данных OpenVPN. Obfs4 разработан так, чтобы выглядеть как шум, рандомно зашифрованный поток байтов. Сейчас он является одним из наиболее широко используемых подключаемых транспортов, используемых для обхода цензуры в сообществе Tor в настоящее время.

⁉️
Подключаемые транспорты - это инициатива сообщества, которое занимается исследованиями и разработкой новых, простых в использовании способов обхода цензуры по всему миру.

Мы запустим obfs4 на отдельной машине, которая будет мостом между пользователем и шлюзом.

Пользователь будет посылать ему неприметные, обфусцированные байты, а затем мост будет разворачивать их в OpenVPN-соединение со шлюзом, а затем шлюз будет пересылать их в публичный интернет.

Чтобы дополнительно запутать цензоров, мы поддерживаем автоматическую смену мостов через случайные промежутки времени, об этом будет рассказано по ссылке:https://docs.leap.se/ru/tutorials/obfsvpn-part-2-hopping/[Часть 2 этого руководства].

😁 😁 😁

Итак…​ давайте начнем!

Настройка OpenVPN шлюза

В этом руководстве мы будем использовать обычного облачного провайдера, Digital Ocean, для того, чтобы проиллюстрировать, как можно установить программное обеспечение в более или менее готовом сервисе из множества доступных.

Несколько слов предостережения
Если вы думаете о том, чтобы использовать ваш VPN-сервис в реальной жизни, вам нужно дважды подумать о том, где вы собираетесь разместить свой VPN-сервис. Это очень важно для VPN, потому что во время попыток изменить то, насколько сильно ваш провайдер или другие субъекты могут вмешиваться в ваш трафик, вам придётся сильно доверять сетям и оборудованию, от которых будет зависеть ваш VPN-сервис. Вот так, вы становитесь своим собственным VPN-провайдером, и вы доверяете людям в центре обработки данных. Так что выбирайте тщательно ;)

Войдите в систему вашего облачного провайдера и создайте новые машины

  1. На вкладке create выберите "create new droplet".

  2. Выберите ubuntu по умолчанию.

  3. Выберите самый дешевый тарифный план (нам не нужно ничего особенного для работы OpenVPN).

  4. Назовем дроплет как-нибудь осмысленно, например, "obfsvpn-gateway". Но ничего страшного, если вы хотите использовать свое котячье имя, лишь бы не забыли 😉 .

  5. Не заканчивайте создание!

Добавление ключа SSH

Этот и следующий раздел предполагают наличие unix-подобной среды.

  1. Нажмите "Добавить ключ ssh". У вас должно появиться поле, в которое нужно ввести ключ.

  2. В терминале: cd .ssh.

  3. Создайте новый ключ с помощью ssh-keygen.

  4. Скопируйте свой открытый ключ в поле.

  5. Завершите создание дроплета. После завершения у вас должна быть возможность увидеть и скопировать IP новой машины.

Подключение к новой машине

Откройте терминал и выполните ssh на новой машине:

ssh -i yourkeyfile root@gateway-ip

После ввода парольной фразы, которую вы задали на этапе генерации ssh-ключа, вы должны увидеть консоль root. Нам нужно будет установить openvpn и easy-rsa для подготовки к следующему этапу.

apt install openvpn easy-rsa

Создание каталога инфраструктуры открытых ключей для OpenVPN

Итак, теперь нам нужно сгенерировать несколько ключей. Почему? Потому что мы хотим быть уверены, что наши openvpn клиенты будут подключаться к нашему шлюзу (а не к какой-то другой сомнительной машине, которую кто-то другой мог поставить посередине). Мы также хотим, чтобы наш openvpn сервер принимал только тех клиентов, которых мы предварительно авторизировали. Вы можете заглянуть на страницу Public Key infrastructure в Википедии, но, если вы торопитесь, суть, в общем-то, изложена выше. Вы делали это миллион раз - на самом деле это почти тот же процесс, что и для ключей ssh, которые мы только что использовали выше.

💡
Этот шаг сохранит пары ключей; если вы захотите сменить центр сертификации, вам следует повторить этот шаг, но также не забудьте сгенерировать новые клиентские сертификаты.

Пакет easy-rsa от Ubuntu не помещает easyrsa в PATH, поэтому мы скопируем весь каталог easyrsa в наш будущий каталог ключей:

cp -r /usr/share/easy-rsa /etc/openvpn
cd /etc/openvpn/easy-rsa
# now we can init our empty pki dir
./easyrsa init-pki

Создать центр сертификации (CA)

Когда две стороны хотят безопасно общаться, они обмениваются открытыми ключами шифрования.

Однако как узнать, что используется КОРРЕКТНЫЙ ключ, который действительно принадлежит другой стороне?

Сертификат TLS содержит не только сам ключ, но и подпись от некоторого доверенного лица о том, что этот ключ принадлежит тому, за кого он себя выдает.

В этом туториале мы сами создадим эту доверенную сущность - всемогущий центр сертификации.

С помощью всего одной команды:

./easyrsa build-ca

Скопируйте созданный ca.crt куда-нибудь! Он понадобится нам позже на клиентской машине.

Генерируем ключ для сервера OpenVPN

Мы генерируем запрос и подписываем его:

./easyrsa gen-req server
./easyrsa sign-req server server server

Да, эта машина будет и нашим vpn-сервером, и центром сертификации (при установке для долгосрочного использования вы, вероятно, захотите вынести центр сертификации за пределы сети и просто копировать сертификаты и ключи). Также, в качестве дополнительного уровня безопасности (помимо TLS) OpenVPN предлагает дополнительную защиту (добавляя безопасность к каналу управления). Для этого нам нужен статический ключ preshared. Сгенерируйте его с помощью:

openvpn --gen-key > ta.key

Этот ta.key нам также нужно будет впоследствии скопировать на клиент.

Наконец, сгенерируйте параметры для протокола Диффи-Хеллмана. Они не будут использоваться вместе:

openssl dhparam -out dh2048.pem 2048

Создание конфигурационного файла сервера OpenVPN

Начните с копирования примера конфигурации из папки документации openvpn.

cd ..
cp /usr/share/doc/openvpn/examples/configs/server.conf .

Затем отредактируйте файл server.conf так, чтобы он выглядел следующим образом:

proto tcp

ca easy-rsa/pki/ca.crt
cert easy-rsa/pki/issued/server.crt
key easy-rsa/pki/private/server.key

Для клиентов вам понадобятся pki/issued/server.crt и ca.crt.

Запуск OpenVPN

  • openvpn --config server.conf

  • Вывод без ошибок заканчивается словом "completed"

  • Если всё работает, остановите это с помощью ctrl+c, затем

  • systemctl enable openvpn@server.service

  • systemctl start openvpn@server.service

Это заставит его работать в фоновом режиме и автозапускаться при загрузке машины.

Включить маршрутизацию в интернет

Сейчас пакеты, идущие в нашу VPN, могут достигать только нашей VPN, вы не можете использовать duckduckgo через неё. Чтобы изменить это, мы изменим правила iptables.

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Настройка мостов OBFS4

Итак, у нас есть работающий VPN-шлюз. Теперь мы настроим мосты, чтобы "скрыто подключиться" к VPN.

Создаем новую машину

💡
Вы можете добавить мост в ту же машину, что и шлюз OpenVPN для тестов, но это не очень хорошая идея. Цензоры быстро заметят при проверке, что у вас открыт один порт рядом с чем-то другим, что явно является сервером OpenVPN. Это в некотором роде разрушает попытку быть скрытным. На самом деле, в реалистичной системе вы хотите, чтобы эти мосты находились не в тех диапазонах IP, в которых находятся ваши шлюзы.
  • Войдите в Digital Ocean

  • Создайте новый дроплет с минимальными характеристиками. Мы назовем его obfs-bridge.

  • Запишите его IP.

  • Подключитесь к нему с помощью ssh аналогично настройке openvpn выше.

  • Теперь вы root!

Подготовка двоичных файлов

apt install golang make git
git clone https://0xacab.org/leap/obfsvpn
cd obfsvpn/cmd/server
make build

Создание сертификата obfs

Чтобы провести быстрый тест, мы можем скопировать некоторые ключи obfs4: Прочитайте Appendix чтобы узнать, как их генерировать.

  • cp -r ../../server/test_data .

Установить целевой шлюз

Для удобства повторного использования мы экспортируем некоторые переменные:

export LHOST=<your bridge ip>
export LPORT=<any port you want>
export RHOST=<gateway ip:port>
Note
Не забудьте открыть порт для вашего моста в брандмауэре машины.

Запустите мост!

make certs
./server -addr ${LHOST} -port ${LPORT} -vpn ${RHOST} -state test_data -c test_data/obfs4.json

Запуск клиента obfs4

На любой машине, с которой вы хотите подключиться:

apt install golang make git
git clone https://0xacab.org/leap/obfsvpn
cd obfsvpn
make build-client
./obfsvpn-client -c <certificate string from your obfs4.json> -r <your bridge ip, LHOST> -rp <your bridge port, LPORT>

Если всё идет хорошо, будет сообщение, что порт socks5 открыт на 8080. Однако, чтобы иметь возможность использовать его, нам нужно настроить наш клиент OpenVPN.

Настройка клиента OpenVPN

Повторите шаги для OpenVPN-сервера, но остановитесь после генерации pki dir.

  • Скопируйте ta.key с сервера в папку openvpn.

  • Скопируйте ca.crt с сервера в папку pki dir

  • Из /etc/openvpn/easy-rsa создайте клиентский запрос на получение сертификата:

  • На клиенте: ./easyrsa gen-req server.

  • Скопируйте его в каталог pki/reqs сервера:

  • На сервере: ./easyrsa sign-req client client client client

  • Скопируйте сертификат pki/выпущенный сертификат в папку pki клиента.

  • Скопируйте файл образца клиента

  • cp /usr/share/doc/openvpn/examples/configs/client.conf .

  • Отредактируйте его так, чтобы он указывал на ваши файлы и на ваш шлюз.

1
2
3
4
5
6
proto tcp
remote <gateway host> <gateway port>

ca easy-rsa/pki/ca.crt
cert easy-rsa/pki/client.crt
key easy-rsa/pki/private/client.key
  • Проверьте, что прямое подключение к шлюзу произошло успешно:

  • openvpn -c client.conf.

  • Проверьте, что вывод заканчивается словом completed.

  • На шлюзе, ip addr.

  • Находим IP интерфейса tun0.

  • На клиенте: ping -I tun0 <gateway tun0 ip>.

Если это работает, вы можете попробовать пинговать внешний интернет:

ping -I tun0 8.8.8.8

Поздравляем! Как минимум прямой OpenVPN-туннель работает.

Теперь давайте проверим обфусцированный OpenVPN-туннель!

openvpn -c client.conf --remote <obfs4_ip> <obfs4_port> --socks-proxy 127.0.0.1 8080

Если он работает успешно:

ping -I tun0 8.8.8.8

Работает ли он? Да? Супер! Нет? Пришлите нам свою ошибку, чтобы мы дополнили раздел по устранению неполадок.

Приложение: Генерация своего obfs4 сертификата

apt install python3-pysodium
wget -O gen-shapeshifter-state.py https://0xacab.org/leap/container-platform/lilypad/-/raw/main/playbooks/scripts/gen-obfs4-state.py?ref_type=heads
python3 gen-shapeshifter-state.py statedir

И возьмите свои файлы из папки statedir.

К следующему шагу!
Мы могли бы остановиться на этом, но сейчас подходящий момент, чтобы выпить немного чая, похлопать себя по спине и перейти по ссылке:https://docs.leap.se/ru/tutorials/obfsvpn-part-2-hopping/[вторая часть туториала]. В ней мы добавим еще один мост и научим нашего клиента переключаться между обоими мостами.