SoftEther VPN Client на Linux без мучений с vpncmd: скрипт vpn-menu.sh
Содержание
SoftEther VPN Client на Linux управляется через vpncmd — консольную утилиту с длинными командами вроде vpncmd localhost /CLIENT /CMD AccountConnect ИМЯ. Подключиться так можно, но это ещё не всё: адрес на виртуальном интерфейсе потом приходится получать руками через dhclient, а при отключении не забыть его убрать.
Мне надоело держать всё это в голове, и я написал vpn-menu.sh — интерактивное меню поверх vpncmd. Скрипт сам ставит клиент, создаёт подключение из файла .vpn или по данным сервера, а подключает и отключает одной кнопкой, заодно получая и убирая IP. Интерфейс цветной, на русском или английском.
Что понадобится
- 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 |
Первый запуск
На первом запуске скрипт сам доводит систему до рабочего состояния:
- Клиента нет — пробует
apt install softether-vpnclient. Если такого пакета не нашлось, выводит инструкцию по сборке из официального архива. - Демон не запущен — запускает его через systemd или напрямую.
- Сохранённых подключений нет — предлагает на выбор:
- импортировать файл
.vpn— путь можно вводить с автодополнением по Tab; - создать подключение вручную — имя,
сервер:порт, Virtual Hub, логин и пароль. Виртуальный адаптер и подключение скрипт создаст сам.
- импортировать файл
Как пользоваться каждый день
- Запускаете
sudo ./vpn-menu.sh. - Выбираете номер подключения в списке. Рядом с каждым видно состояние:
● connectedзелёным или○ offlineсерым. - Выбираете действие:
- Подключить — скрипт соединяется, ждёт сессию, запрашивает IP по DHCP и показывает полученный адрес;
- Отключить — рвёт соединение, освобождает и очищает IP на интерфейсе;
- Отмена.
Несколько подключений сразу
Для каждого подключения скрипт находит его собственный интерфейс vpn_<имя_адаптера>, поэтому, когда отключаешь одно, адреса остальных он не трогает. Если однозначно определить интерфейс не получилось, скрипт предупредит жёлтым и возьмёт первый найденный vpn_*.
Внимание
У каждого подключения должен быть свой виртуальный адаптер. Если импортируете несколько файлов .vpn, проверьте, что имена адаптеров в них не совпадают.
Настройки
В начале скрипта есть три переменные:
| Переменная | По умолчанию | Назначение |
|---|---|---|
VPNCLIENT_MANUAL_DIR | /usr/local/vpnclient | Куда установлен клиент при ручной сборке |
DHCP_TIMEOUT | 15 | Сколько секунд ждать выдачи IP |
SYSTEMD_SERVICE | softether-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. Вопрос без регистрации — напишите мне напрямую.