Продвинутое использование OpenVPN


Оглавление

1. Скрипт для автоматизации создания конфигурационных файлов OpenVPN

1.1 Повторный запуск скрипта OpenVPNassistent

2. Как использовать файлы .ovpn с сервером и клиентами OpenVPN

3. Как подключиться к OpenVPN с Android

4. Как с помощью OpenVPN получить доступ к сетевым службам на компьютерах за NAT (с частным IP)

5. Как сделать статичные IP для клиентов OpenVPN

6. Обход перехватывающего портала с помощью OpenVPN

7. Обход перехватывающих порталов с телефона

8. Доступ к публичным ресурсам сервера OpenVPN

9. Как захватывать и анализировать VPN трафик с Wireshark

10. Переход с OpenVPN 2.4.* на OpenVPN 2.5.*

11. Как использовать OpenVPN с протоколом TCP

12. Сравнение производительности (скорости передачи данных) OpenVPN через UDP и TCP

13. Одновременное использование нескольких OpenVPN на одном сервере

14. Исправление ошибок «TLS Error: TLS key negotiation failed to occur within 60 seconds» и «TLS handshake failed»

15. Управление OpenVPN соединениями в Linux

15.1 Управление настройками VPN в Cinnamon

15.2 Управление настройками VPN в Xfce

15.3 Управление настройками VPN в GNOME 3

16. Как подключаться к VPN через прокси или Tor


17. Как подключиться к Tor через OpenVPN

18. Скрипт для подключения и отключения от OpenVPN в зависимости от доступности сервера

Заключение


Многие используют OpenVPN для сокрытия настоящего IP и обхода блокировок доступа к веб-сайтам. Но этим возможности технологии VPN не ограничены. По своему понятию (Virtual Private Network) с помощью OpenVPN можно настраивать виртуальные частные сети, таким образом организуя закрытое из вне пространство с удобным доступом к локальным ресурсам тем, кто к этим сетям подключён. Причём «локальными» эти ресурсы являются внутри виртуальной частной сети, то есть, на самом деле, удалённый компьютер может быть подключён к Интернету на другом конце света через два NAT'а, но мы можем подключаться к его веб-серверу или файловому хранилищу напрямую внутри виртуальной сети. То есть такой подход позволяет решать и другие задачи: доступ к ресурсам компьютера, находящегося за NAT (не имеющего статичного публичного IP), шифрование передаваемых данных, выход в Интернет скрывая свой настоящий IP и другие.

В предыдущей статье я показал как настроить сервер и клиентов OpenVPN. Теперь предлагаю продолжить изучение OpenVPN и рассмотреть разные фишки не совсем стандартного использования OpenVPN: обход перехватывающих порталов, обход ограничений NAT, задействование преимуществ виртуальной частной сети.

Кстати, если вам нужен VPS сервер, чтобы вы могли установить на него OpenVPN и повторять то, что я показываю, то попробуйте этот.

Скрипт для автоматизации создания конфигурационных файлов OpenVPN

Если вы смотрели Инструкцию по настройке сервера и клиента OpenVPN, то могли обратить внимание, что она очень большая. Кстати, некоторое время назад я дополнил и исправил эту инструкцию (в части установки на Debian, Ubuntu, Linux Mint, Kali Linux).

Чтобы сделать жизнь чуточку проще, я написал скрипт OpenVPNassistent, который помогает автоматизировать процесс создания конфигурационных файлов и ключей для сервера и клиентов OpenVPN. Причём этот скрипт создаёт конфигурационные файлы со встроенными сертификатами (для сервера их 5, а для каждого клиента по 4). Скрипт, насколько это возможно, автоматизирует все процессы.

Скрипт поддерживает работу в производных Debian (Ubuntu, Kali Linux, Linux Mint), а также в производных Arch Linux (BlackArch, Manjaro). Я его тестировал в Kali Linux, Arch Linux/BlackArch, Ubuntu.

Скачаем скрипт:

git clone https://github.com/Mi-Al/OpenVPNassistent
cd OpenVPNassistent

Запускаем:

sudo bash openvpnassistent.sh

При запуске скрипт проверит, установлен ли OpenVPN, если не установлен, то спросит разрешение и установит.

Далее проверит, создан ли Центр Сертификации (CA) — если нет, то предложит создать его — соглашаемся.

Придумайте, введите и (главное) запомните пароль центра сертификации. Затем подтвердите этот же пароль:


У вас спросят имя CA, можно ничего не менять, просто нажмите Enter:

Будет создана и сохранена пара публичный-приватный ключ CA.

Вы можете заметить, что скрипт постоянно показывает предупреждения

Can't load /etc/easy-rsa/pki/.rnd into RNG
140426876056064:error:2406F079:random number generator:RAND_load_file:Cannot open file:crypto/rand/randfile.c:88:Filename=/etc/easy-rsa/pki/.rnd

Это какой-то баг в easy-rsa — на создаваемые сертификаты это никак не влияет — они получаются нормальными. Даже если вы будете создавать сертификаты вручную, без моего скрипта, у вас будет появляться эта же ошибка/предупреждение.

Теперь скрипт задаёт вопрос, для скольких клиентов нужно создать конфигурационные файлы (для каждого из них будет создан свой файл с собственными сертификатами).

Также скрипт спросит IP адрес сервера OpenVPN. Если вы его не знаете, то оставьте поле пустым — но вам затем придётся вручную добавлять его в каждый конфигурационный файл клиента.

Ещё скрипт спрашивает, какой порт будет использовать OpenVPN. Портом по умолчанию является 1194. Можно выбрать любой незанятый порт, например, я использую 53 — далее я покажу как OpenVPN на 53 порту помогает обходить Перехватывающие Порталы (хот-споты с авторизацией на веб-интерфейсе).

Далее скрипт переходит к созданию сертификатов. Вначале у нас спрашивают имя сервера, достаточно просто нажать Enter:

Если всё прошло без ошибок, то появится сообщение что создан приватный ключ (файл .key) и создан файл запроса (.req).

Keypair and certificate request completed. Your files are:
req: /etc/easy-rsa/pki/reqs/server.req
key: /etc/easy-rsa/pki/private/server.key

Для получения сертификата (публичного ключа), нужно подписать файл запроса — именно к этому скрипт сразу и переходит. У нас спрашивают, хотим ли мы подписать ключ для, набираем yes:


Вводим пароль от центра сертификации:

Если всё нормально, то будет выведено:

Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Nov  2 05:13:21 2021 GMT (1080 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /etc/easy-rsa/pki/issued/server.crt

Сразу после этого начнётся создание ещё двух ключей — это происходит полностью автоматически.

Теперь переходим к созданию ключей для клиентов. Когда скрипт будет спрашивать имена клиентов, достаточно просто нажимать Enter:

Далее аналогично созданию пары приватный-публичный ключ сервера. То есть все файлы создаются автоматически, нужно только на запрос CA вводить yes, а также пароль от CA:

Это нужно сделать для каждого клиента.

Когда скрипт завершит работу, он выведет информацию о созданных файлах:

Конфигурационные файлы созданы, они размещены в папке :/home/mial/bin/OpenVPNassistent/configs/
итого 72
-rw-r--r-- 1 mial users 8292 ноя 18 08:17 client1.ovpn
-rw-r--r-- 1 mial users 8292 ноя 18 08:17 client2.ovpn
-rw-r--r-- 1 root root  8292 ноя 18 08:18 client3.ovpn
-rw-r--r-- 1 root root  8292 ноя 18 08:18 client4.ovpn
-rw-r--r-- 1 root root  8296 ноя 18 08:18 client5.ovpn
-rw-r--r-- 1 mial users 8956 ноя 18 08:15 server.conf

Эти файлы находятся в папке со скриптом в подпапке configs. Все сертификаты уже встроены внутри конфигурационных файлов — это очень удобно, не нужно их размещать, прописывать пути. Причём — созданные конфигурационные файлы универсальны — вы можете с их помощью подключаться к OpenVPN серверу из Linux, Windows, Android.

Повторный запуск скрипта OpenVPNassistent

При повторном запуске появляются нюансы. Во-первых, если вы не меняете имена сервера и клиентов, то скрипт будет спрашивать, нужно ли перезаписывать уже существующие файлы? Во-вторых, если вы используете те же самые имена файлов клиента и сервера, то создание подписанного сертификата для них всегда будет завершаться ошибкой, что такой сертификат уже существует в базе данных. Эта «база данных» представляет собой несколько файлов в виде простого текста, где перечислены ранее созданные сертификаты. Это очень похоже на баг, поскольку никак не возможно подписать сертификат для того же имени. Поэтому чтобы «обойти» эту проблему на тот случай, если понадобиться заново создавать сертификаты для сервера и клиентов с теми же именами (server, client1, client2, client3 и т. д.), я просто удаляю Центр Сертификации и затем создаю его по-новому.

Чтобы удалить CA в Debian и производных (вместе с ключами самого CA, а также всеми другими ключами, созданными в CA):

sudo rm -rf /usr/share/easy-rsa/pki/

Чтобы удалить CA в Arch Linux и производных (вместе с ключами самого CA, а также всеми другими ключами, созданными в CA):

sudo rm -rf /etc/easy-rsa/pki/

Если у вас там какие-то свои настройки и своя инфраструктура, то не делайте так!!! Если же вы создаёте Центр Сертификации только чтобы подписать ключи для OpenVPN сервера/клиентов, то ничего страшного в этом нет — точно такой же CA можно инициализировать одной командой сколько угодно раз.

Причём это ни какая-то проблема моего скрипта — это проблема easy-rsa для которой мой скрипт является обёрткой. То есть если вы будете вручную вводить команды для создания каждого сертификата, то столкнётесь ровно с такими же проблемами.

Как использовать файлы .ovpn с сервером и клиентами OpenVPN

Поскольку это может вызвать путаницу, вернёмся к теории по основам работы OpenVPN сервера и клиентов.

Для запуска OpenVPN сервера нужны:

  • конфигурационный файл
  • 5 сертификатов

В предыдущей статье по настройке OpenVPN, мы размещали необходимые сертификаты, затем в конфигурационном файле прописывали путь до каждого из этих сертификатов, и уже только затем запускали OpenVPN сервер с указанием на наш конфигурационный файл.

Для OpenVPN, файлы сертификатов можно встроить (внедрить) в конфигурационный файл. Как это сделать я рассказывал в дополнении к той статье.

На предыдущем этапе с помощью скрипта мы создали конфигурационные файлы в которые уже встроены все необходимые сертификаты — то есть нам не нужно их устанавливать по отдельности на сервер и клиенты. Достаточно только скопировать файл server.conf на сервер, а файлы client1.ovpn, client2.ovpn и т. д. раскидать по соответствующим клиентам.

Файл server.conf можно «закинуть» на сервер с помощью утилит scp и sftp с помощью FTP или веб-файлового менеджера — в общем, как умеете. Причём, если у вас есть доступ по SSH, то можете просто создать на сервере текстовый файл с помощью nano/vim и скопировать-вставить содержимое файла server.conf, поскольку это файл в виде простого текста.

Для проверки я запускаю OpenVPN на сервере в консоли (файл server.conf размещён в текущей папке):

sudo openvpn server.conf

Появилась надпись

Initialization Sequence Completed

Это означает, что сервер OpenVPN успешно запущен.

Теперь на клиентской стороне я запускаю (файл с настройками у меня размещён по пути bin/OpenVPNassistent/configs/client1.ovpn):

sudo openvpn bin/OpenVPNassistent/configs/client1.ovpn

Аналогично, надпись

Initialization Sequence Completed

свидетельствует о том, что мы успешно подключились к OpenVPN серверу.

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

Опять смотрим в окно OpenVPN сервера:

Там многочисленные сообщения о том, что пакет отброшен — packet dropped:

Sun Nov 18 09:13:29 2018 us=592651 client1/IP:48143 MULTI: bad source address from client [192.168.1.47], packet dropped
Sun Nov 18 09:13:31 2018 us=358682 client1/IP:48143 MULTI: bad source address from client [192.168.1.47], packet dropped
Sun Nov 18 09:13:32 2018 us=308208 client1/IP:48143 MULTI: bad source address from client [192.168.1.47], packet dropped
Sun Nov 18 09:13:33 2018 us=158781 client1/IP:48143 MULTI: bad source address from client [192.168.1.47], packet dropped
Sun Nov 18 09:13:39 2018 us=987556 client1/IP:48143 MULTI: bad source address from client [192.168.1.47], packet dropped
Sun Nov 18 09:13:47 2018 us=230574 client1/IP:48143 MULTI: bad source address from client [192.168.1.47], packet dropped
Sun Nov 18 09:13:50 2018 us=281534 client1/IP:48143 MULTI: bad source address from client [192.168.1.47], packet dropped
Sun Nov 18 09:13:56 2018 us=199194 client1/IP:48143 MULTI: bad source address from client [192.168.1.47], packet dropped

Можно было бы подумать, что имеются проблемы, но, на самом деле, OpenVPN сеть работает, на клиенте можно проверить:

traceroute ya.ru
traceroute to ya.ru (87.250.250.242), 30 hops max, 60 byte packets
 1  10.8.0.1 (10.8.0.1)  267.816 ms  268.462 ms  269.124 ms
 2  rbr01-sklk-vlan130.marosnet.net (94.142.138.129)  293.287 ms  294.046 ms  299.076 ms
 3  94.142.138.39 (94.142.138.39)  310.788 ms  320.332 ms  330.794 ms
 4  styri.yndx.net (195.208.208.116)  343.901 ms  360.920 ms  395.540 ms
 5  ya.ru (87.250.250.242)  406.716 ms  417.901 ms  428.535 ms

Трафик идёт через узел 10.8.0.1 — это шлюз нашей виртуальной частной сети, то есть всё работает нормально. По какой-то причине локальные пакеты (может быть это широковещательные пакеты?) попадают на OpenVPN сервер. С одной стороны, ничего особо страшного в этом нет — они просто отбрасываются. Но, с другой, это неправильно — нужно разобраться с маршрутизацией — вернусь к этому как-нибудь потом.

Если у вас тоже всё в порядке, то файл server.conf можно поместить в папку /etc/openvpn/server/:

sudo mv ~/server.conf /etc/openvpn/server/

и запустить фоновую службу OpenVPN:

sudo systemctl start openvpn-server@server.service

проверим её статус:

systemctl status openvpn-server@server.service

а затем добавим её в автозагрузку:

sudo systemctl enable openvpn-server@server.service

Как подключиться к OpenVPN с Android

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

Скачайте в Google Play официальный клиент OpenVPN. Запустите программу, там выберите OVPN Profile:

Загрузите файл .ovpn на телефон и найдите его с помощью этой программы. Затем выделите и нажмите кнопку IMPORT:

Будет написано, что импорт прошёл успешно, также вы сможете установить любое имя для вашего соединения:

Новое соединение появится в списке всех соединений. Здесь его можно активировать (включить) или выполнить другие действия:

Например, можно сделать ярлык на главном экране и тогда вы сможете подключаться к сети OpenVPN одним тапом по иконке:

 

В любое время можно посмотреть статус соединения и статистику использования трафика:

Как с помощью OpenVPN получить доступ к сетевым службам на компьютерах за NAT (с частным IP)

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

VPN — виртуальная частная сеть — имеет своё адресное пространство, по умолчанию это 10.8.0.0/24. Каждому устройству (компьютеру, телефону) из этого пространства выдаётся IP адрес. Эти адреса относятся к локальным. И обращаясь по этому адресу можно получить доступ к ресурсам (сетевым службам, файлам) компьютера, у которого нет белого IP.

К примеру, я подключил к моей локальной сети новое устройство — систему Linux с запущенным веб-сервером. Посмотрим список сетевых интерфейсов:

Можно увидеть, что интерфейс eth0 имеет IP адрес 10.0.2.15 — это серый IP и по нему невозможно подключиться к этому компьютеру из Интернета. К тому же, сама система находится за NAT.

После включения OpenVPN создаётся новый сетевой интерфейс tun0, для данной системы у него IP адрес 10.8.0.18. Используя IP адрес интерфейса OpenVPN (tun0), другие участники сети OpenVPN могут подключаться к этому компьютеру. Как я сказал, на этом компьютере запущен веб-сервер. Попробуем его открыть на телефоне, который подключён к этой же сети OpenVPN через совершенно другого провайдера и вообще может находиться за тысячи километров:

Как можно увидеть, это действительно работает. Это может быть веб-сервер, файловый сервер (FTP и другие), рабочие окружения для совместной работы (например, выполненные в виде веб-приложений, запущенных на веб-сервере). При этом доступ к этой рабочей среде будут иметь только участники VPN сети — от всех других она будет полностью изолирована. Любой из участников сети может делиться любыми ресурсами, и любой другой участник может подключаться используя серый IP, присвоенный внутри сети OpenVPN. Чтобы это работало, нужен только один белый (внешний) IP — для самого OpenVPN сервера. Для этих целей обычной ВПСки (VPS — Virtual Private Server) с минимальной конфигурацией по железу хватит за глаза.

Как сделать статичные IP для клиентов OpenVPN

Самый элементарный способ доступа к сетевым службам внутри локальной сети — по IP адресу, как это показано выше. Проблема в том, что в сети OpenVPN IP адреса не привязаны жёстко к клиентам и после переподключения клиенты могут получить другой IP.

Можно настроить OpenVPN сервер выдавать одним и тем же клиентам одинаковые IP, но для этого необходимо соблюдение одного условия. Чтобы было понятно, поясню, что для подключения разных клиентов к одному OpenVPN серверу можно используя одну и ту же пару публичный-приватный ключ, то есть говоря другими словами, один и тот же конфигурационный файл. Это не запрещено, но не рекомендуется и для активации этой возможности необходимо это чётко указать директивой в конфигурационном файле. При таком способе подключения сервер не сможет различать клиентов. То есть при использовании одинаковых ключей (конфигурационных файлов) разными клиентами, невозможно настроить статичные IP адреса в OpenVPN.

Итак, условием настройки статичных IP адресов для клиентов OpenVPN является использование разных ключей. Именно по такому принципу — у каждого клиента уникальный ключ — создаются конфигурационные файлы моим скриптом, который я презентовал в самом начале.

Итак, если вы создали конфигурационные файлы клиентов с помощью скрипта, то теперь вы сможете настроить статичные IP адреса.

Настройка требуется только на стороне сервера OpenVPN — в настройках клиентов ничего менять не нужно.

Допустим, я хочу, чтобы у client1 был IP адрес 10.8.0.10, у остальных:

  • client2 — 10.8.0.20
  • client3 — 10.8.0.30
  • client4 — 10.8.0.40
  • client5 — 10.8.0.50

Мне нужно на сервере создать директорию, в которой будут находиться настройки для каждого клиента. Этой папкой я выбрал /etc/openvpn/ccd/, создаём её:

mkdir /etc/openvpn/ccd/

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

Кстати, имя клиента можно посмотреть в его конфигурационном файле, оно размещено в сертификате cert и идёт в поле Subject, например:

Subject: CN=client1

В данном случае имя клиента client1, следовательно, нужно создать файл /etc/openvpn/ccd/client1.

======АКТУАЛЬНАЯЯ ЧАСТЬ======

В этом файле достаточно указать строку вида

ifconfig-push IP_для_клиента МАСКА_ПОДСЕТИ

Если у вас обычные настройки, то в качестве МАСКИ_ПОДСЕТИ у вас всегда будет 255.255.255.0.

Итак, для первого клиента, которому я хочу присвоить IP адрес 10.8.0.10, в файл /etc/openvpn/ccd/client1 я записываю:

ifconfig-push 10.8.0.10 255.255.255.0

То же самое можно сделать командой:

echo 'ifconfig-push 10.8.0.10 255.255.255.0' > /etc/openvpn/ccd/client1

И для всех остальных клиентов:

echo 'ifconfig-push 10.8.0.20 255.255.255.0' > /etc/openvpn/ccd/client2
echo 'ifconfig-push 10.8.0.30 255.255.255.0' > /etc/openvpn/ccd/client3
echo 'ifconfig-push 10.8.0.40 255.255.255.0' > /etc/openvpn/ccd/client4
echo 'ifconfig-push 10.8.0.50 255.255.255.0' > /etc/openvpn/ccd/client5

======КОНЕЦ АКТУАЛЬНОЙ ЧАСТИ======

Чтобы OpenVPN сервер подхватывал новые настройки для клиентов, в файл /etc/openvpn/server/server.conf

vim /etc/openvpn/server/server.conf

Добавьте строку (я её вставил перед сертификатами):

client-config-dir /etc/openvpn/ccd/

Чтобы изменения вступили в силу:

sudo systemctl restart openvpn-server@server.service

Ну и убедитесь, что мы ничего не напортили:

systemctl status openvpn-server@server.service

Наша система Linux с веб-сервером имеет имя client3, посмотрим на её IP после переподключения:

Теперь она имеет адрес 10.8.0.30, и именно такой адрес будет иметь эта система при каждом подключении к OpenVPN серверу. Следовательно, веб-сервер всегда будет иметь IP 10.8.0.30 — можно добавить в закладки.

Внимание: для мобильных клиентов OpenVPN используется Topology net30 — возможно, это из-за каких-то ограничений мобильных телефонов. Поэтому установить IP описанным выше методом не получится для Android.

IP адреса для Android (возможно, в Windows такая же ситуация) должны кончаться на цифры из следующего списка (первая цифра из каждой пары предназначена для сервера, вторая — для клиента):

[  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]

Например, если для клиента client2 мы хотим установить IP адрес 10.8.0.14, то для сервера нужно писать 10.8.0.13, например:

echo 'ifconfig-push 10.8.0.14 10.8.0.13' > /etc/openvpn/ccd/client2

Повторюсь, возможно, это же правило обязательно и для Windows клиентов — по крайней мере, раньше было именно так.

В Linux всё шикарно — работает как описано выше.

Обход перехватывающего портала с помощью OpenVPN

В статье «Быстрый, простой и рабочий способ обхода Captive Portal (hotspot с авторизацией на web-интерфейсе)» в качестве теоретического способа обхода, я упоминал возможность настройки OpenVPN на 53 UDP порту. Также я написал, что у меня это не получилось. В тот раз у меня не было своего OpenVPN сервера, поэтому я нашёл OpenVPN с тестовым периодом и с возможностью выбрать порт 53 UDP. Но попытки подключиться к OpenVPN серверу закончились неудачей.

Теперь у меня снова появилась возможность потестировать уже другой hotspot с авторизацией на web-интерфейсе и в нём это действительно работает. То есть, если я просто пытаюсь выйти в Интернет, то я получаю:

Но стоит включить OpenVPN, то я сразу могу пользоваться Интернет-доступом без авторизации! То есть это действительно работает, правда, видимо не со всеми Перехватывающими Порталами. Видимо, некоторые из них достаточно интеллектуальны, чтобы понять, что это какие-то неправильные DNS запросы и что их не нужно пропускать.

Напомню, в чём суть уязвимости некоторых Captive Portal: принцип их работы в том, что они закрывают все TCP и UDP порты для устройств, которые ещё не выполнили вход. Все - кроме одного UDP порта под номером 53. Этот порт необходим для DNS запросов и если его закрыть, то это влечёт слишком много проблем. Поэтому этот порт открыт и через него можно выходить в мир.

Без предварительной подготовки, через этот порт вы только сможете на халяву делать DNS запросы… Но если вы настроили ваш OpenVPN соответствующим образом, то через открытый UDP порт 53 вы сможете подключаться к серверу OpenVPN, а уже он будет для вас выходить во внешний мир и точно также, по этому же самому пути возвращать полученную информацию.

Это работает стабильно и, по субъективным ощущениям, когда сеть загружена, трафик UDP 53 имеет приоритет… То есть работает даже лучше, чем если бы я купил доступ и сидел через этот же хотспот на TCP трафике (я сравнивал и так и так). Хотя, возможно, свою роль играет OpenVPN. Я замечал, что при хорошем подключении когда я сижу через OpenVPN, пинги лучше, чем когда я использую Интернет-подключение обычным образом.

Итак, для этого нужен только OpenVPN сервер, настроенный для работы по протоколу UDP (это по умолчанию) с номером порта 53 (его нужно выбрать при создании конфигурационных файлов).

Возможно, работает не для всех хотспотов — буду продолжать тестировать.

Обход перехватывающих порталов с телефона

Описанный в предыдущем пункте способ прекрасно работает и для мобильных телефонов — проверено!

Доступ к публичным ресурсам сервера OpenVPN

Возможно это слишком частный случай, но всё равно расскажу об интересной ситуации.

Предположим, что IP адрес OpenVPN сервера 185.117.153.79. Тогда маршрутизация на компьютере будет настроена примерно следующим образом:

  • весь трафик, кроме предназначенного для адреса 185.117.153.79, направляется на шлюз 10.8.0.1 (это OpenVPN)
  • трафик на адрес 185.117.153.79 является исключением — он направляется на обычный интерфейс и выходит в Интернет

Именно через трафик к адресу 185.117.153.79 и происходит подключение к OpenVPN серверу. Если бы для этого адреса не было сделано исключение, то тогда невозможно было бы подключиться к OpenVPN серверу и компьютер остался бы без Интернет-доступа вообще.

В принципе, ничего страшного, но что делать, если я, например, хочу открыть сайт suip.biz, у которого IP адрес как раз 185.117.153.79? Каждый раз, когда я открываю этот сайт, трафик направляется напрямую — минуя OpenVPN сеть. При обычных условиях это может быть нормально, но если OpenVPN используется для анонимности или для обхода перехватывающего портала (это мой случай), то получается, что я вообще не могу открыть сайт suip.biz. Выход из ситуации очень простой. Вспомним, что OpenVPN сервер доступен как часть виртуальной частной сети по IP адресу 10.8.0.1. Поэтому в файле /etc/hosts

sudo gedit /etc/hosts

Достаточно добавить строку:

10.8.0.1	suip.biz

И теперь доступ к этому сайту будет происходить по сети OpenVPN — то есть он будет без проблем открываться (но только пока я подключён к OpenVPN — после отключения нужно удалить/закомментировать эту запись).

Точно также, если мне нужно подключиться к SSH сервера OpenVPN:

ssh root@185.117.153.79

То когда я подключён к OpenVPN, я могу использовать локальный IP виртуальной частной сети:

ssh root@10.8.0.1

Я подключусь к этому же серверу, но при этом трафик не будет идти «помимо» - всё внутри VPN!

Как захватывать и анализировать VPN трафик с Wireshark

Если вы для захвата выберите обычный интерфейс, например, wlan0 или eth0, то все данные будут зашифрованы — их невозможно анализировать.

Чтобы передаваемые через OpenVPN данные были видны нормальным образом, для захвата нужно выбрать интерфейс tun0.

Кстати, если перед вами задачи провести оценку качества/безопасности VPN, то захват надо делать именно на обычном интерфейсе — если вы там видите читаемые данные вроде таких:

Значит ваше VPN соединение просто не зашифровано. Кстати, это не относится к теме OpenVPN, но как выяснили исследователи из бесплатных Android приложений VPN - 84% из них раскрывают IP адрес пользователя. И среди платных VPN тоже много тех, которые допускают просачивание данных.


Но намного интереснее было бы узнать, сколько из них мониторят и логируют трафик…

Переход с OpenVPN 2.4.* на OpenVPN 2.5.*

По состоянию на осень 2021 года OpenVPN уже почти год как перешёл на новую мажорную ветвь 2.5.*. Если вы медлили с обновлением, то теперь новую ветвь можно считать проверенной временем. Тем не менее, если вы переходите с ветви 2.4, то вам может потребоваться откорректировать конфигурационные файлы.

1. В конфигурационных файлах сервера и клиента замените строку

cipher AES-256-CBC

на

data-ciphers AES-256-GCM:AES-128-GCM

2. Если вы используете протокол TCP (что не рекомендуется), то вместо строки

;proto tcp

используйте на сервере строку

proto tcp-server

а на клиенте строку

proto tcp-client

Протокол UDP и на сервере и на клиенте обозначается одинаково:

proto udp

3. При настройке статичных IP адресов внутри виртуальной частной сети теперь используется запись:

ifconfig-push IP_для_клиента МАСКА_ПОДСЕТИ

например:

ifconfig-push 10.8.0.10 255.255.255.0

Подробности смотрите в разделе «Как сделать статичные IP для клиентов OpenVPN».

Как использовать OpenVPN с протоколом TCP

По умолчанию OpenVPN использует протокол UDP и официально рекомендуется использовать именно его. Тем не менее, протокол TCP также прекрасно работает с OpenVPN и в случае необходимости вы можете использовать и его. Теоретически, протокол TCP имеет больше «накладных расходов», то есть некоторая часть передаваемых данных не будет нести полезную нагрузку, а необходима только для нормальной работы TCP, который отслеживает сохранность и целостность передаваемых пакетов.

В моём случае необходимость добавить поддержку TCP возникла из-за того, что с некоторыми Интернет-провайдерами OpenVPN на протоколе UDP не мог подключиться из-за ошибки (ошибка будет рассмотрена далее), но прекрасно работал на протоколе TCP.

Для настройки работы OpenVPN с протоколом TCP нужно знать следующие моменты:

1. Протокол должен быть указан явно

В настройках конфигурационных файлов вместо строки

;proto tcp

используйте на сервере строку

proto tcp-server

а на клиенте строку

proto tcp-client

Для справки: протокол UDP и на сервере и на клиенте обозначается одинаково:

proto udp

2. Протокол TCP должен быть указан в конфигурационных файлах как сервера, так и клиента

3. Не используйте опцию explicit-exit-notify

В конфигурационном файле сервера не используйте настройку (просто удалите эту строку):

explicit-exit-notify 1

Иначе вы столкнётесь с ошибкой:

Options error: --explicit-exit-notify can only be used with --proto udp

4. Порт должен быть свободен

Это в равной степени относится к работе OpenVPN как с UDP, так и с TCP: выбранный порт должен быть свободен, иначе вы столкнётесь с ошибкой «TCP/UDP: Socket bind failed on local address [AF_INET][undef]:…: Address already in use (errno=98)», например::

2021-11-02 09:26:50 us=736094 TCP/UDP: Socket bind failed on local address [AF_INET][undef]:53: Address already in use (errno=98)
2021-11-02 09:26:50 us=736216 Exiting due to fatal error

Сравнение производительности (скорости передачи данных) OpenVPN через UDP и TCP

Скорость моего Интернет-подключения без использования OpenVPN:

Скорость моего Интернет-подключения с использованием OpenVPN по протоколу UDP:

Скорость моего Интернет-подключения с использованием OpenVPN по протоколу TCP:

Как можно увидеть, потеря в скорости при переходе с UDP на TCP довольно значительна. Разница в скорости между отсутствием OpenVPN и OpenVPN по протоколу UDP незначительна — фактически, в обоих случаях скорость практически упирается в максимальную пропускную способность моей сети.

Одновременное использование нескольких OpenVPN на одном сервере

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

Работа нескольких экземпляров OpenVPN предусмотрена из коробки, но требуется дополнительная настройка.

1. Службы OpenVPN должны использовать разные порты

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

Если две службы OpenVPN используют одинаковый порт, то запускаемый первым экземпляр OpenVPN будет работать без ошибок, а второй экземпляр не запустится из-за ошибки «TCP/UDP: Socket bind failed on local address [AF_INET][undef]:…: Address already in use (errno=98)», например::

2021-11-02 09:26:50 us=736094 TCP/UDP: Socket bind failed on local address [AF_INET][undef]:53: Address already in use (errno=98)
2021-11-02 09:26:50 us=736216 Exiting due to fatal error

2. Диапазон адресов виртуальной частной сети

По умолчанию в конфигурационном файле сервера указывается диапазон IP адресов для виртуальной частной сети, например:

server 10.8.0.0 255.255.255.0

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

server 10.8.1.0 255.255.255.0

Для третьей службы можно указать следующий диапазон IP адресов и так далее:

server 10.8.2.0 255.255.255.0

3. Маршрутизация трафика для всех виртуальных частных сетей

В разделе «Включение маршрутизации трафика на OpenVPN сервере» показано как включить NAT для трафика виртуальных частных сетей, чтобы они могли делать подключения в сеть Интернет. В примере из указанного раздела показана настройка маршрутизации для трафика из подсети 10.8.1.0/24. Поскольку для дополнительных экземпляров службы OpenVPN используются другие подсети (например, 10.8.1.0/24), то для того, чтобы клиенты данных виртуальных сетей могли выходить в Интернет, необходимо настроить маршрутизацию для каждой из данных сетей.

Пример исходного содержимого файла /root/bin/vpn_route.sh:

#!/bin/sh
 
# укажите имя интерфейса, иначе скрипт попытается выбрать его автоматически
#DEV='eth0'
DEV='ens3'
PRIVATE=10.8.0.0/24
 
if [ -z "$DEV" ]; then
	DEV="$(ip route | grep default | head -n 1 | awk '{print $5}')"
fi
# Включаем форвардинг пакетов, чтобы из туннельного интерфейса
# они попадали на внешний интерфейс
sysctl net.ipv4.ip_forward=1
# Убеждаемся, что iptables не блокируют перенаправляемый трафик:
iptables -I FORWARD -j ACCEPT
# Преобразование адресов (NAT) для приходящих из туннеля пакетов
# При включенной пересылке пакеты по умолчанию перенаправляются 
# с исходным адресом без изменений, то есть в нашем случае 10.8.0.*
# такие пакеты либо удаляются на шлюзе ISP, либо даже если они
# отправляются в пункт назначения, ответ никогда не находит обратного пути.
# Эти частные адреса не маршрутизируются в Интернете.
#
# Решением является преобразование адресов (NAT) исходящего трафика, 
# то есть заменить частный 10.8.0.* адрес общедоступным IP адресом VPN-сервера. 
# Это позволит ответам достичь VPN-сервера, 
# и там они будут отправлены обратно в туннель.
iptables -t nat -I POSTROUTING -s $PRIVATE -o $DEV -j MASQUERADE

Файл /root/bin/vpn_route.sh в который добавлен NAT для подсетей 10.8.1.0/24, 10.8.2.0/24 и 10.8.3.0/24:

#!/bin/sh
 
DEV='ens3'
PRIVATE=10.8.0.0/24
 
if [ -z "$DEV" ]; then
	DEV="$(ip route | grep default | head -n 1 | awk '{print $5}')"
fi

sysctl net.ipv4.ip_forward=1

iptables -I FORWARD -j ACCEPT

iptables -t nat -I POSTROUTING -s $PRIVATE -o $DEV -j MASQUERADE

iptables -t nat -I POSTROUTING -s 10.8.1.0/24 -o $DEV -j MASQUERADE

iptables -t nat -I POSTROUTING -s 10.8.2.0/24 -o $DEV -j MASQUERADE

Чтобы проверить настройки NAT выполните команду

iptables -L -t nat

4. Настройка локальных статичных адресов

Если вы использовали раздел «Как сделать статичные IP для клиентов OpenVPN» и добавляли записи вида «ifconfig-push 10.8.0.10 255.255.255.0» в файл «/etc/openvpn/ccd/client1», то вам нужно использовать другие имена клиентов для второй и последующих сетей OpenVPN, поскольку они используют другие диапазоны IP адресов виртуальной частной сети.

5. Запуск и добавление второй и последующих служб OpenVPN в автозагрузку

Обратите внимание, что с systemctl можно использовать команду вида

openvpn-server@<configuration>.service

где <configuration> - это файл конфигурации, который лежит в папке /etc/openvpn/server/, но без расширения .conf

К примеру, второй конфигурационный файл для второго экземпляра службы OpenVPN помещены в файл /etc/openvpn/server/server-tcp.conf, тогда программа для запуска службы следующая:

sudo systemctl start openvpn-server@server-tcp.service

Проверка статуса службы с конфигурационным файлом server-tcp.conf:

systemctl status openvpn-server@server-tcp.service

Просмотр ошибок службы OpenVPN с конфигурационным файлом server-tcp.conf:

journalctl -xeu openvpn-server@server-tcp.service

Добавление службы в автозагрузку:

sudo systemctl enable openvpn-server@server-tcp.service

Исправление ошибок «TLS Error: TLS key negotiation failed to occur within 60 seconds» и «TLS handshake failed»

В процессе использования OpenVPN вы можете столкнуться с ситуацией, когда не удаётся подключиться к OpenVPN серверу без видимых причин. Например, в целом OpenVPN работает правильно и подключения происходят, но на определённых Интернет-провайдерах подключение не может выполнить успешное TLS рукопожатие.

Пример логов на стороне OpenVPN сервера:

2021-11-05 18:29:22 us=384206 MULTI: multi_create_instance called
2021-11-05 18:29:22 us=384302 176.59.38.132:56094 Re-using SSL/TLS context
2021-11-05 18:29:22 us=384395 176.59.38.132:56094 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
2021-11-05 18:29:22 us=384424 176.59.38.132:56094 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
2021-11-05 18:29:22 us=384568 176.59.38.132:56094 Control Channel MTU parms [ L:1621 D:1184 EF:66 EB:0 ET:0 EL:3 ]
2021-11-05 18:29:22 us=384605 176.59.38.132:56094 Data Channel MTU parms [ L:1621 D:1450 EF:121 EB:406 ET:0 EL:3 ]
2021-11-05 18:29:22 us=384669 176.59.38.132:56094 Local Options String (VER=V4): 'V4,dev-type tun,link-mtu 1541,tun-mtu 1500,proto UDPv4,keydir 0,auth SHA1,keysize 128,tls-auth,key-method 2,tls-server'
2021-11-05 18:29:22 us=384700 176.59.38.132:56094 Expected Remote Options String (VER=V4): 'V4,dev-type tun,link-mtu 1541,tun-mtu 1500,proto UDPv4,keydir 1,auth SHA1,keysize 128,tls-auth,key-method 2,tls-client'
2021-11-05 18:29:22 us=384751 176.59.38.132:56094 TLS: Initial packet from [AF_INET]176.59.38.132:56094, sid=7b5f6347 776e80e1
2021-11-05 18:30:22 us=183787 176.59.38.132:56094 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
2021-11-05 18:30:22 us=183887 176.59.38.132:56094 TLS Error: TLS handshake failed
2021-11-05 18:30:22 us=184085 176.59.38.132:56094 SIGUSR1[soft,tls-error] received, client-instance restarting

Пример логов на стороне OpenVPN клиента:

2021-11-05 18:30:21 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
2021-11-05 18:30:21 TLS Error: TLS handshake failed
2021-11-05 18:30:21 SIGUSR1[soft,tls-error] received, process restarting
2021-11-05 18:30:21 Restart pause, 5 second(s)

Причиной такой ошибки может быть Интернет-провайдер, который определённым образом фильтрует трафик либо использует неудачно настроенный NAT.

Для исправления ошибки может оказаться достаточным выполнить одно из следующих действий:

  • изменить порт OpenVPN сервера
  • изменить используемый протокол с UDP на TCP

Управление OpenVPN соединениями в Linux

В отличии от Windows для которой разработчики OpenVPN создали и поддерживают клиент с графическим интерфейсом, в Linux от разработчиков представлен только клиент с интерфейсом командной строки. Но прекрасной альтернативой для официального клиента является NetworkManager.

В большинстве дистрибутивов NetworkManager уже установлен и даже добавлен в автозагрузку, поскольку данная служба отвечает за все сетевые соединения, проводные и беспроводные. В производных Debian пакет называется network-manager, в производных Arch Linux пакет называется networkmanager.

Для NetworkManager существуют плагины, некоторые из которых имеются в репозиториях дистрибутивов Linux. Поскольку данная заметка фокусируется на OpenVPN, то нас интересует плагин для работы OpenVPN, который в Debian называется network-manager-openvpn-gnome (не смотря на название, в Xfce используется этот же плагин), а в Arch Linux это networkmanager-openvpn. Установите этот плагин, если он у вас ещё отсутствует.

Поскольку большую часть функций по управлению соединениями OpenVPN берёт на себя NetworkManager и плагин networkmanager-openvpn, то работа с OpenVPN в целом похожа в различных дистрибутивах. Тем не менее, среда рабочего стола накладывают свои особенности. Хотя особенности не критические, мы рассмотрим работу с OpenVPN в популярных средах рабочего стола Linux.

Управление настройками VPN в Cinnamon

Среда рабочего стола Cinnamon характерно в первую очередь для Linux Mint.

При клике на значок сетевого подключения (его вид зависит от того, используете ли вы проводное или беспроводное соединение) для управления сетями будут доступны две опции:

  • Network Settings — настройки сетей от Cinnamon (следовательно, присутствует только в данной среде рабочего стола)
  • Network Connections — настройки сетей от NetworkManager (следовательно, присутствует в любом дистрибутиве с NetworkManager)

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

Network Settings содержит список доступных для подключения Wi-Fi сетей, а также список OpenVPN настроек, прокси, проводные соединения. В Network Settings можно активировать то или иное сетевое соединение.

Network Connections не показывает доступные для подключения Wi-Fi сети, но зато хранит настройки сетей, к которым компьютер когда либо подключался.

Управление подключениями OpenVPN в Network Settings

Для удаления OpenVPN подключения выделите его и нажмите знак минус (-).

Подключение будет удалено без подтверждения.

Для добавления OpenVPN подключения нажмите знак плюс (+).

Вам будет предложено 2 опции:

  • OpenVPN (совместимое с сервером OpenVPN) — вам нужно будет ввести настройки вручную и указать файлы сертификатов
  • Import from file — импортировать настройки из файла

При ручной настройке вам не нужно что-либо менять на вкладках IPv4 и IPv6. Часть настроек располагается на вкладке Identity, для доступа к другим настройкам нажмите кнопку «Дополнительно»:

Для редактирования подключения OpenVPN выберите его и нажмите значок шестерёнки.

Часть настроек располагается на вкладке Identity.

Для доступа к другим настройкам нажмите кнопку «Дополнительно».

Управление подключениями OpenVPN в Network Connections

Для удаления OpenVPN подключения выделите его и нажмите знак минус (-).

Для добавления OpenVPN подключения нажмите знак плюс (+).

В выпадающем списке вам будет доступно много опций, 2 из них имеют отношение к OpenVPN:

  • OpenVPN — вам нужно будет ввести настройки вручную и указать файлы сертификатов
  • Импортировать сохранённую конфигурацию VPN

При ручной настройке вам не нужно что-либо менять на вкладках Основное, Прокси, Параметры IPv4 и Параметры IPv6. Часть настроек располагается на вкладке VPN, для доступа к другим настройкам нажмите кнопку «Дополнительно».

Для редактирования подключения OpenVPN выберите его и нажмите значок шестерёнки.

Подключение к OpenVPN серверу

Вы можете добавить несколько OpenVPN подключений и включать любое из них в зависимости от ваших потребностей. Включать их можно как на основной панели NetworkManager – кликните на выбранное подключение:

Также включать VPN подключения можно в Network Settings, для этого выберите нужное VPN соединение и нажмите переключатель:

Управление настройками VPN в Xfce

Популярными дистрибутивами с Xfce являются Kali Linux и Xubuntu.

В Xfce присутствует только Network Connections.

Есть два способа добавить новое соединение OpenVPN:

1) Кликните правой кнопкой мыши по иконке сетевого подключения и выберите «Параметры соединений»:

В уже знакомом Network Connections нажмите знак плюс (+).

2) Либо кликните левой кнопкой мыши по иконке сетевого подключения и выберите «Соединения VPN» → «Добавить VPN-соединение».

Выберите предпочитаемый тип VPN подключения.

Для импорта VPN подключения из файла выберите «Импортировать сохранённую конфигурацию VPN».

Нажмите кнопку «Создать» и укажите файл с настройками.

При ручной настройке вам не нужно что-либо менять на вкладках Основное, Прокси, Параметры IPv4 и Параметры IPv6. Часть настроек располагается на вкладке VPN, для доступа к другим настройкам нажмите кнопку «Дополнительно».

Для подключения к OpenVPN кликните левой кнопкой мыши по иконке сетевого подключения и выберите «Соединения VPN» и затем выберите желаемое подключение.

При успешном подключении появится галочка напротив имени VPN соединения.

Для добавления, изменения и удаления VPN соединений перейдите в Network Connections, для этого кликните правой кнопкой мыши по иконке сетевого подключения и выберите «Параметры соединений».

Управление настройками VPN в GNOME 3

Популярным примером дистрибутива Linux использующего GNOME 3 является Ubuntu.

Для добавления OpenVPN соединения кликните по иконке сетевого подключения и разверните раздел подключений.

Выберите «Параметры соединения»:

Вы окажитесь в настройках ОС. На вкладке «Сеть» вы можете добавить новое VPN подключение или управлять существующими. Для добавления нового нажмите знак плюс (+).

Вы можете ввести данные вручную, либо импортировать настройки OpenVPN подключения из файла .ovpn.

При ручной настройке вам не нужно что-либо менять на вкладках «IPv4» и «IPv6». Часть настроек располагается на вкладке «Идентификация», для доступа к другим настройкам нажмите кнопку «Дополнительно»:

Включить OpenVPN соединение вы можете кликнув на кнопку сетевых соединений, затем выбрав желаемое VPN соединение.

Вы также можете перейти в Настройки сети и включить выбранное OpenVPN соединение там.

Для редактирования VPN соединений кликните на кнопку сетевых подключений, затем разверните список VPN и выберите «Параметры VPN».

Выберите соединение, которое вы хотите изменить, и нажмите шестерёнку.

Для удаления OpenVPN соединения, перейдите в его настройки, как это показано чуть выше, и нажмите кнопку «Удалить VPN».

Как подключаться к VPN через прокси или Tor

Смотрите статью «Как подключаться к OpenVPN через прокси или Tor».

Как подключиться к Tor через OpenVPN

Подключение к Tor через VPN на практике обычно применяется не столько для повышения анонимности (хотя и такое применение имеет место), сколько для обода блокировки сети Tor. В некоторых странах на государственном уровне блокируется сеть Tor поэтому для подключения браузера Tor или службы Tor необходимо использовать мосты — промежуточные узлы сети Tor. Вместо мостов можно подключаться к сети Tor через VPN.

На самом деле подключение к Tor через VPN даже проще, чем использование мостов.

Обратите внимание, что из-за особенности реализации блокировки (например, блокировка выполняется только на уровне провайдеров последней мили), для обхода блокировки подключения к сети Tor можно использовать даже VPN той страны, в которой сеть Tor заблокирована.

Признаки того, что Интернет-провайдер блокирует доступ к сети Tor, заключаются в том, что подключение к Tor останавливается на самых первых этапах.

Например, Tor Browser замирает на надписи:

Connecting to a Tor relay
Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world.

Ещё один вариант ошибки:

Loading relay information

При попытке использовать службу Tor, запустив её командой

sudo systemctl start tor

проверка статуса

systemctl status tor

покажет, что начальная загрузка остановилась на 5%, то есть на этапе подключения к ретранслятору:

Jan 08 11:21:40 HackWare systemd[1]: Started Anonymizing overlay network for TCP.
Jan 08 11:21:41 HackWare Tor[25392]: Bootstrapped 5% (conn): Connecting to a relay

Для того, чтобы выполнить подключение к сети Tor через VPN, начните с того, что подключитесь к VPN серверу, например, используя OpenVPN.

Сразу после этого можно пользоваться службой Tor как обычно — дополнительная настройка не требуется.

Браузер Tor успешно подключается к сети Tor и открывает сайты.

Служба tor успешно устанавливает соединение с сетью Tor.

Скрипт для подключения и отключения от OpenVPN в зависимости от доступности сервера

Задача:

Подсети филиалов объединены через OpenVPN. Все клиенты подключаются к серверу и маршруты в интернет прописаны через OpenVPN сервер. Всё работает, только вот есть проблема. Если OpenVPN сервер по какой-то причине остаётся без Интернета, то и все остальные филиалы тоже остаются без интернета, ведь трафик идёт не через свой шлюз, а через сервер OpenVPN. Можно ли как-то написать скрипт, чтобы:

1. При отсутствии связи до OpenVPN сервера маршруты восстанавливались и работали через собственный шлюз.

2. Раз 2-3 минуты клиент пытался бы подключиться к OpenVPN серверу.

3. При восстановлении подключения маршруты прописывались бы снова через OpenVPN сервер.

Решение:

В теории, вполне возможно написать скрипт на Bash (для Linux) или PowerShell (для Windows) который бы пинговал OpenVPN сервер и в случае если сервер онлайн выполнял бы подключение к нему или если подключение уже присутствует, то ничего бы не делал. А если OpenVPN сервер офлайн, то выполнял бы отключение от него или ничего не делал, если сервер уже отключён. В Linux такой скрипт можно добавить в автозагрузку и затем регулярно его запускать с помощью таймеров Systemd или Cron. В Windows тоже это можно решить с помощью Диспетчера задач (Windows Task Scheduler).

Но, ИМХО, это кардинально неправильный подход. Нужно стремиться к тому, чтобы OpenVPN сервер всегда был онлайн. Поскольку для чего-то же он нужен в работе пользователей, если они к нему подключаются? А если так, то при отключении от OpenVPN будут сбои в подключении к локальным ресурсам.

И тем не менее, вот примеры скриптов.

Для Windows скрипт написан на PowerShell, создайте файл vpn.ps1 и скопируйте в него (замените IP адрес OpenVPN сервера и путь до конфигурационного файла на свои):

# IP адрес сервера OpenVPN
$openvpnIP='185.117.153.79'
# путь до конфигурационного файла для подключения клиента к OpenVPN серверу
$openvpnFILE='C:\Users\MiAl\client1.ovpn'

if (Test-Connection -TargetName $openvpnIP -IPv4 -Count 1 -Quiet -TimeoutSeconds 1)
{
	'OpenVPN server is up'
	if (Get-Process | Where-Object { $_.Name -eq "openvpn" })
	{
		'OpenVPN connection is active.  Nothing to do'
	}
		else
	{
		Write-Warning 'No OpenVPN connections, trying to connect...'
		 & "C:\Program Files\OpenVPN\bin\openvpn.exe" --config $openvpnFILE &
	}
}
else
{
	Write-Warning 'OpenVPN server is down'
	if (Get-Process | Where-Object { $_.Name -eq "openvpn" })
	{
		'OpenVPN connection is active, let us kill it'
		Get-Process | Where-Object { $_.Name -eq "openvpn" } | Select-Object -First 1 | Stop-Process
	}
	else
	{
		Write-Warning 'No OpenVPN connections. Nothing to do'
	}
}

Проверять так:

.\vpn.ps1

OpenVPN сервер онлайн, поэтому скрипт выполняет подключение к нему и при последующих проверках ничего не делает. Проверка IP клиента показывает, что выход в Интернет выполняется действительно через OpenVPN:

OpenVPN офлайн, поэтому скрипт разрывает связь с ним. При последующих проверках скрипт ничего не делает пока OpenVPN сервер не станет доступен. Когда OpenVPN снова онлайн, выполняется подключение к нему.

Используйте Диспетчера задач Windows для запуска вашего скрипта примерно следующим образом:

powershell -File vpn.ps1 -WindowStyle Hidden

Пример скрипта для Linux — создайте файл vpn.sh и скопируйте в него:

#!/bin/bash

# IP адрес сервера OpenVPN
openvpnIP='185.117.153.79'
# путь до конфигурационного файла для подключения клиента к OpenVPN серверу
openvpnFILE='/home/mial/bin/OpenVPNassistent-конфигурации/configs/client1.ovpn'

isOpenVPNActive=`pgrep openvpn`

timeout 1 ping -c 1 $openvpnIP > /dev/null;
if [ $? -eq 0 ]; then
	echo 'Сервер онлайн'
	if [ -z "$isOpenVPNActive" ]; then
		echo 'Подключение к OpenVPN отсутствует, подключаемся...'
		sudo openvpn "$openvpnFILE" &
	else
		echo 'Уже подключены к OpenVPN, ничего не делаем...'	 
	fi	
else
	echo 'Сервер офлайн'
	if [ -z "$isOpenVPNActive" ]; then
		echo 'Подключение к OpenVPN отсутствует, ничего не делаем...'
	else
		echo 'Подключены к OpenVPN, разрываем связь...'
		kill "$isOpenVPNActive"
	fi 
fi

Запускать так:

sudo bash vpn.sh

OpenVPN сервер онлайн, поэтому скрипт выполняет подключение к нему и при последующих проверках ничего не делает. Проверка IP клиента показывает, что выход в Интернет выполняется действительно через OpenVPN. OpenVPN офлайн, поэтому скрипт разрывает связь с ним. При последующих проверках скрипт ничего не делает пока OpenVPN сервер не станет доступен. Когда OpenVPN снова онлайн, выполняется подключение к нему.

Для регулярного запуска используйте .timer systemd или cron.

Заключение

Главная цель этой статьи сделать так, чтобы вы думали об OpenVPN более широко. Это не просто способ поменять IP адрес. Это возможность создать защищённое окружение в котором участники могут обращаться к ресурсам друг друга минуя все проблемы и ограничения NAT. Также можно придумать не совсем стандартные способы использования OpenVPN — для обхода Wi-Fi хот-спотов, например.

Ну и опять реферальная ссылка на VDS/VPS сервера. Эта рефералка поможет хостить новые интересные проекты, а также писать больше инструкций по настройке VDS и различных сетевых сервисов.


Рекомендуется Вам:

23 комментария to Продвинутое использование OpenVPN

  1. WazZzuP:

    Добрый вечер (ну или что сейчас у вас), спасибо за пошаговые руководства. Все работает как надо, почти.. Столкнулся с тем что смарт на андроиде (чистый андроид 8.1) категорически не даёт OpenVPN работать при выключенном экране - само приложение постоянно подключается заново как только включается дисплей. Не могли бы подсказать как это побороть (приложения в сеть не могут попасть пока телефон в кармане, в настройках включена блокировка трафика "не VPN" и приложению разрешено работать в фоне, не сберегая энергию, запуск "поверх других приложений")? Есть впечатление что истина на поверхности, а я просто тупо залез слишком далеко. И ещё момент по поводу перехватывающих порталов: у меня на работе есть WiFi при подключении открывает страницу входа (раньше просил номер телефона-слал код-показывал рекламу- открывал ya.ru, теперь просто выдает ссылку "войти" и кажет баннер, после закрытия которого появляется инет). При использовании OpenVPN работать перестал совсем - по статистике в приложении видно что трафик/пакеты уходят на ура, а вот в ответ абсолютная тишина. Сталкивались/боролись с этим? Первые 2 раза одну страницу успевал загрузить, потом таймауты пошли, сегодня попробовал - принято 0 байт 0 пакетов… видимо забанили(((

    • Alexey:

      В настройках OpenVPN для Андройд у меня есть опция Battary Saver: Pause VPN when screen goes blank — проверьте, не включена ли она у вас.

      Про перехватывающий портал не совсем понял. К Перехватывающему порталу, наверно, в вашем случае сначала нужно подключиться без VPN, чтобы авторизоваться там. Затем можно включать VPN. Если же суть проблемы в том, что даже после нормальной авторизации VPN не работает, что можно попробовать прописать другой порт. В этой инструкции я рекомендую использовать порт 53, можно вернуться к стандартному порту 1194. Если по каким-либо причинам порт 1194 заблокирован, то можно использовать порт 443 — этот порт используется при открытии HTTPS сайтов (теперь это практически все сайты) и без того,  чтобы не поломать полностью Интернет-доступ, заблокировать его невозможно.

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

  2. WazZzuP:

    Да, battery saver есть, пробовал по разному и в настройках андроида тоже приложению разрешил не стесняться в расходе заряда… Пошел сначала (снёс приложение, создал новый .ovpn ) - вроде работает, видимо в попытках добиться желаемого перемудрил. По перехватывающему порталу попробовал авторизоваться с отключенным OpenVPN - все работает до момента его включения. А порт пробовать менять во всех конфигах (сервер и все клиенты)?

    • Alexey:

      Да, если менять порт, то придётся это делать во всех конфигурационных файлах: на сервере и на каждом клиенте. После изменений на сервере нужно будет перезапустить службу OpenVPN.

  3. Maksim:

    Добрый день.
    Подскажите, а как быть в случаи если нужно выписать еще один сертификат для клиента? Что будет уже с теме что выписаны?
    Можете подсказать процедуру?
    Спасибо.

  4. Alexey:

    Имеется в виду с помощью скрипта OpenVPNassistent? Если да, то никак — он для того, чтобы сразу создать много сертификатов и больше не пришлось к этому возвращаться.

    Но «вручную» (вводя команды) как это описано здесь, вы можете создать любое количество дополнительных сертификатов.

    Возвращаясь к скрипту OpenVPNassistent, его задача чуть автоматизировать задачу, когда нужно создать сертификаты для 5-15-50 и любого другого большого количества клиентов.

    • Maksim:

      Спасибо. 
       

    • Max:

      Alexey привет. Тема с VPN для телефона очень интересна и востребована многими. У меня лично(да думаю не только у меня) есть ряд вопросов: Можно ли установить VPN на телефон не скачивая каких либо приложений? Как сделать свой VPN и настроить его на телефоне? Как правильно заполнить те графы раздела VPN в телефоне? Ведь для многих(в том числе и для меня) это просто темный лес. Вот было бы круто если бы с этим помогли разобраться. Естественно ценность информации увеличивается в разы если она будет действенна и БЕСПЛАТНА)))

  5. zoban:

    Такое впечятление что в easyRSA ввели какое то новое обновление которое теперь не работает по ранее данными инструкциями…. тот баш скрип что тут дает в итоге это, ручная установка также не работает((

    cat: /usr/share/easy-rsa/pki/ca.crt: No such file or directory
    cat: /usr/share/easy-rsa/pki/issued/server.crt: No such file or directory
    cat: /usr/share/easy-rsa/pki/private/server.key: No such file or directory
    openvpnassistent.sh: line 310: ./easyrsa: No such file or directory
    openvpnassistent.sh: line 311: ./easyrsa: No such file or directory
    cat: /usr/share/easy-rsa/pki/ca.crt: No such file or directory
    cat: /usr/share/easy-rsa/pki/issued/client1.crt: No such file or directory
    cat: /usr/share/easy-rsa/pki/private/client1.key: No such file or directory
    openvpnassistent.sh: line 310: ./easyrsa: No such file or directory
    openvpnassistent.sh: line 311: ./easyrsa: No such file or directory
    cat: /usr/share/easy-rsa/pki/ca.crt: No such file or directory
    cat: /usr/share/easy-rsa/pki/issued/client2.crt: No such file or directory
    cat: /usr/share/easy-rsa/pki/private/client2.key: No such file or directory
    Configuration files are created, they are located in the folder :/root/OpenVPNassistent/configs/
    total 12
    -rw-r--r-- 1 root root  894 Apr  1 11:48 client1.ovpn
    -rw-r--r-- 1 root root  894 Apr  1 11:48 client2.ovpn
    -rw-r--r-- 1 root root 1445 Apr  1 11:48 server.conf
    If you need a VPS server to configure OpenVPN, I recommend this one: https://m.do.co/c/52bf4857e82c (if you follow the link to register, you will get bonus dollars!)
     

     

     

  6. andr:

    zoban:

    таже проблемма

  7. Вано:

    Подскажите, возможно ли направить трафик в локалку сервера (192.168.*), где стоит впн через этот же впн, а в остальной интернет мимо впн? Сервер и клиент на арче, мобила андроид.

    • Alexey:

      Приветствую! Проще всего добавить устройства локальной сети, к которым должен быть доступ, в VPN сеть — у них будет свой IP в сети OpenVPN с прямым доступом из неё. Понятно, что клиентом OpenVPN может быть любой компьютер, а также многие более-менее продвинутые роутеры уже много лет умеют выступать как в роли OpenVPN сервера, так и в роли OpenVPN клиента, поддерживают необходимые сертификаты и пр.

      Роутеру на скриншоте уже лет десять, может быть больше:

      Как всегда, в качестве альтернативы имеется «наркоманский» способ, нужно будет действовать по примерно следующей схеме:

      1. В конфигурации OpenVPN для клиентов с помощью ifconfig/ifconfig-push написать правило маршрутизации трафика к желаемой локальной сети (192.168.*) через OpenVPN сеть.

      2. На сервере с помощью iptables (MASQUERADE) перенаправить поступивший трафик к локальной сети (192.168.*)

      Если к локальной сети доступ должен происходить по цепочке:

      Клиент_OpenVPN_1 → Сервер_OpenVPN → Клиент_OpenVPN_2 → Локальная сеть (192.168.*), то тогда на Клиент_OpenVPN_2 также должна быть сделана тонкая настройка iptables (MASQUERADE) для доступа к (192.168.*) — в правилах должен быть учтён источник подключения (виртуальная частная сеть), иначе само устройство при попытке сделать подключение к 192.168.* будет отправлять запрос через OpenVPN.

      Способ явно «наркоманский», поскольку сама суть OpenVPN в том, чтобы объединять устройства в одну виртуальную локальную сеть с удобным доступам к ним независимо от того, в каких сетях они находятся. ИМХО, реальное применение это может найти только для обеспечения доступа к локальной сети, которая вообще изолирована от Интернета, и которая по этой причине не может подключаться к OpenVPN серверу.

      • Вано:

        Алексей, спасибо за ответ. Хоть из него не сразу все понятно, главное, что способ есть. Дальше погуглю.

        А необходимо это по следующей причине. Моя сеть выглядит следующим образом.

        Сервер - ПК с арчем и впн - стоит у меня дома. Там провайдер А. Клиентам нужно часто подключаться к серверу и еще одному рядом стоящему файл-серверу. Обычно у клиентов провайдер Б, когда я вне дома. Так же есть квартира с провадйром С. Из него клиентам тоже нужен доступ к серверу и файловому серверу. Все работает через впн. Но есть нюанс с провайдером А - он использует технологию подключения АДСЛ и на отдачу не дает более 3,5 МБ. Это теоритически, на практике скорость редко поднимается 1,5-2 МБ.

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

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

  8. Sergey:

    Класный скрипт, очень понравился.

    Протестил на archlinux и на ubuntu.

    На archlinux работает отлично.

    На Ubuntu нет. Для ubuntu, то что устанавливается в /usr/share/easy-rsa, нужно заменить на wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz и тогда скрипт всё сделает сам как надо.

    Спасибо большое за скрипт.

      

  9. Виктор:

    Хорошая статья спасибо) Хотел спросить еще как можно настроить разграничение доступа в openvpn. Сейчас по умолчанию включена опция на сервере client to client. Сейчас необходимо закрыть общение между клиентами, но не для всех. В ccd статические ip настроены. Пытался сделать так:

    iptables -A FORWARD -i tun0 -s 10.16.1.2 -d 10.16.0.0/19 -j ACCEPT # условный клиент который должен видеть всех
    iptables -A FORWARD -i tun0 -s 10.16.0.0/19 -d 10.16.0.0/19 -j DROP # закрываем доступ всем
    iptables-save # сохраняем правила

    Но ничего не вышло.

    • Alexey:

      Приветствую! Я сам ещё не освоил iptables, хотя в моём самообразовании это приоритетная задача уже последние пару лет, поэтому чего-то особо полезного вряд ли подскажу. В чём именно проблема? Если клиенты не отвечают, то дело во втором правиле, которое запрещает им любой трафик в локальной сети, даже если это ответ на запрос.

      То есть если отбрасывать все соединения внутри VPN, то может получиться так, что тот клиент, кому разрешено делать подключения внутри VPN, сможет их делать, а другой клиент не сможет ответить, так как его ответ будет подпадать под второе правило и будет, соответственно, дропнут. С помощью опции --tcp-flags и правильно подобранных TCP флагов (разные там SYN,FIN,ACK SYN) можно запретить для остальных клиентов именно исходящие соединения в локальную сеть, но входящие соединения и ответы на входящие разрешить.

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

      Может быть, найдёте что-то полезное в статье «How to limit client access to LAN addresses?»

  10. d3t5:

    Здравствуйте. Тот же вопрос интересует, с одним отличием, как всех клиентов изолировать друг от друга, чтобы клиенты vpn сервера могли ходить только во внешний интернет и не имели доступа к хостам виртиуальной сети?

  11. d3t5:

    Протестировал сейчас ваш скрипт, огромнейший респект, отличная идея и реализация!!! Огромное спасибо вам за ваши труды и вашим родителям за вас)) это не нужно публиковать в комментах, это лично для вас. Хочу как время будет разобрать скрипт, понять весь код. Кстати было бы здорово, если вы написали бы материалы по bash (знаю что материалов в сети много, но у вас очень хорошо получается доносить материал понятным языком).Не устану вас благодарить, спасибо ещё раз! Здоровья вам и вашей семье, берегите себя.

     

     

  12. Таблетка:

    Здравствуйте , а есть ли кто из знатоков кто может разобраться и помочь с созданием или может есть готовый скрип как запустить опен впн с  scramble или как его правильно называют маскировка. дело в том что в нашей стране блокируют опен каждый день фактически. Сначала провайдер заблокировал выход по UDP протокол на чём базируется сам опен. Готовых скриптов много но там нет ничего , что могло юы замаскировать опен от нашего провайдера.

  13. Дмитрий:

    Здравствуйте. Подсети филиалов объединены через OpenVPN. Все клиенты подключаются к серверу и маршруты в интернет прописаны через OpenVPN сервер. Все работает, только вот есть проблема. Если OpenVPN сервер по какой-то причине остается без интернета, то и все остальные филиалы тоже остаются без интернета, ведь трафик идет не через свой шлюз, а через сервер OpenVPN. Можно ли как-то написать скрипт, чтобы: 1. при отсутствии связи до OpenVPN сервера маршруты восстанавливались и работали через собственный шлюз. 2. Раз 2-3 минуты клиент пытался бы подключиться к OpenVPN серверу. 3. При восстановлении подключения маршруты прописывались бы снова через OpenVPN сервер.

    Прошу подсказки.

Добавить комментарий для WazZzuP Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *