Оглавление
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 на одном сервере
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
======КОНЕЦ АКТУАЛЬНОЙ ЧАСТИ======
======УСТАРЕВШАЯ ЧАСТЬ ДЛЯ Topology net30======
(Topology net30 хоть и устарела, но до сих пор применяется по умолчанию, поэтому пока не удаляем этот фрагмент)
В этом файле достаточно указать строку вида
ifconfig-push IP_для_клиента IP_шлюза
Если у вас обычные настройки, то в качестве IP_шлюза у вас всегда будет 10.8.0.1.
Итак, для первого клиента, которому я хочу присвоить IP адрес 10.8.0.10, в файл /etc/openvpn/ccd/client1 я записываю:
ifconfig-push 10.8.0.10 10.8.0.1
То же самое можно сделать командой:
echo 'ifconfig-push 10.8.0.10 10.8.0.1' > /etc/openvpn/ccd/client1
И для всех остальных клиентов:
echo 'ifconfig-push 10.8.0.20 10.8.0.1' > /etc/openvpn/ccd/client2
echo 'ifconfig-push 10.8.0.30 10.8.0.1' > /etc/openvpn/ccd/client3
echo 'ifconfig-push 10.8.0.40 10.8.0.1' > /etc/openvpn/ccd/client4
echo 'ifconfig-push 10.8.0.50 10.8.0.1' > /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 и различных сетевых сервисов.








































































