通过服务启动OpenVPN客户端-TLS错误

时间:2018-10-12 09:14:20

标签: service vpn systemd openvpn

我想通过服务启动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

有趣的事实是,在重新启动服务后(系统启动后也立即)没有发生错误。该错误仅在首次启动服务时发生。 因此,我在sleep中使用了ExecPreStart(最长1分钟),或者在/dev/urandom中创建了更多的熵并执行了/etc/openvpn/update-resolv-conf(如您在服务中所看到的)。没有任何帮助。

这是什么原因,我该如何解决?我不想编写仅在启动后重新启动服务的脚本。

编辑/更新:

我发现只有在OpenVPN客户端被系统本身“启动”的情况下才会发生错误。我的意思是通过服务或crontab。仅当我以bash身份(以root用户身份)启动服务时,该服务才有效。

1 个答案:

答案 0 :(得分:0)

network.target之后订购服务还不足以确保互联网连接。您需要在network-online.target之后订购服务,并使其依赖于该服务:

After=network-online.target
Wants=network-online.target

有关更多信息,请参见NetworkTarget on fd.o