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

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

如何将脚本与 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 身份运行。如果您未指定UserGroup设置,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 的配置,以便在连接成功后发送邮件:

  1. 创建目录

    mkdir /mailOpenVPN
    
  2. 让全世界都可以访问

    chmod 777 /mailOpenVPN
    
  3. vim /etc/openvpn/up.sh

    #! /bin/sh
    python3 /mailOpenVPN/sendMail.py $X509_0_CN $trusted_ip $ifconfig_pool_remote_ip
    
  4. 使up.sh可执行文件

    chmod +x /etc/openvpn/up.sh
    
  5. 加入/etc/openvpn/server.conf

    script-security 2
    client-connect /etc/openvpn/up.sh
    
  6. 重新启动 OpenVPN 服务

    service openvpn restart
    
  7. 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
    

相关内容