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


50

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


对于客户,我猜呢?您正在使用什么软件?OpenVPN还是包装器(例如NetworkManager)?
Lekensteyn 2011年

@Lekensteyn,包装器network-manger-openvpn
Oxwivi'3

Answers:


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手册页

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

              0-完全不调用外部程序。
              1-(默认)仅调用内置可执行文件,例如ifconfig,
              ip,路由或netsh。
              2-允许调用内置可执行文件和用户定义的
              脚本。
              3-允许将密码通过环境传递到脚本
              变量(可能不安全)。
       --up cmd
              成功打开TUN / TAP设备后运行Shell命令
              --user UID更改)。up脚本对于指定
              用于路由发往专用IP流量的route命令
              存在于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也将以downroot用户身份运行脚本。


如果您不知道如何直接使用openvpn,请添加当前的配置详细信息:连接类型(例如X509证书),网关端口,LZO压缩,TCP强制,使用分接设备,密码,HMAC和TLS。如果IP设置不是自动的,也请提及。为了您的隐私,请忽略您的实际地址。
Lekensteyn'3

好的,我决定直接使用OpenVPN(是的,我确实有.conf文件),但是如果连接断开,它将自动重新连接吗?以及如何在有互联网连接时自动将其连接?最后,我不明白我必须在答案中提到的行中添加哪些内容。
Oxwivi 2011年

我扩大了答案以openvpn直接使用。设置服务器时,我注意到OpenVPN将在服务器关闭时尝试重新连接。不确定网络接口出现故障时OpenVPN是否继续尝试。
Lekensteyn 2011年

我的问题不是网络接口何时出现故障-当互联网连接丢失并重新获得时,它确实尝试重新连接。只要有互联网连接,我就只想连接到VPN。
Oxwivi 2011年

哦,该脚本适用于所有VPN连接吗?并且在回复时标记@Oxwivi,否则我将不会收到通知。
Oxwivi 2011年

5

问一个问题:“如何将脚本与OpenVPN关联,以便在成功连接VPN后运行脚本?” 我想指出,莱肯斯坦提供了一个很好的答案。但是,在撰写他的答案时,它在应如何提供openvpn命令行参数以在ubuntu机器上启动openvpn方面尚不清楚,尤其是在重启后其工作方式相同。


Ubuntu上的Openvpn命令行参数:

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

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

社区openvpn手册页--script-security

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

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

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

结合有关的缩写部分 --up

--up cmd
    成功打开TUN / TAP设备(更改--UID之前)后,运行cmd命令。
    cmd由脚本(或可执行程序)的路径组成,可以选择遵循
    通过争论。路径和参数可以被单引号或双引号和/或
    使用反斜杠转义,并且应以一个或多个空格分隔。

例:

在带有openpvn server.conf的计算机上,/etc/default/openvpn文件中包含以下几行:

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

顺便说一句,nat.sh设置了网络地址转换,以将专用网络流量从openvpn客户端路由到公共Internet。当不信任公共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)。在上面的答案中,它是上下使用的,这是在服务器启动(重新启动)时使用的。客户端连接(断开连接)时使用指令客户端连接(和客户端断开连接)。

# nano /etc/openvpn/server.conf
<file:add>
script-security 2
client-connect /etc/openvpn/up.sh
</file>

您如何在日志文件中包括客户端配置名称?
callisto
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.