RU EN

Автоматизация 2FA OpenVPN соединения

 

Предполагается, что уже получен ovpn-конфиг для клиента в файле /etc/openvpn/client.ovpn. Предварительно понадобится установить пакеты xdotool, zbar-tools и oathtool:

apt install xdotool zbar-tools oathtool

Для получения времменного пина, потребуется секрет, который можно сгенерировать например, с помощью LinOTP. Если уже есть QR-код c секретом, сканируем картинку:

$zbarimg -q --raw /home/user/Downloads/qr.png
otpauth://totp/LinOTP:username?secret=4AFBXRUS7C2JSZ7E9NSVJXY7TJEMHCUN&issuer=LinOTP

Требуемый секрет берётся из get-параметра secret. Далее нужно сгенерить файл с кредами для openvpn. Например так:

$printf "username\npassword" > /root/.cache/.vpnpass

Далее добавляем в /etc/openvpn/digitalms.ovpn строчку:

auth-user-pass /root/.cache/.vpnpass

Автоматически OpenVPN-соединение будет создаваться shell-скриптом:

#!/bin/bash

oathtool -b --totp 4AFBXRUS7C2JSZ7E9NSVJXY7TJEMHCUN | xclip
openvpn --config /etc/openvpn/digitalms.ovpn --daemon &
xdotool key Shift+Insert

Этот скрипт можно поместить в /usr/local/sbin/ovpn-up и запускать командой:

sudo ovpn-up

Янчарук А.В.
29.02.2024 09:31


Комментарии:


04.02.2026 16:40
 
Я бы несколько поправил статью с целью пошагового применения Сначала нужно получить QR код, с которым потом происходит двухфакторная аутентификация, которую вы добавляете в тот же Google Authenticator И иметь под рукой ovpn файл. Допустим он называется digitalms.ovpn Затем установить пакеты sudo apt install xdotool zbar-tools oathtool xclip expect Затем получить секрет из QR кода. Секрет добывается командой zbarimg -q --raw /home/user/Downloads/qr.png В выводе мы получаем что-то вроде otpauth://totp/LinOTP:username?secret=4AFBXRUS7C2JSZ7E9NSVJXY7TJEMHCUN&issuer=LinOTP то, что после secret и до знака & и есть наш секрет Затем нужно положить логин и пароль в кеш рута (sudo) sudo printf "ваш_логин\nваш_пароль" > /root/.cache/.vpnpass sudo chmod 600 /root/.cache/.vpnpass Затем мы копируем файл в директорию OpenVPN sudo cp -a /home/user/Downloads/digitalms.ovpn /etc/openvpn/digitalms.ovpn Внутри ovpn проверяем - есть ли строка, начинающаяся с auth-user-pass. Если есть - заменяем на то что ниже, а если нет - добавляем в конце файла auth-user-pass /root/.cache/.vpnpass Затем мы смотрим что ожидает от нас подключение VPN когда требует OTP код sudo openvpn --config /etc/openvpn/digitalms.ovpn В выводе оно должно остановиться на какой-то строке. У меня это CHALLENGE: OTP Далее идем создавать в папке /usr/local/sbin/ файл ovpn-up и открываем на редактирование. Например, командой ниже мы открываем редактор VIM sudo vim /usr/local/sbin/ovpn-up И вставляем код, который сработал лично у меня #!/usr/bin/expect -f # === Настройки === # Замените на ваш секрет из QR-кода set secret "4AFBXRUS7C2JSZ7E9NSVJXY7TJEMHCUN" set config "/etc/openvpn/digitalms.ovpn" set wait_msg "CHALLENGE: OTP" # Генерируем TOTP и копируем в CLIPBOARD (а не PRIMARY) set totp [exec oathtool -b --totp "$secret"] spawn sudo openvpn --config $config expect "*$wait_msg*" send "$totp\r" interact Терминал открыт, ВПН работает
Гость
Aleksey

Оставить комментарий


Имя  


Комментарий *