Проверить кто подключен к опен vpn
Перейти к содержимому

Проверить кто подключен к опен vpn

  • автор:

Следим за своей статистикой OpenVPN

За последние пару недель я встретил огромное количество статей с заголовками «Поднимаем свой VPN» или «Настройка OpenVPN в N шагов». На этой волне я тоже решил попробовать сделать VPN для себя и близких — лишним такой опыт (да и сам VPN) точно не будет. Для этого я прикупил один из самых дешевых VPS с заграничным IP и минимальными характеристиками. Такое удовольствие мне обошлось в

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

Уже после пары часов возни с конфигами и сертификатами и полной настройки VPN, в панели управления сервером я обнаружил, что максимальная скорость канала — 10Мбит/с (это было написано ещё на странице заказа, но я проглядел этот момент). В техподдержке пояснили, что это ограничение становится активным при превышении скорости трафика в 10Мбит/с за час (значит, что нужно прогнать примерно 4,5Гб за это время). Получилось неловко, конечно, но я не планировал использовать VPN даже в таком объеме. Тем не менее, мне стала интересна задача мониторинга трафика и возможность предупредить себя, если вдруг скорость трафика через VPN приблизится к пороговому значению.

Что уже есть

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

Я выделил для себя 2 решения:

OpenVPN-Admin — целый комбайн, который служит не только для мониторинга, но и для управления сертификатами и самим сервером OpenVPN

OpenVPN-Monitor — просто live-time мониторинг с географической картой, на которой отображаются подключенные клиенты

Первое решение в моем случае было бы чересчур избыточно, мне никогда не пригодилось бы 80% функционала. Во втором же случае оказалось, что мониторинг ведется только на текущий момент, при этом статистика не собирается — нет возможности посмотреть, сколько клиент загрузил/выгрузил за последний час, а именно ради этого я искал решение.

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

Формулировка задачи

Так что я решил за пару выходных набросать свое решение и заодно попрактиковаться в некоторых вещах. Что конкретно я хотел:

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

Отслеживать общее потребление трафика

Предупреждать, если трафик за последний час переваливает за 8-9Мбит/с

А ещё смотреть за всем этим делом в веб-интерфейсе (в эстетических целях) и попробовать запаковать все в Docker (в образовательных целях)

Парсим, парсим, парсим

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

Она позволяет указать файл, в который будет записываться статистика об использовании трафика подключенными клиентами. После имени файла можно дополнительно указать число — интервал в секундах, через который файл будет автоматически обновляться (по умолчанию это 60 секунд).

Для комплексного подхода и, по-моему, более гуманного, чем парсинг файла, можно использовать management-server, для этого в конфиге нужно указать следующую директиву:

Дополнительно можно указать пароль для подключения к интерфейсу (подробнее).

После этого появится возможность подключиться к серверу OpenVPN посредством telnet:

Интерфейс управления OpenVPN

Интерфейс управления OpenVPN

Собираем статистику

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

Для сбора статистики я выбрал вариант с использованием management-interface и для этого написал небольшой скрипт на Python. Раз в N секунд он обращается к интерфейсу управления, запрашивает статус и создает/обновляет записи в MongoDB для каждого пользователя:

Схема хранения данных

Схема хранения данных Можно лучше

Уже при написании статьи я заметил некоторые свои ошибки. Да, хранить данные можно было гораздо оптимальнее и обойтись всего одной коллекцией — только segments. По ней можно провести весь анализ, практически не добавляя новых полей, а поля с разностью (d_received и d_send) можно вычислять динамически, если не планируется анализ слишком больших отрезков времени

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

Теперь статистика собирается, остается наращивать функционал! В моем случае нужно было только отображать её в вебе и выдавать предупреждения, если скорость трафика будет превышена!

Делаем удобно

Для отображения в вебе я сделал простое веб-приложение на Vue и API для него на Flask. Ничего необычного в нём нет — одна страничка, на которой отображается общая статистика и карточки для каждого из пользователей:

Так выглядит веб-интерфейс для мониторинга трафикаТак выглядит веб-интерфейс для мониторинга трафика Упс, забыл округлитьУпс, забыл округлить

Веб-интерфейс — здорово, но как быть с уведомлением о превышении скорости трафика? Изначально у меня были мысли о том, чтобы отправлять уведомления прямо в браузер, но до них я так и не добрался, потому что в голову пришло другое решение — сделать бота в ТГ и слать сообщения из него!

В качестве практики я решил упаковать всё в Docker. Так как MongoDB у меня уже была развернута на другом сервере, её я не стал разворачивать и обошелся двумя Dockerfile — один для веба и один для парсера. Так как оба из микросервисов сделаны на Питоне, то и Dockerfile у них отличаются не сильно

В заключение

Спасибо, что прочитали! В этой статье я хотел просто поделиться опытом в сборе статистики трафика и «интеграции» OpenVPN в реальную жизнь. Вряд ли конкретно мое решение может быть использовано кем-то ещё, но возможности того же management-interface гораздо шире, а следовательно, есть где разгуляться!

How to view connected users to open vpn server?

I’m developing a website for managing OpenVPN users with Django framework. But I need to know is there any way to extract active users from OpenVPN? My server is running Ubuntu 12.04.

9 Answers 9

There should be a status log you can look at to show you, mine is, for examle:

As an alternative, adding the flag —management IP port [pw-file] or adding that same directive to your server.conf , for example:

management localhost 7505

This would allow you to telnet to that port and offer you a list of commands to run:

telnet localhost 7505

To complete @sekrett answer :

It will keep running, it’s not a «regular» kill, just a request to print some stats.

Displayed statistics are very readable. Sample output :

Hossein Vatani's user avatar

I manage our companys OpenVPN servers and the way I see active connections is like this,

add to /etc/openvpn/server.conf

restart openvpn server

add an OpenVPN Monitor Python package — this will run via a Gunicorn web server and show active connections,

create a virtual env (not required but good practice with py packages)

install required packages

add a Monitor config file

start the web server that will show active connections,

To stop monitor

to see active connections, go to the public IP of your VPN server

make sure to configure proper firewall for port 80, whitelist only trusted inbound IPs

enter image description here

I got the same need myself and the easiest solution I found out was to use as mentioned telnet to connect to the management interface(you’ll have to add :management localhost 6666, in the server config file) .

To get the exact number of client you can do :

  • telnet localhost 6666
  • status

Then you’ll get lot of logs :

  • look for => >CLIENT:ENV,n_clients=19361

In my case since I have a very large number of client, using the log file is definitely not very practical.

You can also send usr2 signal to openvpn process to make it write statistic information to syslog. This is safe, you don’t need to reboot in case you did not enable management interface before.

Just use sacli with the following command. This will list the connected VPN clients.

To see all the IPs use this option. ./sacli VPNStatus

BouncingSoles's user avatar

I made a litte script that can either do a one time check or be set to keep monitoring with specified intervalls.

I hink this is better than monitoring the /etc/openvpn/openvpn-status.log since this is really slow to update. Maybe there’s a way to adjust the intervalls in some settings BUT, I only need to monitor the vpn connections sometimes. Not 24/7. Also its quite a messy log.

This script is on the OpenVPN server. Only tested on Ubuntu 20.04

One time run just do:

To keep monitoring with a 20 second intervall:

Save this to .sh file (example oven-activity.sh):

Make sure to change the VPN subnet to match yours.

There is no doubt room for improvements but im not a script genius. I needed it to see when colleagues where using the VPN so that I could see if it was safe to reboot the server. And if so, I could see who was online and call them to ask if it was ok to restart without interrupting their work.

How to Monitor OpenVPN Connections using openvpn-monitor tool

In this tutorial, we are going to learn how to monitor OpenVPN connections using openvpn-monitor tool. This tutorial focuses on monitoring OpenVPN connections established using the OpenVPN Community Edition. OpenVPN CE provides a de-facto standard for creating a secure VPN connections over the internet using a custom security protocol that utilizes SSL/TLS.

While scouring the Internet for the tools that can be used to monitor active OpenVPN connections, I came across a python based tool called openvpn-monitor which utilizes OpenVPN management interface to generate an html report that displays the status of an OpenVPN server, including all current connections.

Please enable JavaScript

How to Monitor OpenVPN Connections using openvpn-monitor tool

Prerequisites

Before you can proceed, there are a few things that needs to have setup.

Install and configure OpenVPN Server

Of course you can be wanting to monitor OpenVPN server connections without having an OpenVPN server running. Follow the links below to install and setup OpenVPN server on CentOS/Ubuntu systems;

Enable Management Interface

openvpn-monitor tools requires that OpenVPN management interface is enabled. The OpenVPN Management interface allows OpenVPN to be administratively controlled from an external program via a TCP or unix domain socket. OpenVPN management server can be enabled on a Unix socket or on a designated TCP port. While using the Unix socket is the recommended method, the openvpn-monitor tool uses OpenVPN management interface TCP connection. It is therefore strongly recommended that you set the OpenVPN management Interface IP to 127.0.0.1 (localhost) to restrict accessibility of the management server to local clients.

OpenVPN management interface TCP connection can be enabled by editing the OpenVPN server configuration file and adding the line, management IP port .

Sets the OpenVPN management interface IP address to 127.0.0.1 (localhost) and TCP port 17562. The openvpn-monitor expects the OpenVPN Management Interface to be listening on TCP port 5555. We will change that later.

Check that the assigned port is not being used by any other program on your system;

If no application is using the port, restart OpenVPN server service;

Check that port is now opened;

Ensure that OpenVPN server service is running;

Install and Setup openvpn-monitor tool

There are different methods of installing openvpn-monitor tool as outlined on the program’s Github repository. In this tutorial, we will use Apache to server the openvpn-monitor OpenVPN connections.

Install Apache for openvpn-monitor

Install Apache and the required package dependencies;

Download the openvpn-monitor program

Next, clone the openvpn-monitor Github repository to your default web server root directory. In this setup, we use, /var/www/html/openvpn-monitor directory.

Configure openvpn-monitor

Rename the sample configuration file, openvpn-monitor.conf.example to openvpn-monitor.conf .

Replace the OpenVPN management interface if you changed it to a port other than 5555 defined on the openvpn-monitor.py Python program.

Next, you can now open the configuration file and set site name, add a logo, set the default map location (latitude and longitude, defaults to New York, USA).

This is how our modified configuration file looks like;

Note the GeoIP2 City Database location. If it is not available on your system, register and download a free version from MaxMind.

One more thing is that, this setup is tested on Ubuntu 20.04, with python 3 being the default. Since openvpn-monitor uses python, simply create a symbolic link from python 3 to python;

Configure Apache to Execute openvpn-monitor script

Next, execute the command below to configure Apache to execute the openvpn-monitor Python script.

Save and exit the configuration file.

Set the ownership of the openvpn-monitor web root directory to Apache user, www-data .

Check Apache configuration syntax;

Enable openvpn-monitor Apache site configuration and disable the default site.

Start Apache and enable it to run on system boot;

Debugging openvpn-monitor

You can run openvpn-monitor from the command line to check if it actually generates the html report correctly:

You can as well add option -d for debugging;

Accessing openvpn-monitor on Browser

If all is well, you can now access your OpenVPN statistics via the address http://<OpenVPN-server-Address/openvpn-monitor or http://<OpenVPN-server-Address/ as per our redirection.

monitor OpenVPN connections using openvpn-monitor tool

And there you go. Beautiful, isn’t? All credit goes to furlongm. As you can see, we have connection status for my locally connected OpenVPN clients.

That marks the end of our guide on how to monitor OpenVPN connections using openvpn-monitor tool. Enjoy.

H Веб интерфейс для OpenVPN. Мониторинг, генерация и отзыв сертификатов в черновиках

Всем доброго дня.
Решил написать статью о том как я писал небольшое приложение на Python/Django. Так получилось, что встала необходимость провести централизацию данных филиалов в одну общую центральную базу. И естественно встал вопрос как филиалы будут подключаться к этой базе. В результате выбор остановился на OpenVPN, через который пользователь получал доступ к определенным серверам.
В итоге все было настроено и готово к работе. Саму настройку сервера я описывать не буду, для этого есть много статей и мануалов.
Решено было, что для каждого пользователя будет выдаваться отдельный сертификат, чтобы в случае чего не пришлось отзывать все сертификаты, и настраивать все заново. И вот первый день внедрения проходит достаточно весело, через косноль линукса генерируются сертификаты, записываются все имена в блокнотик, исправляются конфиги. В общем в конце дня было понятно, что это совсем неудобно. И в голову пришла мысль: «Надо сделать веб интерфейс для всего этого». Так как я в это время читал документацию Django, и все рекомендуют писать что-то свое для обучения, то выбор как раз пал на этот фреймворк. И я приступил к делу.

Конфигурация сервера для веб приложения:

  • Виртуальная машина 512 MB RAM
  • Ubuntu 14.04
  • PostgreSQL 9.3
  • Nginx + uwsgi
  • Python 2.7
  • Django 1.6

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

И таким образом мы заполняли базу данных, получая имя сертификата и выданный IP адрес. На этом месте в голову пришла еще одна идея, раз у нас есть IP адреса, то можно в принципе узнать, подключен ли пользователь в данный момент к нашей сети VPN. Для этого я установил на сервер nmap, написал следующий код и добавил в cron на исполнение каждые 3 минуты:

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

В итоге получается что-то вроде этого:

Дальше по плану было наиболее упрощенная генерация сертификата. На скрине видно что есть форма с кнопкой «Генерация сертификата». В это поле вводится желаемое имя сертификата, нажимается кнопка и вуаля сразу предлагается скачать архив с ключами, и файлом конфигурации. То есть потом передаешь этот архив клиенту, он его распакоывывает в папку conf, и на этом настройка клиента завершена. Это реализуется с помощью следующего кода:

В принципе осталось только организовать удобный отзыв сертификатов. Уволился сотрудник — удален сертификат. Следующий получает новый. В этом нам поможет следующий небольшой кодик:

Для этого создается HTML страничка со списком всех сертификатов и напротив каждого кнопка удаления.

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

Добавить комментарий

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