Как я могу связать скрипт с OpenVPN, чтобы он запускался при успешном подключении VPN?
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 upup /etc/openvpn/up.sh
Из Справочная страница OpenVPN:
--сценарий-уровень безопасности [метод] Эта директива обеспечивает контроль на уровне политики над использованием OpenVPN внешних программ и скриптов. Значения более низкого уровня являются более ограничительными, более высокие значения являются более разрешающими. Настройки для уровня: 0 - Строго запрещен вызов внешних программ. 1 -- (по умолчанию) Вызывайте только встроенные исполняемые файлы, такие как ifconfig, ip, route или netsh. 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::1ip -6 route add 2001:db8::1:0/112 via 2001:db8::1 dev $dev
Обратите внимание, что это up
скрипт запускается от имени пользователя root. Если вы не указали User
и Group
настройка, OpenVPN будет запускать скрипты, такие как down
как корень тоже.
Поскольку это довольно старая тема, я не уверен, что она все еще представляет интерес. Если вы все еще хотите использовать NetworkManager для подключения к VPN, вы можете добавить простое правило udev, подобное этому:
KERNEL=="vpn0", RUN+="/PATH_TO_THE_SCRIPT/SCRIPT_NAME"
Это должно запустить любой скрипт после создания VPN.
Я наткнулся на ответ в своем исследовании, чтобы решить эту проблему, и я обнаружил, что лучшим решением является (использование сервера openvpn) следующее:
Создайте сценарий для выполнения:
# nano /etc/openvpn/up.sh<file:contents>#!/bin/sh# export >> /var/log/openvpn/openvpn-up.logD=`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 2client-connect /etc/openvpn/up.sh</file>
Вот конфигурация для OpenVPN, чтобы отправлять почту после успешного подключения:
-
Создайте каталог
mkdir /mailOpenVPN
-
Сделайте его доступным по всему миру
chmod 777 /mailOpenVPN
-
vim /etc/openvpn/up.sh
#! /bin/shpython3 /mailOpenVPN/sendMail.py $X509_0_CN $trusted_ip $ifconfig_pool_remote_ip
-
Сделай
up.sh
выполнимыйchmod +x /etc/openvpn/up.sh
-
Добавить в
/etc/openvpn/server.conf
script-security 2client-connect /etc/openvpn/up.sh
-
Перезапустите службу OpenVPN
service openvpn restart
-
vim /mailOpenVPN/sendMail.py
import sysimport smtplibimport datetimesmtp_user = "SENDER MAIL"smtp_pass = "PASS"recipients = "DEST MAIL"smtp_server = "smtp.gmail.com" # This is in my case, because sender is gmailtry: now = str(datetime.datetime.now()) subject = "New connection to home VPN" msg = "Hello chief,\n\n" msg += "New connection detected:\n" msg += "User: " + str(sys.argv[1]) + "\n" msg += "Public IP: " + str(sys.argv[2]) + "\n" msg += "Assigned IP: " + str(sys.argv[3]) + "\n" msg += "Timestamp: " + str(now) + "\n\n" msg += "Best regards,\n" msg += "Your humble Pi" sender = "OpenVPN Home" message = "From: OpenVPN Home\nSubject: {0}\n\n{1}".format(subject, msg) server = smtplib.SMTP_SSL(smtp_server, 465) server.ehlo() server.login(smtp_user, smtp_pass) server.sendmail(sender, recipients, message) server.close()except: pass
После выполнения нескольких предложений у меня возникла одна проблема: "--up" и "route-up" выполняются до завершения всей "Последовательности инициализации".
Что касается меня, я должен открывать порты после полной инициализации.. Поэтому я последовал за ним ниже..
#1) Создайте up.sh, который запускает скрипт открытия порта(proxyports.sh ) асинхронно
#2) Создать down.sh который закрывает порты, открытые асинхронно в proxyports.sh
up.sh содержание ...
#!/bin/bash( ( sleep 1 ; ~/proxyports.sh) & echo "Open the ports" )
прокси-порты.довольный Ш...
#!/bin/bashHOME=/home/venkatdesuPID=$(/usr/sbin/lsof -i :1080 | grep LISTEN|awk '{print $2}'|sort|uniq);if [[ ! -z "$PID" ]]; then echo "SSH Socks Process $PID running with " $(ps "$PID"); kill -9 $PID; sleep 1;fi;ssh -D 1080 -Nf iamdvr@10.0.0.94 PID=$(/usr/sbin/lsof -i :1080 | grep LISTEN|awk '{print $2}'|sort|uniq);echo "Socks running at $PID"
down.sh содержание ...
#!/bin/bashPID=$(/usr/sbin/lsof -i :1080 | grep LISTEN|awk '{print $2}'|sort|uniq);if [[ ! -z "$PID" ]]; then echo "SSH Socks Process $PID running with " $(ps "$PID"); kill -9 $PID;fi;
В случае с клиентом, я полагаю? Какое программное обеспечение вы используете? OpenVPN или оболочка (например, NetworkManager)?
@Lekensteyn, оболочка network-manger-openvpn
.