如何在OpenVPN成功连接后运行脚本?

如何将脚本与OpenVPN关联,以便在VPN成功连接时运行?

network-manager-openvpn不提供此类function,您必须直接使用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手册页 :

  --script-security level [方法]
              该指令提供对OpenVPN使用的策略级控制
              外部程序和脚本。 较低的等级值更多
              限制性,更高的价值更宽松。 设置
              水平:

               0  - 严格禁止调用外部程序。
               1  - (默认)仅调用内置可执行文件,如ifconfig,
               ip,route或netsh。
               2  - 允许调用内置可执行文件和用户定义的 
                脚本。
               3  - 允许通过环境将密码传递给脚本
              变量(可能不安全)。
        --up cmd
               Shell命令在TUN / TAP设备成功打开后运行(前
               --user 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身份运行。 如果您尚未指定UserGroup设置,OpenVPN也将以root身份运行脚本。

问题是:“如何将脚本与OpenVPN关联,以便在VPN成功连接时运行?” 我想指出Lekensteyn提供了一个很好的答案 。 但是,当他的答案被编写时,它在如何提供openvpn命令行参数以在ubuntu机器上启动openvpn时缺乏一点清晰度,特别是在重启后它的工作方式相同。


Ubuntu上的Openvpn命令行参数:

当然,可以从任何可用的法律选项的命令行启动openvpn。 但是,在Ubuntu机器上,如果想要在重启后使用相同的命令行参数启动openvpn,他们应该考虑编辑文件/etc/default/openvpn 。 检查以下几行:

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

来自社区openvpn手册页 --script-security

  --script-安全级别
    该指令提供了对OpenVPN外部使用的策略级控制 
    程序和脚本。 较低级别的值更具限制性,更高
    价值观更宽松。 级别设置:
 0  - 严格禁止调用外部程序。 
 1  - (默认)仅调用内置可执行文件,如ifconfig,ip,route,
或者netsh。 
 2  - 允许调用内置可执行文件和用户定义的脚本。 
 3  - 允许通过环境变量将密码传递给脚本
 (可能不安全)。

 v2.3之前的OpenVPN版本也支持方法标志,指示如何 
 OpenVPN应该调用外部命令和脚本。 这可能是execve
或系统。 从OpenVPN v2.3开始,不再接受此标志。 在大多数* nix 
在环境中使用execve()方法没有任何问题。

某些指令(如--up)允许将选项传递给外部脚本。
在这些情况下,请确保脚本名称不包含任何空格或 
配置解析器会因为无法确定脚本的位置而窒息 
名称结束和脚本选项开始。

结合 – 上的缩写部分

 --up cmd
    成功打开TUN / TAP设备后运行命令cmd(预用户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

由于这是一个相当古老的线程,我不确定是否仍然感兴趣。 如果您仍想使用NetworkManager连接到VPN,可以添加一个简单的udev规则:

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

这应该在创建VPN后运行任何脚本。

我在研究中偶然发现了解决这个问题的答案,我发现最好的解决方案是(使用openvpn服务器),如下所示:

创建要执行的脚本:

 # nano /etc/openvpn/up.sh  #!/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  

将以下行添加到openvpn配置中(通常为/etc/openvpn/server.conf )。 在上面的答案中,它被上下使用,在服务器启动(重启)时使用。 客户端连接(断开连接)时使用指令client-connect(和client-disconnect)。

 # nano /etc/openvpn/server.conf  script-security 2 client-connect /etc/openvpn/up.sh