如何将脚本与OpenVPN关联,以便在VPN成功连接时运行?
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
脚本执行有更多的事件,可以在手册页面中找到。
创建/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 用户身份运行像 down
这样的脚本。openvpn
。在设置服务器时,我注意到当服务器宕机时,OpenVPN会尝试重新连接。不确定当你的网络接口断开时,OpenVPN是否会继续尝试连接。 - Lekensteynsudo ip route add <server-ip>/32 via <local-gateway> dev <device>
。<local-gateway>
是本地网关的IP地址,例如192.168.1.1
。<device>
是你的网卡,例如eth0
或wlan0
。 - Lekensteyn/etc/openvpn/up.sh
脚本,不是的。它只适用于在/etc/openvpn/client.conf
中定义的VPN。其他VPN(例如/etc/openvpn/company.conf
)不受影响。 - Lekensteynup
指定一个脚本(在建立连接后运行)。 - Lekensteynman openvpn
。我在我的回答中添加了更多细节。 - Lekensteynup
还是 down
? - Oxwivi启动
。 - Lekensteynauth-user-pass /etc/openvpn/credentials.txt
,并创建/etc/openvpn/credentials.txt
文件,其中第一行为用户名,第二行为密码。(我之前不知道这个,是在手册中看到的 :) ) - Lekensteynup
,我根本无法使其工作,它显示脚本无法执行外部程序或类似的错误信息。 - Oxwivichmod +x script
。请注意,除了0以外的退出代码表示失败。 - Lekensteyndown
函数。手册中描述了这些事件的顺序。 - Lekensteyn当然,可以使用任何可用的合法选项从命令行启动openvpn。但是,在Ubuntu机器上,如果想在重启后使用相同的命令行参数启动openvpn,应考虑编辑文件/etc/default/openvpn
。请查看以下行:
# Optional arguments to openvpn's command line
OPTARGS=""
--script-security
指令结合关于--up
的简化部分
--up cmd 在成功打开TUN/TAP设备(在--user UID更改之前)后运行命令cmd。 cmd由脚本(或可执行程序)的路径组成,可选择跟随参数。 路径和参数可以用单引号、双引号和/或反斜杠进行转义,并且应该用一个或多个空格分隔。
在我的机器上,使用openpvn server.conf配置文件,在我的/etc/default/openvpn
文件中有以下行:
OPTARGS="
--script-security 2
--up /etc/openvpn/nat.sh
"
/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
。# 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>
/etc/openvpn/server.conf
)。在上面的答案中使用了up和down,这些是在服务器启动(重新启动)时使用的。指令client-connect(和client-disconnect)用于客户端连接(断开连接)时使用。# nano /etc/openvpn/server.conf
<file:add>
script-security 2
client-connect /etc/openvpn/up.sh
</file>
创建一个目录
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" # 这是我的情况,因为发件人是 Gmail
try:
now = str(datetime.datetime.now())
subject = "家庭 VPN 的新连接"
msg = "您好,主管:\n\n"
msg += "检测到新的连接:\n"
msg += "用户:" + str(sys.argv[1]) + "\n"
msg += "公共 IP:" + str(sys.argv[2]) + "\n"
msg += "分配的 IP:" + str(sys.argv[3]) + "\n"
msg += "时间戳:" + str(now) + "\n\n"
msg += "此致敬礼,\n"
msg += "您的谦卑 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
#!/bin/bash
( ( sleep 1 ; ~/proxyports.sh) & echo "Open the ports" )
proxyports.sh内容...
#!/bin/bash
HOME=/home/venkatdesu
PID=$(/usr/sbin/lsof -i :1080 | grep LISTEN|awk '{print $2}'|sort|uniq);
if [[ ! -z "$PID" ]]; then
echo "SSH Socks Process $PID running with " $(ps "$PID");
kill -9 $PID;
sleep 1;
fi;
ssh -D 1080 -Nf iamdvr@10.0.0.94
PID=$(/usr/sbin/lsof -i :1080 | grep LISTEN|awk '{print $2}'|sort|uniq);
echo "Socks running at $PID"
下降.sh内容...
#!/bin/bash
PID=$(/usr/sbin/lsof -i :1080 | grep LISTEN|awk '{print $2}'|sort|uniq);
if [[ ! -z "$PID" ]]; then
echo "SSH Socks Process $PID running with " $(ps "$PID");
kill -9 $PID;
fi;
network-manager-openvpn
不支持--up
和--down
脚本。这在2011年是事实,可悲的是在2023年仍然如此。当我尝试配置处理推送的DNS服务器时,这对我来说是一个阻碍。
network-manager-openvpn
。 - Oxwivi