Post

Автоматизация OpenVPN на Ubuntu: удобные команды vpn-up и vpn-down

Автоматизация 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 профиль
ShellBash

Проверяем, что 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 — подключить VPN
  • vpn-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

Уведомления будут иметь вид:

VPN уже подключен Туннель закрыт VPN уже отключен

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

Итог

Мы превратили стандартный OpenVPN на Ubuntu в удобный инструмент командной строки. Теперь подключение и отключение выполняются одной командой — без ввода пароля, без лишней рутины и с наглядными уведомлениями.

ВозможностьБылоСтало
ПодключениеВручную, с вводом логина/пароляvpn-up
ОтключениеCtrl+C в терминалеvpn-down
Требуется sudo парольДаНет
УведомленияНетДа
ЛогиНетДа
АвтоматизацияНетДа

Команды:

КомандаНазначение
vpn-upПодключить VPN
vpn-downОтключить VPN

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

Можно продолжить развивать решение: добавить авто-переподключение, статус-мониторинг, защиту от утечки трафика (kill-switch) и запуск через systemd.

This post is licensed under CC BY 4.0 by the author.