Автоматизация OpenVPN на Ubuntu: удобные команды vpn-up и vpn-down
OpenVPN до сих пор остается одним из самых популярных решений для защищенного подключения к корпоративным сетям. Однако его использование на Linux часто выглядит неудобно: каждый раз нужно вводить длинную команду sudo openvpn ..., затем вводить логин, пароль, держать туннель в открытом терминале и вручную завершать процесс через Ctrl+C.
Такой сценарий утомляет и абсолютно не подходит для продуктивной работы. Если VPN нужно включать и выключать по несколько раз в день — имеет смысл рассмотреть одну простую команду, без рутины и лишних вопросов.
В этой статье разберем, как сделать OpenVPN удобным:
- Запуск одной командой —
vpn-up; - Отключение одной командой —
vpn-down; - Без запроса логина и пароля каждый раз;
- Без sudo-пароля;
- Без зависания терминала.
Результат — компактная автоматизация OpenVPN, которая упрощает жизнь разработчику, администратору и DevOps-инженеру.
Что сделаем
Настроим удобный запуск OpenVPN через две команды:
| Команда | Назначение |
|---|---|
vpn-up | Подключиться к VPN |
vpn-down | Отключиться от VPN |
При этом:
- Не нужно вводить логин и пароль каждый раз
- OpenVPN будет работать в фоне (не блокируя терминал)
- Не нужно писать
sudoперед командами - Все будет работать из любой директории
- Конфигурация остается безопасной и под контролем
Это решение полезно как для локальной разработки, так и для рабочих станций, серверов или DevOps-скриптов.
Окружение
Для примеров используется стандартная Linux-среда:
| Компонент | Версия / Значение |
|---|---|
| Дистрибутив | Ubuntu 20.04 / 22.04 / 24.04 |
| VPN клиент | OpenVPN |
| Конфигурация | Готовый .ovpn профиль |
| Shell | Bash |
Проверяем, что OpenVPN установлен:
1
openvpn --version
Если не установлен, добавляем:
1
2
sudo apt update
sudo apt install openvpn -y
Также понадобится рабочий конфигурационный файл VPN, который обычно выдают администраторы, например:
1
client-tcp.ovpn
В примере будем использовать путь к файлу:
1
/home/abykov/OpenVPN/client-tcp.ovpn
Настройка OpenVPN без запроса логина и пароля
По умолчанию OpenVPN при каждом подключении запрашивает имя пользователя и пароль:
1
2
Enter Auth Username:
Enter Auth Password:
Уберем это, сохранив учетные данные в отдельный защищенный файл.
Создаем файл с логином/паролем
Создадим файл ~/.vpn-credentials:
1
nano ~/.vpn-credentials
Вставляем в него две строки:
1
2
VPN_USERNAME
VPN_PASSWORD
Закрываем доступ к файлу (безопасность)
По умолчанию файл будет доступен всем пользователям системы. Исправим это:
1
chmod 600 ~/.vpn-credentials
Теперь только наш пользователь может читать этот файл.
Указываем путь к учетным данным в .ovpn
Открываем VPN-конфигурацию:
1
nano /home/abykov/OpenVPN/client-tcp.ovpn
Добавляем строку:
1
auth-user-pass /home/abykov/.vpn-credentials
Теперь OpenVPN будет автоматически брать логин и пароль из файла.
Удобные команды vpn-up и vpn-down
Чтобы каждый раз не писать длинную команду sudo openvpn ..., создадим две короткие команды:
vpn-up— подключить VPNvpn-down— отключить VPN
Создаем скрипт подключения vpn-up
Создадим файл в системной директории для пользовательских утилит:
1
sudo nano /usr/local/bin/vpn-up
Вставляем содержимое:
1
2
#!/bin/bash
sudo openvpn --config /home/abykov/OpenVPN/client-tcp.ovpn --daemon
Сохраняем и делаем исполняемым:
1
sudo chmod +x /usr/local/bin/vpn-up
Создаем скрипт отключения vpn-down
1
sudo nano /usr/local/bin/vpn-down
Вставляем:
1
2
#!/bin/bash
sudo killall openvpn
Делаем исполняемым:
1
sudo chmod +x /usr/local/bin/vpn-down
Теперь можно подключать VPN короткой командой:
1
vpn-up
И отключать:
1
vpn-down
Но пока эти команды требуют пароль sudo. Сделаем так, чтобы и его не нужно было вводить.
Запуск без sudo-пароля
По умолчанию команды vpn-up и vpn-down требуют sudo, а значит — каждый раз нужно вводить пароль суперпользователя. Исправим это с помощью sudoers, позволив выполнять только эти две команды без пароля, но при этом не открывая полный доступ.
Открываем редактор правил sudo:
1
sudo visudo
Добавляем строку в самый низ (следует заменить abykov на актуальный логин в системе):
1
abykov ALL=(ALL) NOPASSWD: /usr/local/bin/vpn-up, /usr/local/bin/vpn-down
⚠️ Важно: не давайте
NOPASSWDдляALL, разрешайте только явные команды — это безопасно.
Проверка работы
Подключим VPN:
1
vpn-up
Если конфигурация корректна, соединение установится в фоне. Процесс OpenVPN можно проверить:
1
ps aux | grep openvpn
Или убедиться по появлению нового сетевого интерфейса (обычно tun0):
1
ip addr show tun0
Также можно проверить внешний IP:
1
curl ifconfig.me
Отключение VPN:
1
vpn-down
Проверяем, что процесс завершен:
1
2
pgrep openvpn
# (ничего не должно выводиться)
Готово — у нас теперь есть удобный контроль VPN без лишних действий.
Улучшаем решение (PRO-версия)
Базовый вариант работает, но у него есть несколько недостатков:
| Проблема | Что улучшим |
|---|---|
| Нет уведомлений | Не видно, подключился VPN или нет |
| Нет проверки статуса | Скрипт не знает, запущен ли OpenVPN |
| Теряется контроль | Нет логов подключения |
| Возможны двойные подключения | Можно случайно запустить второй openvpn |
| Нет проверки подключения | Нет ожидания, пока туннель установится |
Сделаем расширенную версию, но без усложнений — оставим решение легким и удобным.
Добавим уведомления подключения
Установим notify-send (если не установлен):
1
sudo apt install libnotify-bin -y
Новый vpn-up (smart запуск)
Заменим файл /usr/local/bin/vpn-up:
1
sudo nano /usr/local/bin/vpn-up
Пишем:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
CONFIG="/home/abykov/OpenVPN/client-tcp.ovpn"
LOG_DIR="/home/abykov/OpenVPN"
LOG_FILE="$LOG_DIR/openvpn.log"
CHECK_IP_CMD="curl -s https://api.ipify.org"
mkdir -p "$LOG_DIR"
# Проверка: уже подключено?
if pgrep openvpn >/dev/null; then
notify-send "⚡ VPN Tunnel Active" "VPN уже подключен"
exit 0
fi
# Запуск OpenVPN в фоне
sudo openvpn --config "$CONFIG" \
--log-append "$LOG_FILE" \
--auth-retry nointeract \
--connect-retry 5 10 \
--connect-retry-max 9999 \
--daemon
# Ожидание подключения
ATTEMPTS=0
while ! grep -q "Initialization Sequence Completed" "$LOG_FILE" 2>/dev/null; do
sleep 1
ATTEMPTS=$((ATTEMPTS+1))
if [ $ATTEMPTS -gt 25 ]; then
notify-send "🛑 VPN Error" "Не удалось подключиться"
exit 1
fi
done
# Проверяем внешний IP
IP=$($CHECK_IP_CMD)
notify-send "⚡ VPN Connected" "Туннель активен ✅ IP: $IP"
exit 0
Делаем файл исполняемым:
1
sudo chmod +x /usr/local/bin/vpn-up
Новый vpn-down (чистое завершение)
Заменим файл /usr/local/bin/vpn-down:
1
sudo nano /usr/local/bin/vpn-down
Пишем:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
LOG_FILE="/home/abykov/OpenVPN/openvpn.log"
if ! pgrep openvpn >/dev/null; then
notify-send "⚡ VPN Off" "VPN уже отключен"
exit 0
fi
sudo killall openvpn
sleep 1
notify-send "🔻 VPN Disconnected" "Туннель закрыт"
exit 0
Выдаем права:
1
sudo chmod +x /usr/local/bin/vpn-down
Уведомления будут иметь вид:
Теперь наше подключение выглядит профессионально: уведомления, лог, защита от повторного запуска.
Итог
Мы превратили стандартный OpenVPN на Ubuntu в удобный инструмент командной строки. Теперь подключение и отключение выполняются одной командой — без ввода пароля, без лишней рутины и с наглядными уведомлениями.
| Возможность | Было | Стало |
|---|---|---|
| Подключение | Вручную, с вводом логина/пароля | vpn-up |
| Отключение | Ctrl+C в терминале | vpn-down |
| Требуется sudo пароль | Да | Нет |
| Уведомления | Нет | Да |
| Логи | Нет | Да |
| Автоматизация | Нет | Да |
Команды:
| Команда | Назначение |
|---|---|
vpn-up | Подключить VPN |
vpn-down | Отключить VPN |
Теперь OpenVPN можно использовать так же удобно, как любую системную утилиту. Это решение отлично подходит для локальной разработки, домашнего офиса, подключения к корпоративной сети и использования в автоматизации.
Можно продолжить развивать решение: добавить авто-переподключение, статус-мониторинг, защиту от утечки трафика (kill-switch) и запуск через systemd.


