如何在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身份运行。 如果您尚未指定User
和Group
设置,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