将 OpenVPN 与 systemd 结合使用

将 OpenVPN 与 systemd 结合使用

好的,所以我一直在网上搜索这个问题的解决方案,但似乎没有答案对我有用。希望有人能帮助我。我只是想配置 OpenVPN 客户端。

我正在跑步CrunchBang Linux 3.2.0-4-amd64 Debian 3.2.60-1+deb7u1 x86_64 GNU/Linux,我刚刚切换到使用systemd.转换进行得很顺利,但现在我无法使用 systemd 启动我的 OpenVPN 客户端,我已经尝试按照这些配置教程进行操作,但没有任何效果。

我可以使用命令行从命令行启动隧道openvpn /etc/openvpn/vpn.conf。所以我知道配置文件很好,它与 sysvinit 一起工作得很好,所以我并不感到惊讶。然后我尝试只做一个状态,结果是:systemctl status [email protected]

$ sudo systemctl status [email protected]
  [email protected]
Loaded: error (Reason: No such file or directory)
Active: inactive (dead)

我意识到我需要对服务进行一些设置。我希望系统提示输入密码,因此我按照本指南创建了一个[email protected]in /etc/systemd/system/.但重启OpenVPN服务仍然不提示输入密码。

$ sudo service openvpn restart
[ ok ] Restarting openvpn (via systemctl): openvpn.service.

Fedora 教程介绍了创建符号链接的步骤,但在演练中不创建任何 .service 文件。

我缺少哪一块?我需要创建一个[电子邮件受保护]?如果是这样,我到底应该把它放在哪里?我觉得这不应该这么困难,但我似乎找不到任何适合我的解决方案。我很高兴提供所需的更多信息。

解决方案

-rw-r--r--  1 root root   319 Aug  7 10:42 [email protected]

[Unit]
Description=OpenVPN connection to %i
After=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/etc/openvpn

[Install]
WantedBy=multi-user.target
[email protected] (END)

符号链接:

lrwxrwxrwx  1 root root   36 Aug  7 10:47 [email protected] -> /lib/systemd/system/[email protected]

提示输入密码

现在一切正常,除了提示输入密码进行连接之外。我尝试过这个解决方案。我对上面的文件做了一些调整,并添加了一个期待脚本就像示例中一样。像魅力一样工作!我的文件如下。

修改上面的行/lib/systemd/system/[email protected]

ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --management localhost 5559 --management-query-passwords --management-forget-disconnect --config /etc/openvpn/%i.conf
ExecStartPost=/usr/bin/expect /lib/systemd/system/openvpn_pw.exp

期待剧本/lib/systemd/system/openvpn_pw.exp。确保执行以下操作:

  • chmod +x在剧本上。
  • telnet安装

期望脚本的代码:

#!/usr/bin/expect
set pass [exec /bin/systemd-ask-password "Please insert Private Key password: "]

spawn telnet 127.0.0.1 5559
expect "Enter Private Key Password:"
send "password 'Private Key' $pass\r"
expect "SUCCESS: 'Private Key' password entered, but not yet verified"
send "exit\r"
expect eof

需要注意的是,上述解决方案确实会在以下登录中记录您以明文形式输入的/var/log/syslog密码/var/log/daemon.log

答案1

我认为 Debian OpenVPN 与 systemd 的设置目前有点破损。为了让它在我的机器上工作,我必须:

  1. 创建(目录),并在其中放置一个新文件:/etc/systemd/system/[email protected]

    [单元]
    需要=networking.service
    之后=networking.service
    我把我的文件命名为local-after-ifup.conf。它需要以 结尾.conf。(这是目前有点问题的部分。)

  2. 创建一个文件/etc/tmpfiles.d(我称之为我的local-openvpn.conf)中创建一个包含以下内容的

    # 类型路径模式 UID GID 年龄参数
    d /run/openvpn 0755 根 根 - -
    这是Debian 错误 741938(已在 2.3.3-1 中修复)。

  3. 创建一个符号链接到multi-user.target.wants(最简单的方法是systemctl enable openvpn@CONF_NAME.service)例如,如果你有/etc/openvpn/foo.conf,你会使用[email protected]

  4. 如果 systemd 中还显示了 SysV 初始化脚本,请将其禁用。这是Debian 错误 700888(已在 2.3.3-1 中修复)。

注意:2.3.3-1 或更高版本尚未测试,尽管它处于不稳定状态。

答案2

这种类型的单元文件是实例化服务 - 提供更多详细信息这里

以下是openvpnCentOS 7 上的单元文件:

[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=syslog.target network.target

[Service]
PrivateTmp=true
Type=forking
PIDFile=/var/run/openvpn/%i.pid
ExecStart=/usr/sbin/openvpn --daemon --writepid /var/run/openvpn/%i.pid --cd /etc/openvpn/ --config %i.conf

[Install]
WantedBy=multi-user.target

它驻留在/usr/lib/systemd/system/openvpn@service.文件中的被替换为单位名称中的%i后面的字符串。@

当配置文件位于/etc/openvpn/myopenvpn.conf时,服务将启动:

systemctl start [email protected]

答案3

您需要通过启用来创建服务文件openvpn@<configuration>.service

例如,配置文件为/etc/openvpn/client.conf,则服务名称为[email protected]

来自拱门维基

答案4

正确的解决方案是利用 systemdsystemd-ask-password/"密码代理”,它提供了一种 systemd 内置方法来将密码/密码短语传输到服务。

你需要OpenVPN 2.3.0 或更高版本去做这个。

相关内容