← Статьи

SoftEther VPN Client на Linux без мучений с vpncmd: скрипт vpn-menu.sh

· ~4 мин чтения

Содержание

SoftEther VPN Client на Linux управляется через vpncmd — консольную утилиту с длинными командами вроде vpncmd localhost /CLIENT /CMD AccountConnect ИМЯ. Подключиться так можно, но это ещё не всё: адрес на виртуальном интерфейсе потом приходится получать руками через dhclient, а при отключении не забыть его убрать.

Мне надоело держать всё это в голове, и я написал vpn-menu.sh — интерактивное меню поверх vpncmd. Скрипт сам ставит клиент, создаёт подключение из файла .vpn или по данным сервера, а подключает и отключает одной кнопкой, заодно получая и убирая IP. Интерфейс цветной, на русском или английском.

Скачать vpn-menu.sh

Что понадобится

  • Linux. Лучше Debian или Ubuntu — там клиент ставится через apt.
  • Права root: sudo, su или doas.
  • bash, ip, awk и dhclient или dhcpcd.
  • Профиль подключения: файл .vpn, выгруженный из SoftEther, или данные для ручного создания — адрес сервера и порт, имя Virtual Hub, логин и пароль.

Установка и запуск

chmod +x vpn-menu.sh
sudo ./vpn-menu.sh

Я у себя кладу скрипт в PATH под коротким именем, так удобнее:

sudo cp vpn-menu.sh /usr/local/bin/vpn
sudo vpn

Если sudo в системе нет, подойдёт su -c "./vpn-menu.sh" или doas ./vpn-menu.sh.

Язык интерфейса

СпособКоманда
Русскийsudo ./vpn-menu.sh --lang=ru
Английскийsudo ./vpn-menu.sh --lang=en
Переменная окруженияVPN_LANG=en sudo -E ./vpn-menu.sh
Автоматическибез параметров — по системной локали $LANG

Первый запуск

На первом запуске скрипт сам доводит систему до рабочего состояния:

  1. Клиента нет — пробует apt install softether-vpnclient. Если такого пакета не нашлось, выводит инструкцию по сборке из официального архива.
  2. Демон не запущен — запускает его через systemd или напрямую.
  3. Сохранённых подключений нет — предлагает на выбор:
    • импортировать файл .vpn — путь можно вводить с автодополнением по Tab;
    • создать подключение вручную — имя, сервер:порт, Virtual Hub, логин и пароль. Виртуальный адаптер и подключение скрипт создаст сам.

Как пользоваться каждый день

  1. Запускаете sudo ./vpn-menu.sh.
  2. Выбираете номер подключения в списке. Рядом с каждым видно состояние: ● connected зелёным или ○ offline серым.
  3. Выбираете действие:
    • Подключить — скрипт соединяется, ждёт сессию, запрашивает IP по DHCP и показывает полученный адрес;
    • Отключить — рвёт соединение, освобождает и очищает IP на интерфейсе;
    • Отмена.

Несколько подключений сразу

Для каждого подключения скрипт находит его собственный интерфейс vpn_<имя_адаптера>, поэтому, когда отключаешь одно, адреса остальных он не трогает. Если однозначно определить интерфейс не получилось, скрипт предупредит жёлтым и возьмёт первый найденный vpn_*.

Внимание

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

Настройки

В начале скрипта есть три переменные:

ПеременнаяПо умолчаниюНазначение
VPNCLIENT_MANUAL_DIR/usr/local/vpnclientКуда установлен клиент при ручной сборке
DHCP_TIMEOUT15Сколько секунд ждать выдачи IP
SYSTEMD_SERVICEsoftether-vpnclientИмя службы systemd при установке из apt

Если что-то не работает

СимптомЧто делать
«Запусти скрипт с правами root»Запускайте через sudo, su или doas
Установка через apt не удаласьСледуйте инструкции, которую выведет скрипт: сборка из архива, копирование в /usr/local/vpnclient/, затем повторный запуск
Ошибка подключения к vpncmdДемон не запущен: sudo systemctl start softether-vpnclient или sudo /usr/local/vpnclient/vpnclient start
Сессия не устанавливаетсяПроверьте вручную: sudo vpncmd localhost /CLIENT /CMD AccountStatusGet ИМЯ
IP не полученСкорее всего, на Virtual Hub не включены DHCP или SecureNAT. Проверьте: sudo dhclient -v vpn_ИМЯ. Если DHCP нет — задайте адрес вручную: ip addr add IP/МАСКА dev vpn_ИМЯ
IP остался после отключенияsudo ip addr flush dev vpn_ИМЯ
Вместо ✔ ✘ → ● ○ кракозябрыТерминал не в UTF-8. Включите UTF-8 в настройках терминала (в PuTTY: Window → Translation → UTF-8) или выполните export LANG=ru_RU.UTF-8
Нет цветовВывод идёт не в терминал, а в файл или через pipe. Это штатно: цвета отключаются автоматически

Команды vpncmd, которые пригодятся

sudo vpncmd localhost /CLIENT /CMD AccountList            # список подключений
sudo vpncmd localhost /CLIENT /CMD AccountStatusGet ИМЯ   # статус подключения
sudo vpncmd localhost /CLIENT /CMD AccountGet ИМЯ         # параметры подключения
sudo vpncmd localhost /CLIENT /CMD AccountDelete ИМЯ      # удалить подключение
ip -4 addr show                                           # адреса интерфейсов

Чего скрипт не умеет

  • Ручную сборку клиента он не автоматизирует, только показывает инструкцию.
  • IP по DHCP получает, но маршруты не трогает. Если весь трафик нужно пустить через VPN, маршрут по умолчанию придётся настроить отдельно.
  • Другая версия vpncmd может выводить данные в другом формате, и тогда список подключений или статус не распознаются. Если столкнётесь — напишите мне и пришлите вывод AccountList и AccountStatusGet, я поправлю разбор.

Как добавить свой язык

Все строки интерфейса лежат в функции L() парами ru:ключ) / en:ключ). Для нового языка добавьте такие же пары со своим кодом и допишите этот код в блок выбора языка в начале скрипта.

Обсуждение

Комментарии работают через GitHub: для ответа нужен аккаунт GitHub. Вопрос без регистрации — напишите мне напрямую.