【发布时间】:2018-10-12 09:14:20
【问题描述】:
我想通过服务启动 OpenVPN 客户端。于是我写了这个服务(位于/etc/systemd/system/):
[Unit]
Description=...
After=network.target
[Service]
Type=simple
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/client.conf
ExecPreStart=/usr/sbin/rngd /dev/urandom
ExecPreStart=/etc/openvpn/update-resolv-conf
[Install]
WantedBy=multi-user.target
我的client.conf 看起来像这样:
client
dev-tun
remote ...
proto udp
resolv-retry infinite
persist-tun
persist-key
# Cert files config...
# Cypher and auth config ...
现在我遇到了服务启动 OpenVPN 时出现错误的问题:
TLS Error: TLS key negotiation failed to oocur within 60 seconds (check your network connectivity)
TLS Error: TLS handshake failed
SIGUSR1[soft,tls-error] received, process restarting
有趣的事实是,在我重新启动服务后(也立即在系统启动后),错误不会发生。该错误仅在首次启动服务时发生。
所以我在ExecPreStart 中尝试了sleep(最多1 分钟),或者在/dev/urandom 中创建更多熵并执行/etc/openvpn/update-resolv-conf(如您在服务中看到的那样)。没有任何帮助。
这是什么原因,我该如何解决?我不想写一个只在启动后重启一次服务的脚本。
编辑/更新:
我发现只有当 OpenVPN 客户端由系统本身“启动”时才会发生错误。我的意思是服务或 crontab。只有当我自己(作为root 用户)在 bash 中启动服务时,它才能工作。
【问题讨论】:
-
我不确定它是否与您的问题有关,但该指令称为
ExecStartPre=,而不是ExecPreStart=。
标签: service vpn systemd openvpn