Как запустить скрипт после успешного подключения OpenVPN?

50

Как я могу связать скрипт с OpenVPN, чтобы он работал при успешном подключении VPN?

Oxwivi
источник
В случае с клиентом, я думаю? Какое программное обеспечение вы используете? OpenVPN или оболочка (например, NetworkManager)?
Лекенштейн
@Lekensteyn, фантик network-manger-openvpn.
Oxwivi

Ответы:

62

network-manager-openvpnне предоставляет такой функциональности, вы должны использовать openvpnнапрямую.

Перейдите --script-security 2 --up /path/to/your/scriptк нему при подключении. Если вы используете файл конфигурации, расположенный по адресу /etc/openvpn/, добавьте следующие строки в ваш файл конфигурации:

script-security 2
# run /etc/openvpn/up.sh when the connection is set up
up /etc/openvpn/up.sh

Из справочной страницы OpenVPN :

- уровень безопасности сценария [метод]
              Эта директива предлагает контроль на уровне политики за использованием OpenVPN
              внешних программ и скриптов. Более низкие значения больше
              ограничительные, более высокие значения более допустимы. Настройки для
              уровень:

              0 - строго не вызывать внешние программы.
              1 - (по умолчанию) вызывать только встроенные исполняемые файлы, такие как ifconfig,
              IP, маршрут или нетш.
              2 - Разрешить вызов встроенных исполняемых файлов и пользовательских
              скрипты.
              3 - Разрешить передачу паролей в сценарии через среду
              переменные (потенциально небезопасные).
       --up cmd
              Команда оболочки для запуска после успешного открытия устройства TUN / TAP (предварительно
              - изменение UID пользователя). Скрипт up полезен для определения
              Команды маршрутизации, которые маршрутизируют IP-трафик, предназначенный для частного
              подсети, которые существуют на другом конце соединения VPN в
              туннель
Сценарий Порядок исполнения
       --up Выполняется после привязки сокета TCP / UDP и открытия TUN / TAP.
       --down Выполняется после закрытия TCP / UDP и TUN / TAP.

Есть еще события для выполнения скрипта, их можно найти на странице руководства .

Создайте /etc/openvpn/up.shи дайте ему разрешения на выполнение (скажем, 755 или 700). Пример содержимого для добавления адреса IPv6 и маршрута (показан в образовательных целях, не копируйте его напрямую):

#!/bin/sh
# add an IPv6 address to device $dev (environment variable)
ip -6 addr add 2001:db8::1:2/112 dev $dev
# and the IPv6 route for this net using gateway 2001:db8::1
ip -6 route add 2001:db8::1:0/112 via 2001:db8::1 dev $dev

Обратите внимание, что этот upскрипт запускается от имени пользователя root. Если вы не указали параметр a Userи Group, OpenVPN также будет запускать сценарии, такие downкак root.

Lekensteyn
источник
Если вы не знаете, как использовать openvpn напрямую, добавьте свои текущие сведения о конфигурации: тип соединения (например, сертификаты X509), порт шлюза, LZO-сжатие, принудительное использование TCP, использование устройства-ответчика, шифра, HMAC и TLS. Укажите свои настройки IP тоже, если они не автоматические. Для вашей конфиденциальности, оставьте свои фактические адреса.
Лекенштейн
Хорошо, я решил использовать OpenVPN напрямую (и да, у меня есть файл .conf), но будет ли он автоматически переподключен, если соединение потеряно? И как мне сделать так, чтобы он автоматически подключался при подключении к интернету? И, наконец, я не понял, где я должен добавить строки, которые вы упомянули в ответе.
Oxwivi
Я расширил ответ для openvpnнепосредственного использования . При настройке сервера я заметил, что OpenVPN попытается переподключиться, когда сервер вышел из строя. Не уверен, что OpenVPN продолжает попытки, когда ваш сетевой интерфейс выходит из строя.
Лекенштейн
Моя проблема не в том, когда сетевой интерфейс выходит из строя - он пытается восстановить соединение, когда интернет-соединение потеряно и восстановлено. Я просто хочу подключиться к VPN, когда я получаю подключение к Интернету.
Oxwivi
О, а скрипт распространяется на все VPN соединения? И, пожалуйста, пометьте @Oxwivi при ответе, иначе я не получу уведомление.
Oxwivi
5

На вопрос: «Как я могу связать скрипт с OpenVPN, чтобы он работал при успешном подключении VPN?» Хочу отметить, что Лекенштейн дал отличный ответ . Но в то время, когда его ответ был составлен, ему не хватало некоторой ясности относительно того, как должны предоставляться аргументы командной строки openvpn для запуска openvpn на машине с Ubuntu, особенно для того, чтобы он работал так же после перезагрузок.


Аргументы командной строки Openvpn в Ubuntu:

Естественно, можно запустить openvpn из командной строки с любыми доступными легальными опциями. Но на машине с Ubuntu, если кто-то хочет запустить openvpn с теми же аргументами командной строки после перезагрузки, ему следует рассмотреть возможность редактирования файла /etc/default/openvpn. Изучите следующие строки:

# Optional arguments to openvpn's command line
OPTARGS="" 

От человека странице сообщества OpenVPN на--script-security

- уровень безопасности сценария
    Эта директива предлагает контроль на уровне политики над использованием OpenVPN внешних 
    программы и скрипты. Более низкие значения являются более строгими, более высокими
    значения более допустимы. Настройки для уровня:
0 - строго не вызывать внешние программы. 
1 - (по умолчанию) вызывать только встроенные исполняемые файлы, такие как ifconfig, ip, route,
или нетш. 
2 - Разрешить вызов встроенных исполняемых файлов и пользовательских скриптов. 
3 - Разрешить передачу паролей в сценарии через переменные среды
(потенциально небезопасно).

Выпуски OpenVPN до v2.3 также поддерживали флаг метода, который указывал, как 
OpenVPN должен вызывать внешние команды и скрипты. Это может быть либо execve
или система. Начиная с OpenVPN v2.3 этот флаг больше не принимается. В большинстве * никс
В средах подход execve () был использован без каких-либо проблем.

Некоторые директивы, такие как --up, позволяют передавать параметры во внешний скрипт.
В этих случаях убедитесь, что имя скрипта не содержит пробелов или 
анализатор конфигурации захлебнется, потому что не может определить, где находится скрипт 
имя заканчивается и начинаются параметры скрипта.

В сочетании с сокращенным разделом --up

--up cmd
    Запустите команду cmd после успешного открытия устройства TUN / TAP (изменение UID до пользователя).
    cmd состоит из пути к сценарию (или исполняемой программе), по желанию
    по аргументам. Путь и аргументы могут быть в одинарных или двойных кавычках и / или
    экранируется с помощью обратной косой черты и должен быть разделен одним или несколькими пробелами.

Пример:

На моей машине с openpvn server.conf в моем /etc/default/openvpnфайле есть следующие строки :

OPTARGS="
    --script-security 2
    --up /etc/openvpn/nat.sh
" 

Кстати, nat.sh устанавливает трансляцию сетевых адресов для маршрутизации трафика частной сети от клиентов openvpn к общедоступному Интернету; что хорошо, когда человек не доверяет общедоступной точке доступа WIFI.


Помимо возможности перезагрузки, как и ожидалось, после перезагрузки, когда /etc/openvpn/[client or server].confи /etc/default/openvpnфайлы правильно настроены, openvpn можно запустить или остановить с помощью:

sudo service openvpn start
sudo service openvpn stop

Другие полезные опции доступны для service openvpnвключения cond-restart,force-reload,reload, restart,soft-restart, start, status, stop.

Кит Рейнольдс
источник
3

Поскольку это довольно старая тема, я не уверен, что все еще интересен. Если вы все еще хотите использовать NetworkManager для подключения к VPN, вы можете добавить простое правило udev:

KERNEL=="vpn0", RUN+="/PATH_TO_THE_SCRIPT/SCRIPT_NAME"

Это должно запустить любой сценарий после создания VPN.

Томас
источник
1

Я наткнулся на ответ в своем исследовании, чтобы решить эту проблему, и я обнаружил, что лучшее решение (с использованием сервера openvpn) заключается в следующем:

Создайте скрипт для выполнения:

# nano /etc/openvpn/up.sh
<file:contents>
#!/bin/sh

# export >> /var/log/openvpn/openvpn-up.log
D=`date "+%Y-%m-%d %H:%M"`
echo "[$D] ($local_port_1:$proto_1) $X509_0_CN: $trusted_ip => $ifconfig_pool_remote_ip" >> /var/log/openvpn/openvpn-up.log
</file>

Добавьте следующие строки в конфигурацию openvpn (обычно /etc/openvpn/server.conf). В ответе выше он использовался вверх и вниз, которые используются при запуске (перезапуске) сервера. Директива client-connect (и client-disconnect) используется, когда клиент подключается (отключается).

# nano /etc/openvpn/server.conf
<file:add>
script-security 2
client-connect /etc/openvpn/up.sh
</file>
CozC
источник
Как бы вы включили имя конфигурации клиента в файл журнала?
Каллисто