Сегодня при наличии слежки с помощью умных гаджетов, а точнее их программного обеспечения и интернета за каждым нашим шагом, понятно желание каждого пользователя не светить свои личные конфиденциальные данные всему свету. Отсюда и желание пользоваться своим личным VPN и оставаться анонимным в сети.
Из сегодняшней статьи вы узнаете, как поднять свой личный VPN на арендованном сервере. А также о том, как настроить OpenVPN и stunnel так, чтобы даже глубокий анализ пакетов ничего не давал.
Сервисы и блокировки
Как вы наверное знаете, существует огромное количество бесплатных VPN. Но, как известно всем с пеленок, бесплатный сыр только в мышеловке.
Почему же бесплатный VPN —плохая идея?
- Качество. А точнее низкая скорость и постоянные сбои, т.к. одновременно одним и тем же сервисом могут одновременно пользоваться как минимум несколько сотен человек.
- Безопасность. Т.е. никогда не известно, что на самом деле происходит с трафиком, кто и в каких целях имеет к нему доступ.
- Минимальное количество настроек или полное их отсутствие. Это касается так же невозможности выбрать шифр, протокол и порт.
Платные VPN-сервисы отличаются от своих бесплатных товарищей наличием настроек и улучшенным качеством. Но в плане безопасности так же гарантий нет, т.к. точно нельзя знать, хранятся ли логи непосредственно на самом сервере или нет.
Великий китайский файрвол, к примеру, научили определять и блокировать трафик OpenVPN при помощи техники Deep packet inspection (DPI). На какой бы порт вы его ни прятали, будь то UDP 53 или TCP 443, в Китае просто так OpenVPN не попользуешься. Дело в том, что в режиме TLS трафик OpenVPN отличается от обычного трафика HTTPS. Если под рукой есть сниффер, в этом несложно убедиться.
А вот как выглядит обычный HTTPS.
Некоторые популярные платные VPN-сервисы предлагают пользователям средства обхода DPI, но чем больше популярность, тем больше шанс, что провайдер узнает о сервисе и сможет полностью заблокировать доступ к нему. От полной блокировки не защищен никто, но, когда используешь публичный сервис, шанс быть заблокированым всегда выше.
Пара слов об OpenVPN
OpenVPN использует два канала: канал управления (control channel) и канал данных (data channel). В первом случае задействуется TLS — с его помощью ведется аутентификация и обмен ключами для симметричного шифрования. Эти ключи используются в канале данных, где и происходит само шифрование трафика.
Кстати, есть скрипты, которые автоматизируют установку, и процесс занимает меньше времени. Но, во-первых, данные скрипты подходят только для конкретных дистрибутивов, а во-вторых, они не предоставляют выбора. Например, используют RSA и AES-CBC, когда есть поддержка ECDSA и AES-GCM. Т.е, без знания и понимания того, как это работает, вы не сможете подправить скрипт, чтобы он исполнялся на других системах или делал то, что вы хотите.
Что такое stunnel
Stunnel — это утилита для обеспечения защищенного соединения между клиентом и сервером посредством TLS для программ, которые сами шифровать трафик не умеют. Например, можно туннелировать трафик для netcat, vnc и даже bash.
В нашем примере stunnel будет использоваться для маскировки трафика OpenVPN под «чистый» TLS, чтобы его было невозможно определить посредством DPI и, следовательно, заблокировать.
С учетом того что OpenVPN использует шифрование для своего канала данных, у нас есть два варианта настройки:
- использовать шифрование stunnel плюс шифрование канала данных OpenVPN;
- использовать шифрование stunnel, а шифрование канала данных OpenVPN отключить.
Таким образом, в первом варианте получается два слоя: один от stunnel, второй от OpenVPN. Этот вариант позволит использовать RSA вместе с ECDSA. Недостаток в том, что тратится больше ресурсов, и второй вариант позволит этого избежать. В любом случае настройка stunnel остается неизменной.
Что нам понадобится
Вот что нам потребуется для поднятия своего VPN.
Провайдер VPS
Первым делом необходимо выбрать провайдера, который нам предоставит виртуальный выделенный сервер (VPS). Что именно выбирать — дело каждого и зависит от страны и от того, сколько он готов выложить. Основная рекомендация — выбирайте страну, наиболее близкую по географическому расположению, это сведет задержку к минимуму. Но, конечно, живя в Гонконге, покупать сервис в Делли или Париже смысла нет.
Выбор ОС
В моем примере используется RHEL версии 7.4. Для точного копирования команд из статьи сгодится и CentOS 7 (1708), так как это бесплатная и почти идентичная копия RHEL, основанная на его коде. Возможно, подойдут другие дистрибутивы, а также производные RHEL (Fedora), но пути файлов конфигурации и версии программ могут различаться.
Подготовка и первичная настройка
После покупки сервера и установки системы нам нужно как-нибудь зайти на сервер. Я буду делать это с помощью SSH. Для этого можно использовать PuTTYили встроенный в Windows 10 SSH клиент. Вся конфигурация будет проходить в два этапа: настройка на сервере (включает в себя первичную настройку) и настройка клиентов.
После покупки, вам скорее всего, дадут доступ по SSH с логином root и паролем. Позже рекоменедую создать обычного пользователя, а рут-команды выполнять после sudo -i. Нужно это в том числе для безопасности, точнее защиты от брутфорса — пользователь root общеизвестный, и при попытках брута, скорее всего, будет использоваться именно он.
Для начала подключим репозиторий EPEL — пакет openvpn лежит именно там.
1 2 |
$ yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm $ yum update -y |
На RHEL, CentOS, Fedora, OpenSUSE и, возможно, других установлен и включен по умолчанию SELinux. Проверить это можно командой getenforce или sestatus. Чтобы не лезть в дебри его настроек и спастись от возможной боли в лобной части головы, мы переведем его в режим permissive. В данном режиме он будет оповещать нас о нарушениях политик безопасности, но предпринимать никаких действий не станет. Таким образом, у вас всегда будет возможность его поизучать. Для этого изменим директиву в файле /etc/selinux/config:
1 |
SELINUX=permissive |
Перезагружаем и ставим все необходимые пакеты:
1 |
$ yum install -y iptables-services openvpn unzip |
- iptables-services — файлы .service для управления утилитой iptables;
- openvpn — сам сервер OpenVPN;
- unzip — зачем он нужен, попробуйте догадаться сам.
Базовая защита
Поскольку китайские боты, юные хацкеры и скрипт-киддиз не дремлют, они скорее всего, прямо сейчас пробуют сбрутить пароль к вашему серверу, перенесите sshd на другой порт и запретите логин от рута. Только необходимо убедиться, что в системе уже есть другой пользователь с доступом по SSH. В случае, если его нет, добавить нового и установить для него пароль.
1 2 3 |
$ useradd -G wheel -m eakj $ passwd eakj |
где eakj — имя пользователя. В идеале лучше использовать ключи SSH, но в этом случае мы просто обойдемся паролем. Не забудьте проверить, раскомментирована ли строчка %wheel ALL=(ALL) ALL в файле /etc/sudoers. Теперь измените следующие директивы в файле /etc/ssh/sshd_config:
1 2 3 |
Port 12222 PermitRootLogin no PasswordAuthentication yes |
Перечитайте конфиги (systemctl reload sshd), убедитесь, что sshd поднялся без проблем (systemctl status sshd), и попробуйте открыть дополнительную сессию SSH, не закрывая текущей.
Работа на сервере
Easy-rsa
Утилита easy-rsa была создана для облегчения процесс создания Certificate Authority (CA) и управления ими, а также серверными и клиентскими сертификатами. В идеале конечно для CA неплохо было бы выделить специальную машину, но для экономии времени можно использовать все ту же. Поддержку ECDSA добавили в версии 3.0, а в репозиториях у нас 2.2.2, поэтому скачиваем последнюю версию с GitHub. Это готовый бинарник, поэтому ничего компилировать уже не придется.
1 2 3 4 |
$ cd /opt/ && curl -O -L https://github.com/OpenVPN/easy-rsa/archive/master.zip $ unzip master.zip && rm -f master.zip $ cd easy-rsa-master/easyrsa3/ && cp vars.example vars |
После этого в файле vars нужно раскомментировать и настроить некоторые параметры.
/opt/easy-rsa-master/easyrsa3/vars
1 2 3 4 5 6 |
set_var EASYRSA_DN "cn_only" set_var EASYRSA_ALGO ec set_var EASYRSA_CURVE secp521r1 set_var EASYRSA_CA_EXPIRE 3650 set_var EASYRSA_CERT_EXPIRE 3650 set_var EASYRSA_CRL_DAYS 3650 |
Здесь указано, что использовать нужно только Common Name (CN) для Distinguished Name (DN) и криптографию на эллиптических кривых (ec). Также задано название кривой (secp521r1) и время действия сертификатов.
ПРИМЕЧАНИЕ: Некоторые версии OpenSSL отличаются нестабильной работой, так что рекомендую выбирать проверенные эллиптические кривые: prime256v1, secp384r1, secp521r1. В RHEL и родственных дистрибутивах доступны только они. Список можно посмотреть при помощи openssl ecparam -list_curves.
По умолчанию, easyrsa будет искать vars в той же директории, где и сам исполняемый файл. Но для надежности мы объявим переменную окружения:
1 |
$ export EASYRSA_VARS_FILE=/opt/easy-rsa-master/easyrsa3/vars |
Создаем свой CA, а также генерируем сертификаты и ключи сервера и клиентов:
1 2 3 4 |
$ ./easyrsa init-pki $ ./easyrsa --batch build-ca nopass $ ./easyrsa build-server-full openvpn-server nopass $ ./easyrsa build-client-full openvpn-client nopass |
где openvpn-server и openvpn-client — это наш CN для сервера и клиента.
Скопируйте сертификат и ключ сервера в /etc/openvpn/server, а сертификат и ключ клиента — в /tmp.
1 2 |
$ cp -p pki/ca.crt pki/private/openvpn-server.key pki/issued/openvpn-server.crt /etc/openvpn/server/ $ cp -p pki/ca.crt pki/private/openvpn-client.key pki/issued/openvpn-client.crt /tmp/ |
OpenVPN-сервер
Начинаем создание конфигов и настройки сервера OpenVPN.
1 2 |
$ cd /etc/openvpn/server/ $ openvpn --genkey --secret ta.key |
Файл ta.key нужен для директивы tls-auth, которая предоставляет дополнительный уровень защиты для нашего OpenVPN. Этот ключ должен быть и у клиента, поэтому скопируем его в /tmp:
1 |
$ cp -p ta.key /tmp/ |
Пример конфига:
/etc/openvpn/server/openvpn-server.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
### Bind на loopback-адрес и стандартный порт, ### так как коннект из интернета все равно получает stunnel local 127.0.0.1 port 1194 ### Stunnel туннелирует только TCP proto tcp ### Режим туннеля dev tun ### Файлы сертификатов и ключей ca ca.crt cert openvpn-server.crt key openvpn-server.key ### Включаем использование Elliptic Curve Diffie — Hellman (ECDH) dh none ### На сервере ставим 0 tls-auth ta.key 0 ### Явно указываем, что можно использовать для канала управления (control channel) tls-cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256 ### Шифр для канала данных (data channel) cipher AES-256-GCM server 10.8.8.0 255.255.255.0 ### Указываем клиентам перенаправлять весь трафик в туннель, ### где 52.214.41.150 — IP сервера push "redirect-gateway def1" push "route 52.214.41.150 255.255.255.255 net_gateway" ### Указываем использовать эти DNS push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220" ### Включаем возможность использования одного клиентского ### сертификата на многих устройствах одновременно ### для большего контроля — можно выключить (закомментировать) duplicate-cn keepalive 10 120 user nobody group nobody persist-key persist-tun ### Никаких логов. Есть смысл включить для отладки ### в случае сбоя status /dev/null log /dev/null verb 0 |
Также этот конфиг не позволяет клиентам общаться между собой в сети. Если хочется больше контроля, то можно запретить использование одного сертификата на многих устройствах одновременно. Тогда придется генерировать клиентский сертификат для каждого устройства отдельно. Для этого нужно закомментировать duplicate-cn.
Чтобы отключить шифрование, устанавите cipher none, остальное — без изменений. В этом режиме все еще будет проходить аутентификация, но канал данных шифроваться не будет.
Пробуем стартовать:
1 |
$ systemctl start openvpn-server@openvpn-server |
Смотрим статус:
1 |
$ systemctl status openvpn-server@openvpn-server |
То, что идет после @, — это название файла с конфигом. Например, если он у вас называется просто server.conf, тогда будет systemctl start openvpn-server@server.
Если все работает, добавляем автоматическую загрузку:
1 |
$ systemctl enable openvpn-server@openvpn-server |
Сервер stunnel
В репозиториях находиться версия stunnel 4.56, которая не поддерживает верификацию клиентов со стороны сервера, поэтому установим более свежую:
1 2 3 4 |
$ cd /opt && curl -O -L https://rpmfind.net/linux/fedora/linux/updates/25/x86_64/Packages/s/stunnel-5.41-1.fc25.x86_64.rpm $ rpm -ivh stunnel-5.41-1.fc25.x86_64.rpm ### Проверим $ rpm -qi stunnel |
Теперь нужно добавить нового пользователя stunnel и создать ему домашнюю директорию в /var/stunnel:
1 |
$ useradd -d /var/stunnel -m -s /bin/false stunnel |
Проверим, что все успешно:
1 |
$ ls -ld /var/stunnel |
Это делается для того, чтобы не запускать stunnel от root, и дает возможность использовать chroot.
Примерно так должен выглядеть /etc/stunnel/stunnel.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
### Помните: exec исполняется из каталога chroot! chroot = /var/stunnel setuid = stunnel setgid = stunnel pid = /stunnel.pid debug = 0 ## performance tunning socket = l:TCP_NODELAY=1 socket = r:TCP_NODELAY=1 ### curve used for ECDHE curve = secp521r1 sslVersion = all options = NO_SSLv2 options = NO_SSLv3 [openvpn] accept = 443 connect = 127.0.0.1:1194 renegotiation = no ### RSA ciphers = ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-SHA cert = /etc/stunnel/stunnel-server.crt key = /etc/stunnel/stunnel-server.key CAfile = /etc/stunnel/clients.crt verifyPeer = yes |
Основные директивы в этом файле:
- accept = [address:] — указывает, на каком адресе и порте будет слушать наш stunnel;
- connect = [address:] — указывает, на какой адрес и порт будет перенаправляться трафик;
- cert = — абсолютный путь к сертификату;
- key = — абсолютный путь к ключу от этого сертификата. Эту директиву можно опустить, если ключ встроен в файл с сертификатом.
Имя сервиса [openvpn] заключается в квадратные скобки и может быть произвольным.
Создадаем ключи и сертификаты:
1 2 3 4 |
$ cd /etc/stunnel $ openssl req -newkey rsa:2048 -nodes -keyout stunnel-server.key \ -x509 -days 3650 -subj "/CN=stunnel-server" \ -out stunnel-server.crt |
Так как все сертификаты клиентов должны быть записаны в clients.crt на сервере, сгенерируем их:
1 2 3 4 5 6 7 8 9 10 |
$ openssl req -newkey rsa:2048 -nodes -keyout eakj-desktop.key \ -x509 -days 3650 -subj "/CN=eakj-desktop" \ -out eakj-desktop.crt $ openssl req -newkey rsa:2048 -nodes -keyout eakj-mobile.key \ -x509 -days 3650 -subj "/CN=eakj-mobile" \ -out eakj-mobile.crt $ openssl pkcs12 -export -in eakj-mobile.crt \ -inkey eakj-mobile.key -out eakj-mobile.p12 |
При генерации eakj-mobile.p12 нужно будет ввести пароль, не забудьте его. Используйте менеджер паролей KeePass.
Запишем все клиентские сертификаты в clients.crt. Вот что должно примерно получиться:
1 2 3 4 5 6 7 8 9 10 11 |
<strong>/etc/stunnel/clients.crt</strong> ### eakj-desktop -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- ### eakj-mobile -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- |
Стартуем:
1 |
$ systemctl start stunnel |
И проверяем:
1 |
$ systemctl status stunnel` |
Если все работает, добавляем на автостарт:
1 |
$ systemctl enable stunnel |
Как и в случае с OpenVPN, скопируем клиентские файлы, а также серверный сертификат в /tmp:
1 |
$ cp -p eakj-* stunnel-server.crt /tmp/ |
Настройка файрвола и маршрутизации
Утилита iptables — это мощный инструмент, но он не терпит ошибок в конфигурации. Стоит быть предельно аккуратным и перепроверять правила, чтобы случайно не закрыть самому себе доступ. Открыть его после этого бывает трудно, и только с помощью провайдера VPS.
Чтобы снизить риск перекрытия доступа самому себе, рекомендую не прописывать iptables в автозагрузку и для начала хорошенько проверить содержимое файла /etc/sysconfig/iptables. Если что-то пойдет не так, то вы сможете перезагрузить машину и продолжить эксперименты.
Ну а если уверены, что все настроили правильно, то пишите:
1 |
$ systemctl enable iptables |
В некоторых случаях firewalld может быть установлен и включен по умолчанию, например на минимальной установке CentOS 7.4. Так что для начала лучше проверьте:
1 |
$ systemctl status firewalld |
Если он включен, то нужно его остановить и убрать из автозагрузки.
1 2 3 |
$ systemctl stop firewalld $ systemctl disable firewalld $ systemctl status firewalld |
Убедимся, что список правил у нас пуст (iptables -nvL), и приступим.
Нам необходимо создать набор базовых правил для файрвола, который говорит:
- позволять пинг;
- принимать любой трафик на интерфейс lo;
- пропускать пакеты на порты 443 и 12222 (еще не забыл, что мы перенесли наш SSH?);
- а также принимать ответы на наши исходящие запросы. Больше информации о conntrack можно найти в интернете.
1 2 3 4 5 |
$ iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT $ iptables -A INPUT -i lo -j ACCEPT $ iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT $ iptables -A INPUT -p tcp --dport 443 -j ACCEPT $ iptables -A INPUT -p tcp --dport 12222 -j ACCEPT |
Пока эти правила ничем не опасны, так как у них стоит действие ACCEPT, то есть принимать и пропускать. Смотрим, все ли добавилось (снова iptables -nvL).
Далее нам понадобится несколько правил переадресации.
1 2 |
$ iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT $ iptables -A FORWARD -i tun+ -s 10.8.8.0/24 -j ACCEPT |
Здесь 10.8.8.0/24 — адрес и маска подсети, которую мы указывали в openvpn-server.conf.
Добавим правила, которые позволят клиентам отсылать и принимать пакеты из интернета. Тут возможны два варианта: вариант, когда у вас есть статический IP, и вариант, когда адрес динамический.
Первый лучше тем, что не тратятся ресурсы на определение IP-адреса. Преимущество второго варианта — в том, что не надо иметь статический IP. Если вы не уверены или не знаете, какой у вас, используйте второй вариант. Для начала узнаем свой адрес командой ip a. У меня сервер за NAT, поэтому и IP тут локальной сети.
Вот варианты правил. Помните, что вам нужно либо 1, либо 2, вместе их не добавляйте.
- iptables -t nat -A POSTROUTING -s 10.8.8.0/24 -o eth0 -j SNAT —to-source 172.31.26.46, где 172.31.26.46 — это IP, присвоенный интерфейсу, который смотрит в инет, а eth0 — это сам интерфейс.
- iptables -t nat -A POSTROUTING -s 10.8.8.0/24 -o eth0 -j MASQUERADE.
Осталось указать политику DROP по умолчанию для цепочек INPUT и FORWARD, после чего сохраним наши правила.
1 2 3 |
$ iptables -P INPUT DROP $ iptables -P FORWARD DROP $ iptables-save > /etc/sysconfig/iptables |
Политика по умолчанию срабатывает после того, как отработали все правила в цепочке. Поэтому перед тем как ее применить, стоит удостовериться, что все нужные порты открыты.
Если на этом этапе вы еще не потеряли доступ к своему серверу, тогда добавим правила в автозагрузку и продолжим.
1 |
$ systemctl enable iptables |
Далее нам нужно включить форвардинг пакетов, так как по умолчанию он выключен. Проверить это можно командой
1 |
$ sysctl net.ipv4.ip_forward |
Если вывод команды показывает net.ipv4.ip_forward = 1, то ничего делать не нужно, форвардинг уже включен. Если же net.ipv4.ip_forward = 0, то в файле /etc/sysctl.conf нужно изменить уже существующую или добавить новую строчку net.ipv4.ip_forward = 1. Это позволит нашим изменениям переживать перезагрузку. Далее выполним команду sysctl -p, чтобы изменения применились немедленно.
Настройка клиентов
Настройка сервера закончена. Сейчас у нас в /tmp должны быть все необходимые файлы для клиентов.
Как видно, некоторые файлы доступны для чтения только руту, что не позволит их скачать при помощи scp (ведь логин от рута у нас запрещен). Поэтому присвоим им другого владельца командой
1 |
$ chown eakj: /tmp/{ta.key,ca.crt,openvpn-client.crt,openvpn-client.key} |
где eakj — это имя пользователя, которого мы создали в начале для доступа по SSH. Не забудьте удалить эти файлы из /tmp на сервере. После того как настроите все свои клиенты, они там только для удобства скачивания.
Для экономии времени я возьму один и тот же сертификат и ключ для подключения к OpenVPN в Linux, Windows и Android. Но на Android будет другой сертификат и ключ для подключения к stunnel, так как там придется использовать формат PKCS#12.
Клиент stunnel
Linux
С правами разобрались, перейдем к настройке клиента. Нужно скачать и установить stunnel, обычно он есть в репозиториях и c установкой нет проблем. Также исходники можно найти на официальном сайте.
В Fedora надо набрать dnf install -y stunnel, в Arch Linux: pacman -S stunnel, в Ubuntu: apt install stunnel4.
В Ubuntu 16.04.3 LTS пакет stunnel4 имеет версию 5.30, которая не поддерживает верификацию (verifyPeer), поэтому придется или найти свежий пакет, или закомментировать verifyPeer и CAfile. Также нужно изменить ENABLED=0 на ENABLED=1 в файле /etc/default/stunnel4. Возможны и другие мелкие отличия, для их обнаружения понадобится включить логирование.
Теперь скачаем клиентские файлы командой scp. Обратите внимание, что для записи в /etc/stunnel нужны права рута, поэтому и scp нужно запустить от суперпользователя.
1 |
$ scp -P 12222 eakj@52.214.41.150:"/tmp/{eakj-*,stunnel-server.crt}" /etc/stunnel/ |
Теперь нужно создать клиентский /etc/stunnel/stunnel.conf. Вот пример.
1 2 3 4 5 6 7 8 9 10 11 12 |
[openvpn] client = yes accept = 127.0.0.1:1194 connect = 52.214.41.150:443 ### Проверить сервер verifyPeer = yes ### Для этого нужен его сертификат CAfile = /etc/stunnel/stunnel-server.crt ### Сертификат и ключ нужен для проверки ### клиента (verifyPeer) на сервере cert = /etc/stunnel/eakj-desktop.crt key = /etc/stunnel/eakj-desktop.key |
Запускаем (systemctl start stunnel) и проверяем (systemctl status stunnel).
Windows
Для начала нужно скачать и установить stunnel. Найти его можно на официальном сайте.
Затем нужно скачать клиентские сертификаты и ключи с нашего сервера и поместить их в C:\Program Files (x86)\stunnel\config, как показано на скрине. Я делал это при помощи WinSCP, вы можете использовать любой удобный вам клиент SSH. После установки и запуска увидите главное окно программы.
Нужно отредактировать стандартный конфиг, а также переместить или удалить сгенерированные при установке ключи и сертификаты. Я переместил их в папку old. Для Windows конфиг почти идентичен линуксовому, только с другими путями.
1 2 3 4 5 6 7 8 9 10 11 12 |
[openvpn] client = yes accept = 127.0.0.1:1194 connect = 52.214.41.150:443 ### Проверить сервер verifyPeer = yes ### Для этого нужен его сертификат CAfile = C:\Program Files (x86)\stunnel\config\stunnel-server.crt ### Сертификат и ключ нужны для проверки ### клиента (verifyPeer) на сервере cert = C:\Program Files (x86)\stunnel\config\eakj-desktop.crt key = C:\Program Files (x86)\stunnel\config\eakj-desktop.key |
После того как изменили и сохранили конфиг, в окне stunnel жмем Configuration → Reload Configuration.
Android
В качестве клиента stunnel на мобильных устройствах будет использоваться приложение SSLDroid. Перенесем на телефон файл eakj-mobile.p12 и настроим приложение.
Укажем путь к файлу, введем пароль, который запомнили при генерации eakj-mobile.p12, сохраним настройки и запустим сервис.
Клиент OpenVPN
Linux
Скачаем и установим openvpn из репозитория. Клиент и сервер идут вместе. В Fedora пилите: dnf install -y openvpn, в Arch Linux: pacman -S openvpn, в Ubuntu: apt install openvpn.
Скачаем файлы клиента с сервера при помощи scp. Для записи в /etc/openvpn/client/ также нужны права рута.
В Ubuntu клиентские файлы хранятся в /etc/openvpn/ и сервисы называются openvpn@<имя конфиг файла>. Например:
1 |
$ systemctl start openvpn@openvpn-client |
В репозиториях Ubuntu 16.04.3 LTS пакет openvpn имеет версию 2.3.10, а поддержка AES-256-GCM появилась в 2.4. Придется или найти свежий пакет, или использовать шифрование AES-256-CBC (не забудь изменить и на сервере). Также могут возникнуть проблемы с отсутствием группы nobody (фиксится командой groupadd nobody). Если что-то еще пойдет не так, включайте логи и чините.
1 |
$ scp -P 12222 eakj@52.214.41.150:"/tmp/{openvpn-client*,ca.crt,ta.key}" /etc/openvpn/client/ |
Примерный файл конфигурации /etc/openvpn/client/openvpn-client.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
client dev tun proto tcp remote 127.0.0.1 1194 resolv-retry infinite nobind user nobody group nobody persist-key persist-tun ca ca.crt cert openvpn-client.crt key openvpn-client.key ### на клиенте 1 tls-auth ta.key 1 remote-cert-tls server cipher AES-256-GCM verb 3 |
Для отключения шифрования делаем то же, что и на сервере: cipher none.
При таком конфигурационном файле клиенту всегда нужно носить с собой пять файлов:
- файл конфигурации (openvpn-client.conf);
- сертификат CA (ca.crt);
- клиентский сертификат (openvpn-client.key);
- клиентский ключ (openvpn-client.key);
- ключ для tls-auth (ta.key).
Это может быть не всегда удобно, поэтому есть возможность записать их содержимое в конфигурационный файл. Вместо ca ca.crt, cert client.crt, key client.key и tls-auth ta.key 1 используется , , , key-direction 1 и . Выглядит это примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<ca> содержимое ca.crt </ca> <cert> содержимое openvpn-client.crt </cert> <key> содержимое openvpn-client.key </key> ### Указываем что tls-auth на стороне клиента key-direction 1 <tls-auth> содержимое ta.key </tls-auth> |
Детальнее пример такого конфига рассмотрим при настройке клиента Android.
Стартуем:
1 |
$ systemctl start openvpn-client@openvpn-client |
и проверяем:
1 |
$ systemctl status openvpn-client@openvpn-client |
Windows
Скачать клиент OpenVPN для Windows можно c официального сайта. Конфиги хранятся в C:\Program Files\OpenVPN\config. После установки нужно скачать клиентские сертификаты и ключи с нашего сервера и поместить их в C:\Program Files\OpenVPN\config, как показано на скрине. Будем использовать те же сертификаты и ключи, что и для Linux (привет duplicate-cn).
Чтобы создать клиентский конфиг, открывай «Блокнот» от админа, копируйте пример и удаляйте user nobody и group nobody. Должно получиться как на скрине. Заметьте, используется расширение .ovpn.
Стартуем и видим заветную надпись Initialization Sequence Completed — значит, все работает.
Android
Для Android есть приложение OpenVPN for Android, будем использовать именно его. Конфиг с записанными в него сертификатами и ключами выглядит примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
client dev tun proto tcp remote 127.0.0.1 1194 resolv-retry infinite nobind user nobody group nobody persist-key persist-tun remote-cert-tls server cipher AES-256-GCM ### На клиенте можно :-) verb 3 ### Содержимое ca.crt <ca> -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- </ca> ### Содержимое openvpn-client.crt <cert> -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- </cert> ### Содержимое openvpn-client.key <key> -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY----- </key> ### Указываем, что tls-auth на стороне клиента key-direction 1 ### Содержимое ta.key <tls-auth> ## ## 2048 bit OpenVPN static key ## -----BEGIN OpenVPN Static key V1----- ... -----END OpenVPN Static key V1----- </tls-auth> |
Как вы могли заметить, файл openvpn-client.crt в начале содержит примерно следующую информацию.
1 2 3 4 5 6 7 8 9 10 11 |
Certificate: Data: Version: 3 (0x2) Serial Number: 9b:0a:56:f3:d4:70:97:66:d9:92:81:54:26:fc:9c:53 Signature Algorithm: ecdsa-with-SHA256 Issuer: CN=ChangeMe Validity Not Before: Dec 4 22:02:32 2017 GMT Not After : Dec 2 22:02:32 2027 GMT Subject: CN=openvpn-client |
Все это можно опустить и добавить в файл конфига только сам сертификат (от пометок BEGIN до END), как сделано в примере.
Переместим готовый конфиг на устройство и начнем настройку приложения. В главном меню жмем плюсик, потом «Импорт», выбираем нужный конфиг и сохраняем.
Нажимаем на импортированный профиль и наблюдаем за процессом подключения.
Наконец, видим три заветных слова: Initialization Sequence Completed. Все работает! В некоторых случаях может понадобиться подкорректировать значение MSS, о чем это приложение нам любезно сообщит. Удачной отладки!
Очень хорошая статья спасибо за труды
Очень круто! большое спасибо. Автор явно шарит!!! На пальцах объясняет такую не самую простую тему!
а как быть с ios?
Здравствуйте. настроил все по вашему ману все работает, вопрос подскажите как с внешнего ip попадать на внутренний ip/10.8.8.6 клиент windows,сервер centos. допустим попасть нужно по rdp на клиентскую машину где установлен клиент.
пробовал так не получилось :
iptables -t nat -A PREROUTING —dst x.x.x.x -p tcp —dport 3389 -j DNAT —to-destination 10.8.8.6
Вы показали только DNAT, а FORWARD у вас прописан для данной цели?
Полезно. Но некоторые моменты могут поставить в тупик. Например, когда мы добавляем пользователя и запрещаем root, нужно добавить строку AllowUsers в sshd_config, а если не отключить или не настроить работающий в centos фаервол то на порт 12222 пускать не будет (как и на 22, если изменена строка в конфиге), так что отключать фаервол лучше сразу после редактирования sshd_config. Смартфон с при использовании 127.0.0.1 у меня не подключался — получилось с «localhost». easy-rsa лучше взять командой git clone.
Наконец то зашла речь о маскировке факта использования VPN, сколько ни бился -ни от кого толку не добился. Возможно я ошибаюсь но вряд ли stunnel решает проблему полностью, вот почему: при средней активности среднего пользователя имеется куча соединений, при использовании VPN -одно. Отсюда вопрос: сложно ли написать какой-нибудь алгоритм для DPI который будет мониторить такие одиночные соединения, думаю не очень. Из идей как решить такую проблему-это поднять у себя что-то вроде генератора шума, который будет генерировать в сеть левый фуфло-трафик. Как это сделать?
не ставиться stunnel. в приведенной вами ссылке пусто, поставил версию повыше. но все равно вылетает nokey
warning: stunnel-5.44-5.fc28.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 9db62fb1: NOKEY
error: Failed dependencies:
libcrypto.so.1.1()(64bit) is needed by stunnel-5.44-5.fc28.x86_64
libcrypto.so.1.1(OPENSSL_1_1_0)(64bit) is needed by stunnel-5.44-5.fc28.x86_64
libssl.so.1.1()(64bit) is needed by stunnel-5.44-5.fc28.x86_64
libssl.so.1.1(OPENSSL_1_1_0)(64bit) is needed by stunnel-5.44-5.fc28.x86_64
Необходимо нагуглить именно указанный автором релиз stunnel. По ссылке, указанной автором, действительно, необходимого rpm уже нет.
Может кто подсказать по тунелю. Он вроде качает файл, хотя если вбить адрес этот в урл то выдает ошибку. И при установке выдает такое.
cd /opt && curl -O -L https://rpmfind.net/linux/fedora/linux/updates/25/x86_64/Packages/s/stunnel-5.41-1.fc25.x86_64.rpm
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 276 100 276 0 0 814 0 —:—:— —:—:— —:—:— 816
rpm -ivh stunnel-5.41-1.fc25.x86_64.rpm
error: open of failed: No such file or directory
error: open of failed: No such file or directory
error: open of 404 failed: No such file or directory
error: open of Not failed: No such file or directory
error: open of Found failed: No such file or directory
error: open of failed: No such file or directory
error: open of Not failed: No such file or directory
error: open of Found failed: No such file or directory
error: open of The failed: No such file or directory
error: open of requested failed: No such file or directory
error: open of URL failed: No such file or directory
error: open of /linux/fedora/linux/updates/25/x86_64/Packages/s/stunnel-5.41-1.fc25.x86_64.rpm failed: No such file or directory
error: open of was failed: No such file or directory
error: open of not failed: No such file or directory
error: open of found failed: No such file or directory
error: open of on failed: No such file or directory
error: open of this failed: No such file or directory
error: open of server. failed: No such file or directory
error: open of failed: No such file or directory
на android 8 ssldroid завелся у кого-нить? На android 5 нормально работает, но в 8-ке даже порт не открывает, судя по логам
А на android 8 ssldroid работает у кого-нить? У меня не создает порт прослушки, хотя на 5-м все пошло
Решилось установкой вместо ssldroid связки termux+stunnel
SELinux в отношении Stunnel можно уговорить следующим образом: semanage permissive -a stunnel_t
А т.к. OpenVPN подымаем в данном случае на родном порту (1194), то SELinux будет не против :)
Если следовать автору в отношении смены порта SSH, тогда: semanage port -a -t ssh_port_t -p tcp 12222
Всем привет. А если мы говорим про скрытие трафика в чем разница между между OpenVPN+Stunnel или использование OpenConnect (ocserv) TCP на 433 порту без шифрования?
Так же если основной сервер заблокирован, то как нам лучше делать перенаправленные с не заблокированного IP через IPtables (iptables -t nat -A PREROUTING -p tcp —dport 443 -i eth0 -j DNAT —to Server main IP;) или поднимать SSH тунель? Что порекомендуете?
Какие советы можете дать?
здравствуйте ! как записать подскажите пожалуйсто не очен понял этот часть
Запишем все клиентские сертификаты в clients.crt. Вот что должно примерно получиться:
### eakj-desktop
——BEGIN CERTIFICATE——
…
——END CERTIFICATE——
### eakj-mobile
——BEGIN CERTIFICATE——
…
——END CERTIFICATE——
Статейка — огонь! Весь день мучился, пока на неё не наткнулся.