Mar*_*rcy 5 startup centos upstart openvpn transmission
我正在尝试在运行 CentOS 6.10 最小安装的无头服务器上使用 OpenVPN 设置 Transmission,理想情况下这些将在我启动系统时启动。
\n\n我可以按照此处和此处\xe2\x80\x94 的步骤运行所有内容,但这仅在手动运行脚本(vpn.sh
,根据两个教程)时有效。该脚本如下所示:
#!/bin/sh\n\nsudo openvpn --cd /etc/openvpn --config /etc/openvpn/conf.ovpn --script-security 2 --up /etc/openvpn/up.sh\n
Run Code Online (Sandbox Code Playgroud)\n\n我可能会补充一点,除了 OpenVPN 和 Transmission 之外,我还有这个 Telegram 机器人,它应该在其他一切就绪后启动,所以我的up.sh
文件末尾还有一行,如下所示:
#!/bin/sh\n\n/etc/init.d/transmission-daemon stop\n/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json\n/etc/init.d/transmission-daemon start\n/etc/init.d/transmission-telegram start\n
Run Code Online (Sandbox Code Playgroud)\n\n理想情况下,我能够做一些类似于这篇文章概述的事情,尽管我对是否所有流量都通过 VPN 还是仅通过 Torrent 流量并不特别挑剔:
\n\n我尝试按照该帖子中概述的步骤进行操作,但由于某种原因,我无法让教程transmission-vpn-up
\xe2\x80\x94 中的脚本触发的事件发生 \ xe2\x80\x94 并且始终得到. 我无法通过遵循帖子中的步骤或将脚本的内容手动传递到命令行来发出事件。,根据 Ask Ubuntu 上的帖子,看起来像这样:route-up.sh
initctl: Event failed
route-up.sh
#! /bin/bash\n\n/sbin/initctl emit transmission-vpn-up VPN_GATEWAY=$route_vpn_gateway LOCAL_IP=$ifconfig_local\n
Run Code Online (Sandbox Code Playgroud)\n\n但是,如果我将 的内容传递down.sh
到命令行,则不会收到此类错误:
/sbin/initctl emit transmission-vpn-down\n
Run Code Online (Sandbox Code Playgroud)\n\n尝试过使用sudo
和不使用它。
有没有一种简单的方法可以让我完成这一切?我是否遗漏了一些特别是emit
关于 AU 上其他教程中指定的内容transmission-vpn-up
,你知道,因为它是针对 Ubuntu 而不是 CentOS 的教程?
或者,让vpn.sh
(本文中的第一块代码)在启动时运行会更容易吗?如果 VPN 出现故障,这会很整洁或优雅,但它会起到作用。
快速更新:
\n\n我上面提到的 Ask Ubuntu 教程,特别是在/etc/init/transmission-up.conf
尝试使用/usr/sbin/ufw
,但我在 CentOS \xe2\x80\x94 中没有,因此出现了原始Event failed
错误消息。我暂时注释掉了这些位,现在我没有任何错误消息。
然而,即使没有任何错误消息并且 VPN 已启动并运行,似乎还有其他问题发生,因为传输从未启动...有关我可以在哪里查看的任何提示吗?
\n以下是关于这个问题的一些详细方面和解决方案(注意centos 6没有使用systemd,centos在v7上切换到systemd)
启动时设置 OpenVPN:
我们可以使用systemd(实现一个服务)让openvpn在启动时启动,我们需要创建服务,启用它然后启动它。(启用该服务后,它将在开机时自动启动)
1 - 创建服务:(使用root)
cd /etc/systemd/system
touch openvpn-custom.service
chmod 644 openvpn-custom.service
Run Code Online (Sandbox Code Playgroud)
2 - 打开服务文件:(使用root)
/etc/systemd/system/openvpn-custom.service
使用您使用的文本编辑器打开示例nano openvpn-custom.service
3 - 编辑和设置服务文件:(使用root)
将以下代码粘贴并修改为/etc/systemd/system/openvpn-custom.service
[Unit]
Description=OpenVPN Custom Setup Script
After=network.target network-online.target
Wants=network-online.target
[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/full-path-to/your/vpn-script/vpn.sh
ExecStop=/full-path-to/a-scirpt/that-would-stop-openvpn/vpn-stop.sh
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
4 - 启用并启动服务:(使用root)
systemctl enable openvpn-custom.service
systemctl start openvpn-custom.service
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令检查服务的状态systemctl status openvpn-custom.service
设置启动时的传输和电报(基于 openvpn 状态):
与 openvpn 解决方案相同,创建一个包含以下代码的新服务(然后启用并启动它)
[Unit]
Description=Application Depending on OpenVPN
After=network.target network-online.target openvpn-custom.service
Wants=network-online.target openvpn-custom.service
[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/full-path-to/your/ovpn-applications.sh
ExecStop=/full-path-to/a-scirpt/that-would-stop-apps/ovpn-applications-stop.sh
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
您的 ovpn-applications.sh 看起来像这样
#!/bin/sh
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start
Run Code Online (Sandbox Code Playgroud)
After=openvpn-custom.service
并使Wants=openvpn-custom.service
该服务依赖于 openvpn,因此如果 openvpn 服务未启动或失败,其他服务将不会启动
启动时设置 OpenVPN:
1 - 创建服务:(使用root)
cd /etc/rc.d/init.d
touch openvpn-custom
chmod 755 openvpn-custom
Run Code Online (Sandbox Code Playgroud)
2 - 打开服务文件:(使用root)
/etc/rc.d/init.d/openvpn-custom
使用您使用的文本编辑器打开示例nano openvpn-custom
3 - 编辑和设置服务文件:(使用root)
#!/bin/bash
#
# chkconfig: 2345 55 45
# description: Custom openvpn script
# processname: openvpn
#
### BEGIN INIT INFO
# Provides: openvpn
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Short-Description: The openvpn daemon
# Description: The openvpn daemon custom script
### END INIT INFO
#/etc/rc.d/init.d/openvpn-custom
# Source function library.
. /etc/init.d/functions
start() {
echo -n "Starting custom openvpn... "
/full-path-to/your/vpn-script/vpn.sh
return 0
}
stop() {
echo -n "Shutting down custom openvpn... "
/full-path-to/a-scirpt/that-would-stop-openvpn/vpn-stop.sh
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
;;
restart)
stop
start
;;
reload)
;;
*)
echo "Usage: openvpn-custom {start|stop|status|reload|restart}"
exit 1
;;
esac
exit $?
Run Code Online (Sandbox Code Playgroud)
4 - 启用并启动服务:(使用root)
chkconfig openvpn-custom on
service openvpn-custom start
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令检查服务的状态service openvpn-custom status
如何确保 openvpn 仅在网络就绪时启动
初始化脚本开头的 chkconfig 定义决定了它获得的 S/K 编号。
每个“运行级别”实际上只是一个目录(/etc/rc*.d/),其中充满了初始化脚本(/etc/init.d/)的符号链接,并且这些符号链接以编号的 S 和 K 条目命名。
S表示开始,K表示终止。当 init 进入运行级别时,它从 S01 开始一直到 S99,运行每个 init 脚本来启动该脚本控制的服务。当 init 离开运行级别时,它从 K01 开始一直到 K99,运行每个脚本以停止该脚本控制的服务。
man chkconfig提供了 chkconfig 样式服务定义和 Linux 标准库 (LSB) 样式服务定义的示例。
如果 initscript 定义了两种类型,则 LSB 定义应优先于 chkconfig 定义。
如果您有一个依赖于网络连接的服务,您可以通过给它一个 10 之后的起始编号来确保您的服务在 /etc/rc*.d/S10network 之后启动,或者您可以看到 /etc/init.d/网络具有 LSB 定义Provides: $network ,因此您可以在 initscript 中使用 LSB 定义required-Start: $network 。
设置启动时的传输和电报(基于 openvpn 状态):
与 openvpn 解决方案相同,创建一个包含以下代码的新服务(然后启用并启动它)(/etc/rc.d/init.d/openvpn-apps)
#!/bin/bash
#
# chkconfig: 2345 55 45
# description: Custom openvpn-apps script
# processname: openvpn-apps
#
### BEGIN INIT INFO
# Provides: openvpn-apps
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Short-Description: The openvpn-apps daemon
# Description: The openvpn daemon custom script
### END INIT INFO
#/etc/rc.d/init.d/openvpn-apps
# Source function library.
. /etc/init.d/functions
start() {
echo -n "Starting custom openvpn... "
/full-path-to/your/apps.sh
return 0
}
stop() {
echo -n "Shutting down custom openvpn... "
/full-path-to/your/stop-apps.sh
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
;;
restart)
stop
start
;;
reload)
;;
*)
echo "Usage: openvpn-apps {start|stop|status|reload|restart}"
exit 1
;;
esac
exit $?
Run Code Online (Sandbox Code Playgroud)
你的apps.sh看起来像这样
#!/bin/sh
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start
Run Code Online (Sandbox Code Playgroud)
要使你的 apps.sh 依赖于 openvpn 状态,你可以首先延迟 apps.sh 的启动,sleep
或者编写一个 bash 循环,用 ps 检查 openvpn或检查 ping 到你的 openvn 网关(在 apps.sh 中)的结果,或者你可以只检查service openvpn-custom status
(在 apps.sh 中)的结果
故障安全 openvpn:
您可以设置一个“故障安全”,以便在 openvpn 不工作时使网络关闭,从而在 vpn 不工作时防止连接泄漏,您可以使用这个或那个解决方案
强制应用程序使用特定接口:
如果您的 openvpn 设置是对整个系统进行隧道/路由;没有必要这样做,但如果您不通过 openvpn 接口路由所有流量,您可以代理/绑定/强制您的应用程序(传输/电报)使用 vpn;在 Linux 下,有几种解决方案可以将应用程序绑定到特定接口,每种解决方案都有其优点和缺点,这个unix stackexchange 答案详细解释了大多数可用的可能性
归档时间: |
|
查看次数: |
2612 次 |
最近记录: |