如何将脚本与 OpenVPN 关联,以便它在 VPN 连接成功时运行?
答案1
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、route 或 netsh。 2——允许调用内置可执行文件和用户定义的 脚本。 3——允许通过环境将密码传递给脚本 变量(可能不安全)。 --up 命令 TUN/TAP 设备成功打开后运行的 Shell 命令(预 --用户 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
设置,OpenVPNdown
也将以 root 身份运行脚本。
答案2
由于这是一个相当老的线程,我不确定是否仍然有趣。如果您仍想使用 NetworkManager 连接到 VPN,您可以添加一个简单的 udev 规则,如下所示:
KERNEL=="vpn0", RUN+="/PATH_TO_THE_SCRIPT/SCRIPT_NAME"
这应该在创建 VPN 后运行任何脚本。
答案3
对于这个问题:“如何将脚本与 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——允许通过环境变量将密码传递给脚本 (可能不安全)。 OpenVPN v2.3 之前的版本还支持方法标志,用于指示 OpenVPN 应该调用外部命令和脚本。这可以是 execve 或系统。从 OpenVPN v2.3 开始,此标志不再被接受。在大多数 *nix 中 环境中使用 execve() 方法没有任何问题。 一些指令(例如 --up)允许将选项传递给外部脚本。 在这些情况下,请确保脚本名称不包含任何空格或 配置解析器将因无法确定脚本的位置而阻塞 名称结束并且脚本选项开始。
结合简短部分--up
--up 命令 TUN/TAP 设备成功打开后(预先更改用户 UID)运行命令 cmd。 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
。
答案4
以下是 OpenVPN 的配置,以便在连接成功后发送邮件:
创建目录
mkdir /mailOpenVPN
让全世界都可以访问
chmod 777 /mailOpenVPN
vim /etc/openvpn/up.sh
#! /bin/sh python3 /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 2 client-connect /etc/openvpn/up.sh
重新启动 OpenVPN 服务
service openvpn restart
vim /mailOpenVPN/sendMail.py
import sys import smtplib import datetime smtp_user = "SENDER MAIL" smtp_pass = "PASS" recipients = "DEST MAIL" smtp_server = "smtp.gmail.com" # This is in my case, because sender is gmail try: 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