¿Cómo ejecuto un script después de que OpenVPN se haya conectado correctamente?

50

¿Cómo puedo asociar un script a OpenVPN para que se ejecute cuando la VPN se conecte correctamente?

Oxwivi
fuente
En el caso del cliente, supongo. ¿Que software estas usando? OpenVPN, o un contenedor (por ejemplo, NetworkManager)?
Lekensteyn
@Lekensteyn, envoltorio network-manger-openvpn.
Oxwivi

Respuestas:

62

network-manager-openvpnno proporciona dicha funcionalidad, debe usarla openvpndirectamente.

Pásalo --script-security 2 --up /path/to/your/scriptcuando te conectes. Si está utilizando un archivo de configuración ubicado en /etc/openvpn/, agregue las siguientes líneas a su archivo de configuración:

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

Desde la página de manual de OpenVPN :

--script-security level [método]
              Esta directiva ofrece control a nivel de políticas sobre el uso de OpenVPN
              de programas externos y scripts. Los valores de nivel inferior son más
              restrictivo, los valores más altos son más permisivos. Configuraciones para
              nivel:

              0: estrictamente sin llamadas de programas externos.
              1 - (Predeterminado) Solo llame a ejecutables integrados como ifconfig,
              ip, ruta o netsh.
              2 - Permitir llamadas de ejecutables integrados y definidos por el usuario
              guiones.
              3 - Permitir que las contraseñas pasen a los scripts a través del entorno
              variables (potencialmente inseguras).
       --up cmd
              Comando de Shell para ejecutarse después de abrir con éxito el dispositivo TUN / TAP (pre
              - cambio de UID del usuario). El script up es útil para especificar
              comandos de ruta que enrutan el tráfico IP destinado a privado
              subredes que existen en el otro extremo de la conexión VPN en
              el tunel.
Orden de ejecución del guión
       --up Ejecutado después del enlace de socket TCP / UDP y TUN / TAP abierto.
       --down Ejecutado después del cierre de TCP / UDP y TUN / TAP.

Hay más eventos para la ejecución del script, estos se pueden encontrar en la página del manual .

Crea /etc/openvpn/up.shy dale permisos de ejecución (por ejemplo, 755 o 700). Contenido de ejemplo para agregar una dirección y ruta IPv6 (mostrado con fines educativos, no lo copie directamente):

#!/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

Tenga en cuenta que este upscript se ejecuta como root. Si no ha especificado una configuración Usery Group, OpenVPN también ejecutará scripts downcomo root.

Lekensteyn
fuente
Si no sabe cómo usar openvpn directamente, agregue los detalles de su configuración actual: tipo de conexión (por ejemplo, certificados X509), puerto de puerta de enlace, compresión LZO, fuerza de TCP, uso de dispositivo de derivación, cifrado, HMAC y TLS. Mencione también su configuración de IP si no es automática. Para su privacidad, omita sus direcciones reales.
Lekensteyn
Está bien, decidí usar OpenVPN directamente (y sí, tengo el archivo .conf), pero ¿se volverá a conectar automáticamente si se pierde la conexión? ¿Y cómo hago para que se conecte automáticamente siempre que haya conexión a Internet? Y finalmente, no entendí dónde debo agregar las líneas que mencionaste en la respuesta.
Oxwivi
He ampliado la respuesta para usarla openvpndirectamente. Al configurar un servidor, noté que OpenVPN intentará volver a conectarse cuando el servidor se apagó. No estoy seguro si OpenVPN continúa intentándolo cuando su interfaz de red deja de funcionar.
Lekensteyn
Mi problema no es cuando la interfaz de red se cae; intenta volver a conectarse cuando se pierde y recupera la conexión a Internet. Solo quiero conectarme a la VPN cada vez que obtengo conexión a Internet.
Oxwivi
Ah, ¿y el script se aplica a todas las conexiones VPN? Y por favor etiqueta @Oxwivi al responder, no voy a ser notificado de otra manera.
Oxwivi
5

A la pregunta: "¿Cómo puedo asociar un script a OpenVPN para que se ejecute cuando la VPN se conecte correctamente?" Quiero señalar que Lekensteyn proporcionó una excelente respuesta . Pero, en el momento en que se compuso su respuesta, le faltaba un poco de claridad sobre cómo debían proporcionarse los argumentos de la línea de comandos de openvpn para iniciar openvpn en una máquina ubuntu, especialmente para que funcione igual después de reiniciar.


Argumentos de la línea de comandos de Openvpn en Ubuntu:

Naturalmente, uno puede iniciar openvpn desde una línea de comando con cualquier opción legal disponible. Pero, en una máquina Ubuntu, si uno quiere iniciar openvpn con los mismos argumentos de línea de comando después de un reinicio, deberían considerar editar el archivo /etc/default/openvpn. Examine las siguientes líneas:

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

Desde la página de manual de comunidad openvpn en--script-security

- nivel de seguridad de script
    Esta directiva ofrece control a nivel de políticas sobre el uso de OpenVPN de externos 
    programas y guiones. Los valores de nivel más bajo son más restrictivos, más altos
    Los valores son más permisivos. Configuraciones para el nivel:
0: estrictamente sin llamadas de programas externos. 
1 - (Predeterminado) Solo llame a ejecutables integrados como ifconfig, ip, route,
o netsh. 
2 - Permitir llamadas de ejecutables integrados y scripts definidos por el usuario. 
3 - Permitir que las contraseñas pasen a los scripts a través de variables ambientales
(potencialmente inseguro).

Las versiones de OpenVPN anteriores a la v2.3 también admitían un indicador de método que indicaba cómo 
OpenVPN debería llamar a comandos y scripts externos. Esto podría ser execve
o sistema. A partir de OpenVPN v2.3, este indicador ya no se acepta. En la mayoría * nix
entornos el enfoque execve () se ha utilizado sin problemas.

Algunas directivas como --up permiten que se pasen opciones al script externo.
En estos casos, asegúrese de que el nombre del script no contenga espacios o 
el analizador de configuración se ahogará porque no puede determinar dónde está el script 
el nombre termina y comienzan las opciones de script.

Combinado con una sección abreviada en --up

--up cmd
    Ejecute el comando cmd después de abrir con éxito el dispositivo TUN / TAP (cambio de UID previo al usuario).
    cmd consiste en una ruta al script (o programa ejecutable), seguido opcionalmente
    por argumentos. La ruta y los argumentos pueden estar entre comillas simples o dobles y / o
    escapó usando una barra diagonal inversa, y debe estar separado por uno o más espacios.

Ejemplo:

En mi máquina con un servidor openpvn.conf, tengo las siguientes líneas en mi /etc/default/openvpnarchivo:

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

Por cierto, nat.sh configura la traducción de direcciones de red para enrutar el tráfico de red privada desde clientes openvpn a Internet público; lo cual es bueno para cuando uno no confía en un punto de acceso WIFI público.


Además de permitir reiniciar como se esperaba después de un reinicio, cuando /etc/openvpn/[client or server].confy los /etc/default/openvpnarchivos están configurados correctamente, openvpn se puede iniciar o detener con:

sudo service openvpn start
sudo service openvpn stop

Otras opciones útiles disponibles para service openvpnincluir cond-restart,force-reload,reload, restart,soft-restart, start, status, stop.

Keith Reynolds
fuente
3

Como ese es un hilo bastante antiguo, no estoy seguro si aún es de interés. Si aún desea utilizar el NetworkManager para conectarse a una VPN, puede agregar una regla udev simple como esta:

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

Esto debería ejecutar cualquier script después de crear la VPN.

Thomas
fuente
1

Me encontré con la respuesta en mi investigación para resolver este problema y descubrí que la mejor solución es (usando el servidor openvpn) de la siguiente manera:

Crea un script para ejecutar:

# 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>

Agregue las siguientes líneas en la configuración de openvpn (generalmente /etc/openvpn/server.conf). En la respuesta anterior, se usó arriba y abajo, que se usan cuando se inicia el servidor (se reinicia). La directiva cliente-conectar (y cliente-desconectar) se utilizan cuando el cliente se conecta (desconecta).

# nano /etc/openvpn/server.conf
<file:add>
script-security 2
client-connect /etc/openvpn/up.sh
</file>
CozC
fuente
¿Cómo incluiría el nombre de configuración del cliente en el archivo de registro?
calisto